howl 0.4.1 → 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- data/VERSION +1 -1
- data/howl.gemspec +15 -1
- data/lib/howl/core_ext.rb +14 -0
- data/lib/howl/post.rb +7 -1
- data/lib/howl/site.rb +17 -3
- data/lib/howl/template.rb +19 -4
- data/lib/howl/view.rb +10 -0
- data/test/fixtures/config.yml +2 -0
- data/test/howl_test.rb +4 -0
- data/test/integration_site/config.yml +2 -0
- data/test/integration_site/generated/images/logo.png +0 -0
- data/test/integration_site/generated/index.html +44 -0
- data/test/integration_site/generated/posts/2010/10/17/post.html +44 -0
- data/test/integration_site/generated/stylesheets/screen.css +60 -0
- data/test/integration_site/posts/post.md +12 -0
- data/test/integration_site/site/images/logo.png +0 -0
- data/test/integration_site/site/index.html +14 -0
- data/test/integration_site/site/stylesheets/screen.css +60 -0
- data/test/integration_site/templates/post.html +12 -0
- data/test/integration_site/templates/site.html +27 -0
- data/test/integration_test.rb +10 -0
- metadata +17 -3
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.5.0
|
data/howl.gemspec
CHANGED
@@ -5,7 +5,7 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{howl}
|
8
|
-
s.version = "0.
|
8
|
+
s.version = "0.5.0"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Clinton R. Nixon"]
|
@@ -41,6 +41,7 @@ Gem::Specification.new do |s|
|
|
41
41
|
"sample_site/site/index.html",
|
42
42
|
"sample_site/templates/default.html",
|
43
43
|
"sample_site/templates/site.html",
|
44
|
+
"test/fixtures/config.yml",
|
44
45
|
"test/fixtures/posts/first_post.html",
|
45
46
|
"test/fixtures/posts/markdown_post.md",
|
46
47
|
"test/fixtures/posts/no_date.html",
|
@@ -55,6 +56,18 @@ Gem::Specification.new do |s|
|
|
55
56
|
"test/fixtures/templates/post.html",
|
56
57
|
"test/fixtures/templates/site.html",
|
57
58
|
"test/howl_test.rb",
|
59
|
+
"test/integration_site/config.yml",
|
60
|
+
"test/integration_site/generated/images/logo.png",
|
61
|
+
"test/integration_site/generated/index.html",
|
62
|
+
"test/integration_site/generated/posts/2010/10/17/post.html",
|
63
|
+
"test/integration_site/generated/stylesheets/screen.css",
|
64
|
+
"test/integration_site/posts/post.md",
|
65
|
+
"test/integration_site/site/images/logo.png",
|
66
|
+
"test/integration_site/site/index.html",
|
67
|
+
"test/integration_site/site/stylesheets/screen.css",
|
68
|
+
"test/integration_site/templates/post.html",
|
69
|
+
"test/integration_site/templates/site.html",
|
70
|
+
"test/integration_test.rb",
|
58
71
|
"test/teststrap.rb"
|
59
72
|
]
|
60
73
|
s.homepage = %q{http://github.com/crnixon/howl}
|
@@ -64,6 +77,7 @@ Gem::Specification.new do |s|
|
|
64
77
|
s.summary = %q{A tiny static website/blog generator.}
|
65
78
|
s.test_files = [
|
66
79
|
"test/howl_test.rb",
|
80
|
+
"test/integration_test.rb",
|
67
81
|
"test/teststrap.rb"
|
68
82
|
]
|
69
83
|
|
data/lib/howl/core_ext.rb
CHANGED
data/lib/howl/post.rb
CHANGED
@@ -3,7 +3,7 @@ module Howl
|
|
3
3
|
include Comparable
|
4
4
|
|
5
5
|
def date
|
6
|
-
view.date? ? Time.parse(view.date) : File.mtime(path)
|
6
|
+
view.date? ? Time.parse(view.date.to_s) : File.mtime(path)
|
7
7
|
end
|
8
8
|
|
9
9
|
def <=>(other)
|
@@ -31,5 +31,11 @@ module Howl
|
|
31
31
|
render_view.delete('template')
|
32
32
|
converter.convert(Mustache.render(@content, render_view))
|
33
33
|
end
|
34
|
+
|
35
|
+
def view_data
|
36
|
+
{ :site => site,
|
37
|
+
:date => date,
|
38
|
+
:link => link }
|
39
|
+
end
|
34
40
|
end
|
35
41
|
end
|
data/lib/howl/site.rb
CHANGED
@@ -1,9 +1,10 @@
|
|
1
1
|
module Howl
|
2
2
|
class Site
|
3
|
-
attr_accessor :root
|
3
|
+
attr_accessor :root, :view
|
4
4
|
|
5
5
|
def initialize(root)
|
6
6
|
@root = Pathname.new(root)
|
7
|
+
load_config
|
7
8
|
end
|
8
9
|
|
9
10
|
def path(path)
|
@@ -45,10 +46,23 @@ module Howl
|
|
45
46
|
FileUtils.rm_r(output_path) if File.exist?(output_path)
|
46
47
|
(pages + posts).each do |page|
|
47
48
|
FileUtils.makedirs(page.output_path.dirname)
|
48
|
-
|
49
|
-
|
49
|
+
|
50
|
+
if page.path.binary?
|
51
|
+
FileUtils.copy(page.path, page.output_path)
|
52
|
+
else
|
53
|
+
page.output_path.open("w") do |fh|
|
54
|
+
fh.write page.render
|
55
|
+
end
|
50
56
|
end
|
51
57
|
end
|
52
58
|
end
|
59
|
+
|
60
|
+
private
|
61
|
+
|
62
|
+
def load_config
|
63
|
+
view = YAML.load(File.read(path "config.yml")) if path("config.yml").exist?
|
64
|
+
view = {} unless view.is_a?(Hash)
|
65
|
+
@view = View.new(view)
|
66
|
+
end
|
53
67
|
end
|
54
68
|
end
|
data/lib/howl/template.rb
CHANGED
@@ -1,12 +1,20 @@
|
|
1
1
|
module Howl
|
2
2
|
class Template
|
3
|
+
def self.viewables
|
4
|
+
@viewables ||= []
|
5
|
+
end
|
6
|
+
|
7
|
+
def self.can_view(*viewables)
|
8
|
+
viewables.push(*viewables)
|
9
|
+
end
|
10
|
+
|
3
11
|
attr_accessor :view, :content, :site, :path, :extension
|
4
12
|
|
5
13
|
def initialize(path, site)
|
6
14
|
@site = site
|
7
15
|
@path = Pathname.new(path)
|
8
16
|
@extension = @path.extname
|
9
|
-
load_file
|
17
|
+
load_file unless @path.binary?
|
10
18
|
end
|
11
19
|
|
12
20
|
def ==(other)
|
@@ -30,14 +38,16 @@ module Howl
|
|
30
38
|
@converter
|
31
39
|
end
|
32
40
|
|
33
|
-
def render(render_view =
|
41
|
+
def render(render_view = nil)
|
42
|
+
render_view ||= site.view
|
43
|
+
render_view = render_view.dup
|
34
44
|
render_view.merge!(@view)
|
35
45
|
rendered = converter.convert(Mustache.render(@content, render_view))
|
36
46
|
template_name = render_view.delete("template")
|
37
47
|
|
38
48
|
if template_name
|
39
49
|
template = find_template(template_name)
|
40
|
-
if template
|
50
|
+
if template && template != self
|
41
51
|
rendered = template.render(
|
42
52
|
render_view.merge("content" => rendered))
|
43
53
|
else
|
@@ -57,6 +67,10 @@ module Howl
|
|
57
67
|
@site.templates[template_name + converter.extension]
|
58
68
|
end
|
59
69
|
|
70
|
+
def view_data
|
71
|
+
{ :site => site }
|
72
|
+
end
|
73
|
+
|
60
74
|
def load_file
|
61
75
|
content = @path.read
|
62
76
|
view, content = content.split("\n\n", 2)
|
@@ -69,7 +83,8 @@ module Howl
|
|
69
83
|
view = {}
|
70
84
|
end
|
71
85
|
|
72
|
-
@view = View.new(view
|
86
|
+
@view = View.new(view)
|
87
|
+
@view.merge!(view_data)
|
73
88
|
end
|
74
89
|
|
75
90
|
def test_for_yaml(view)
|
data/lib/howl/view.rb
CHANGED
@@ -15,5 +15,15 @@ module Howl
|
|
15
15
|
site.posts
|
16
16
|
end
|
17
17
|
end
|
18
|
+
|
19
|
+
# filters
|
20
|
+
|
21
|
+
def format_date
|
22
|
+
lambda do |text|
|
23
|
+
time = Time.parse(text.to_s)
|
24
|
+
time_format = self.date_format || "%b %-d, %Y at %-I:%M %P"
|
25
|
+
time.strftime(time_format)
|
26
|
+
end
|
27
|
+
end
|
18
28
|
end
|
19
29
|
end
|
data/test/howl_test.rb
CHANGED
@@ -8,6 +8,10 @@ context "Site" do
|
|
8
8
|
topic.pages == Dir[fixture_path("site/**/*.*")].map { |path| Page.new(path, topic) }
|
9
9
|
}
|
10
10
|
|
11
|
+
should("read its config") {
|
12
|
+
topic.view.has_key?(:title)
|
13
|
+
}
|
14
|
+
|
11
15
|
should("write out all pages") {
|
12
16
|
topic.write_to_disk
|
13
17
|
topic.pages.map { |page|
|
Binary file
|
@@ -0,0 +1,44 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html>
|
3
|
+
<head>
|
4
|
+
<meta charset="utf-8" />
|
5
|
+
<title>dce.gitwrite.com</title>
|
6
|
+
<link rel="stylesheet" href="/stylesheets/screen.css" type="text/css" />
|
7
|
+
<!--[if IE]>
|
8
|
+
<script src="http://html5shiv.googlecode.com/svn/trunk/html5.js"></script>
|
9
|
+
<![endif]-->
|
10
|
+
</head>
|
11
|
+
|
12
|
+
<body>
|
13
|
+
<div id="container">
|
14
|
+
<div id="header">
|
15
|
+
<h1><a href="http://dce.gitwrite.com">dce.gitwrite.com</a></h1>
|
16
|
+
</div>
|
17
|
+
|
18
|
+
<div id="content">
|
19
|
+
<div class="post">
|
20
|
+
<h2>
|
21
|
+
<a href="/posts/2010/10/17/post.html">Welcome to GitWrite</a>
|
22
|
+
</h2>
|
23
|
+
<span class="meta sidebar">
|
24
|
+
Oct 17, 2010 at 1:24 pm<br />
|
25
|
+
</span>
|
26
|
+
<p>Thank you for trying out GitWrite. Your blog lives in a repository at</p>
|
27
|
+
|
28
|
+
<blockquote><p><code>git://gitwrite.com/blogs/dce.git</code></p></blockquote>
|
29
|
+
|
30
|
+
<p>Pull it down (with <code>git checkout</code>), make some updates, and push it back.
|
31
|
+
In a few moments, your blog will be regenerated to include your new content. Of
|
32
|
+
course, you can always make edits through our <a href="http://gitwrite.com/site">web interface</a>, as well.</p>
|
33
|
+
|
34
|
+
<p class="meta"><a href="/posts/2010/10/17/post.html">Permalink</a></p>
|
35
|
+
</div>
|
36
|
+
|
37
|
+
</div>
|
38
|
+
|
39
|
+
<div id="footer" class="meta">
|
40
|
+
Powered by <a href="http://gitwrite.com" class="image-link"><img src="/images/logo.png" width="100"/></a> ¶ Theme inspired by <a href="http://www.tumblr.com/theme/325">langer</a>
|
41
|
+
</div>
|
42
|
+
</div>
|
43
|
+
</body>
|
44
|
+
</html>
|
@@ -0,0 +1,44 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html>
|
3
|
+
<head>
|
4
|
+
<meta charset="utf-8" />
|
5
|
+
<title>dce.gitwrite.com</title>
|
6
|
+
<link rel="stylesheet" href="/stylesheets/screen.css" type="text/css" />
|
7
|
+
<!--[if IE]>
|
8
|
+
<script src="http://html5shiv.googlecode.com/svn/trunk/html5.js"></script>
|
9
|
+
<![endif]-->
|
10
|
+
</head>
|
11
|
+
|
12
|
+
<body>
|
13
|
+
<div id="container">
|
14
|
+
<div id="header">
|
15
|
+
<h1><a href="http://dce.gitwrite.com">dce.gitwrite.com</a></h1>
|
16
|
+
</div>
|
17
|
+
|
18
|
+
<div id="content">
|
19
|
+
<div class="post">
|
20
|
+
<h2>Welcome to GitWrite</h2>
|
21
|
+
<span class="meta sidebar">
|
22
|
+
Oct 17, 2010 at 1:24 pm<br />
|
23
|
+
</span>
|
24
|
+
|
25
|
+
<p>Thank you for trying out GitWrite. Your blog lives in a repository at</p>
|
26
|
+
|
27
|
+
<blockquote><p><code>git://gitwrite.com/blogs/dce.git</code></p></blockquote>
|
28
|
+
|
29
|
+
<p>Pull it down (with <code>git checkout</code>), make some updates, and push it back.
|
30
|
+
In a few moments, your blog will be regenerated to include your new content. Of
|
31
|
+
course, you can always make edits through our <a href="http://gitwrite.com/site">web interface</a>, as well.</p>
|
32
|
+
|
33
|
+
|
34
|
+
<p class="meta"><a href="/posts/2010/10/17/post.html">Permalink</a></p>
|
35
|
+
</div>
|
36
|
+
|
37
|
+
</div>
|
38
|
+
|
39
|
+
<div id="footer" class="meta">
|
40
|
+
Powered by <a href="http://gitwrite.com" class="image-link"><img src="/images/logo.png" width="100"/></a> ¶ Theme inspired by <a href="http://www.tumblr.com/theme/325">langer</a>
|
41
|
+
</div>
|
42
|
+
</div>
|
43
|
+
</body>
|
44
|
+
</html>
|
@@ -0,0 +1,60 @@
|
|
1
|
+
h1, h2, h3 {
|
2
|
+
font-weight: normal;
|
3
|
+
}
|
4
|
+
|
5
|
+
a {
|
6
|
+
text-decoration: none;
|
7
|
+
background-color: #FF9;
|
8
|
+
color: black;
|
9
|
+
padding: 3px;
|
10
|
+
}
|
11
|
+
|
12
|
+
a:hover {
|
13
|
+
border-bottom: 1px solid black;
|
14
|
+
}
|
15
|
+
|
16
|
+
#container {
|
17
|
+
width: 500px;
|
18
|
+
margin: 0 auto;
|
19
|
+
font: 14px/1.5 Georgia, sans-serif;
|
20
|
+
}
|
21
|
+
|
22
|
+
#footer {
|
23
|
+
margin-top: 60px;
|
24
|
+
padding-top: 30px;
|
25
|
+
border-top: 1px dotted #999;
|
26
|
+
text-align: center;
|
27
|
+
}
|
28
|
+
|
29
|
+
div.post {
|
30
|
+
position: relative;
|
31
|
+
margin-top: 60px;
|
32
|
+
}
|
33
|
+
|
34
|
+
.meta {
|
35
|
+
font-size: .8em;
|
36
|
+
color: #999;
|
37
|
+
font-style: italic;
|
38
|
+
}
|
39
|
+
|
40
|
+
div.post span.sidebar {
|
41
|
+
position: absolute;
|
42
|
+
top: 5px;
|
43
|
+
left: -225px;
|
44
|
+
width: 200px;
|
45
|
+
text-align: right;
|
46
|
+
border-right: 1px dotted #999;
|
47
|
+
padding-right: 10px;
|
48
|
+
display: block;
|
49
|
+
}
|
50
|
+
|
51
|
+
a.image-link {
|
52
|
+
background: none;
|
53
|
+
padding: none;
|
54
|
+
border: none;
|
55
|
+
}
|
56
|
+
|
57
|
+
a.image-link img {
|
58
|
+
border: 1px solid #999;
|
59
|
+
vertical-align: middle;
|
60
|
+
}
|
@@ -0,0 +1,12 @@
|
|
1
|
+
title: Welcome to GitWrite
|
2
|
+
template: post
|
3
|
+
|
4
|
+
Thank you for trying out GitWrite. Your blog lives in a repository at
|
5
|
+
|
6
|
+
> `git://gitwrite.com/blogs/dce.git`
|
7
|
+
|
8
|
+
Pull it down (with `git checkout`), make some updates, and push it back.
|
9
|
+
In a few moments, your blog will be regenerated to include your new content. Of
|
10
|
+
course, you can always make edits through our [web interface][dash], as well.
|
11
|
+
|
12
|
+
[dash]: http://gitwrite.com/site
|
Binary file
|
@@ -0,0 +1,14 @@
|
|
1
|
+
template: site
|
2
|
+
|
3
|
+
{{#posts}}
|
4
|
+
<div class="post">
|
5
|
+
<h2>
|
6
|
+
<a href="{{link}}">{{title}}</a>
|
7
|
+
</h2>
|
8
|
+
<span class="meta sidebar">
|
9
|
+
{{#format_date}}{{date}}{{/format_date}}<br />
|
10
|
+
</span>
|
11
|
+
{{&rendered_content}}
|
12
|
+
<p class="meta"><a href="{{link}}">Permalink</a></p>
|
13
|
+
</div>
|
14
|
+
{{/posts}}
|
@@ -0,0 +1,60 @@
|
|
1
|
+
h1, h2, h3 {
|
2
|
+
font-weight: normal;
|
3
|
+
}
|
4
|
+
|
5
|
+
a {
|
6
|
+
text-decoration: none;
|
7
|
+
background-color: #FF9;
|
8
|
+
color: black;
|
9
|
+
padding: 3px;
|
10
|
+
}
|
11
|
+
|
12
|
+
a:hover {
|
13
|
+
border-bottom: 1px solid black;
|
14
|
+
}
|
15
|
+
|
16
|
+
#container {
|
17
|
+
width: 500px;
|
18
|
+
margin: 0 auto;
|
19
|
+
font: 14px/1.5 Georgia, sans-serif;
|
20
|
+
}
|
21
|
+
|
22
|
+
#footer {
|
23
|
+
margin-top: 60px;
|
24
|
+
padding-top: 30px;
|
25
|
+
border-top: 1px dotted #999;
|
26
|
+
text-align: center;
|
27
|
+
}
|
28
|
+
|
29
|
+
div.post {
|
30
|
+
position: relative;
|
31
|
+
margin-top: 60px;
|
32
|
+
}
|
33
|
+
|
34
|
+
.meta {
|
35
|
+
font-size: .8em;
|
36
|
+
color: #999;
|
37
|
+
font-style: italic;
|
38
|
+
}
|
39
|
+
|
40
|
+
div.post span.sidebar {
|
41
|
+
position: absolute;
|
42
|
+
top: 5px;
|
43
|
+
left: -225px;
|
44
|
+
width: 200px;
|
45
|
+
text-align: right;
|
46
|
+
border-right: 1px dotted #999;
|
47
|
+
padding-right: 10px;
|
48
|
+
display: block;
|
49
|
+
}
|
50
|
+
|
51
|
+
a.image-link {
|
52
|
+
background: none;
|
53
|
+
padding: none;
|
54
|
+
border: none;
|
55
|
+
}
|
56
|
+
|
57
|
+
a.image-link img {
|
58
|
+
border: 1px solid #999;
|
59
|
+
vertical-align: middle;
|
60
|
+
}
|
@@ -0,0 +1,27 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html>
|
3
|
+
<head>
|
4
|
+
<meta charset="utf-8" />
|
5
|
+
<title>{{site_name}}</title>
|
6
|
+
<link rel="stylesheet" href="/stylesheets/screen.css" type="text/css" />
|
7
|
+
<!--[if IE]>
|
8
|
+
<script src="http://html5shiv.googlecode.com/svn/trunk/html5.js"></script>
|
9
|
+
<![endif]-->
|
10
|
+
</head>
|
11
|
+
|
12
|
+
<body>
|
13
|
+
<div id="container">
|
14
|
+
<div id="header">
|
15
|
+
<h1><a href="{{site_url}}">{{site_name}}</a></h1>
|
16
|
+
</div>
|
17
|
+
|
18
|
+
<div id="content">
|
19
|
+
{{& content}}
|
20
|
+
</div>
|
21
|
+
|
22
|
+
<div id="footer" class="meta">
|
23
|
+
Powered by <a href="http://gitwrite.com" class="image-link"><img src="/images/logo.png" width="100"/></a> ¶ Theme inspired by <a href="http://www.tumblr.com/theme/325">langer</a>
|
24
|
+
</div>
|
25
|
+
</div>
|
26
|
+
</body>
|
27
|
+
</html>
|
metadata
CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
|
|
4
4
|
prerelease: false
|
5
5
|
segments:
|
6
6
|
- 0
|
7
|
-
-
|
8
|
-
-
|
9
|
-
version: 0.
|
7
|
+
- 5
|
8
|
+
- 0
|
9
|
+
version: 0.5.0
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Clinton R. Nixon
|
@@ -130,6 +130,7 @@ files:
|
|
130
130
|
- sample_site/site/index.html
|
131
131
|
- sample_site/templates/default.html
|
132
132
|
- sample_site/templates/site.html
|
133
|
+
- test/fixtures/config.yml
|
133
134
|
- test/fixtures/posts/first_post.html
|
134
135
|
- test/fixtures/posts/markdown_post.md
|
135
136
|
- test/fixtures/posts/no_date.html
|
@@ -144,6 +145,18 @@ files:
|
|
144
145
|
- test/fixtures/templates/post.html
|
145
146
|
- test/fixtures/templates/site.html
|
146
147
|
- test/howl_test.rb
|
148
|
+
- test/integration_site/config.yml
|
149
|
+
- test/integration_site/generated/images/logo.png
|
150
|
+
- test/integration_site/generated/index.html
|
151
|
+
- test/integration_site/generated/posts/2010/10/17/post.html
|
152
|
+
- test/integration_site/generated/stylesheets/screen.css
|
153
|
+
- test/integration_site/posts/post.md
|
154
|
+
- test/integration_site/site/images/logo.png
|
155
|
+
- test/integration_site/site/index.html
|
156
|
+
- test/integration_site/site/stylesheets/screen.css
|
157
|
+
- test/integration_site/templates/post.html
|
158
|
+
- test/integration_site/templates/site.html
|
159
|
+
- test/integration_test.rb
|
147
160
|
- test/teststrap.rb
|
148
161
|
has_rdoc: true
|
149
162
|
homepage: http://github.com/crnixon/howl
|
@@ -179,4 +192,5 @@ specification_version: 3
|
|
179
192
|
summary: A tiny static website/blog generator.
|
180
193
|
test_files:
|
181
194
|
- test/howl_test.rb
|
195
|
+
- test/integration_test.rb
|
182
196
|
- test/teststrap.rb
|