PerfectlyNormal-jekyll 0.5.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (48) hide show
  1. data/History.txt +127 -0
  2. data/README.textile +41 -0
  3. data/Rakefile +91 -0
  4. data/VERSION.yml +4 -0
  5. data/bin/jekyll +150 -0
  6. data/lib/jekyll.rb +84 -0
  7. data/lib/jekyll/albino.rb +122 -0
  8. data/lib/jekyll/converters/csv.rb +26 -0
  9. data/lib/jekyll/converters/mephisto.rb +79 -0
  10. data/lib/jekyll/converters/mt.rb +59 -0
  11. data/lib/jekyll/converters/textpattern.rb +50 -0
  12. data/lib/jekyll/converters/typo.rb +49 -0
  13. data/lib/jekyll/converters/wordpress.rb +54 -0
  14. data/lib/jekyll/convertible.rb +82 -0
  15. data/lib/jekyll/core_ext.rb +22 -0
  16. data/lib/jekyll/filters.rb +47 -0
  17. data/lib/jekyll/layout.rb +36 -0
  18. data/lib/jekyll/page.rb +70 -0
  19. data/lib/jekyll/post.rb +243 -0
  20. data/lib/jekyll/site.rb +265 -0
  21. data/lib/jekyll/tags/highlight.rb +56 -0
  22. data/lib/jekyll/tags/include.rb +31 -0
  23. data/test/helper.rb +27 -0
  24. data/test/source/_includes/sig.markdown +3 -0
  25. data/test/source/_layouts/default.html +27 -0
  26. data/test/source/_layouts/simple.html +1 -0
  27. data/test/source/_posts/2008-02-02-not-published.textile +8 -0
  28. data/test/source/_posts/2008-02-02-published.textile +8 -0
  29. data/test/source/_posts/2008-10-18-foo-bar.textile +8 -0
  30. data/test/source/_posts/2008-11-21-complex.textile +8 -0
  31. data/test/source/_posts/2008-12-03-permalinked-post.textile +9 -0
  32. data/test/source/_posts/2008-12-13-include.markdown +8 -0
  33. data/test/source/_posts/2009-01-27-array-categories.textile +10 -0
  34. data/test/source/_posts/2009-01-27-categories.textile +7 -0
  35. data/test/source/_posts/2009-01-27-category.textile +7 -0
  36. data/test/source/_posts/2009-03-12-hash-#1.markdown +6 -0
  37. data/test/source/category/_posts/2008-9-23-categories.textile +6 -0
  38. data/test/source/css/screen.css +76 -0
  39. data/test/source/foo/_posts/bar/2008-12-12-topical-post.textile +8 -0
  40. data/test/source/index.html +22 -0
  41. data/test/source/z_category/_posts/2008-9-23-categories.textile +6 -0
  42. data/test/suite.rb +9 -0
  43. data/test/test_filters.rb +49 -0
  44. data/test/test_generated_site.rb +38 -0
  45. data/test/test_post.rb +269 -0
  46. data/test/test_site.rb +65 -0
  47. data/test/test_tags.rb +116 -0
  48. metadata +164 -0
@@ -0,0 +1,269 @@
1
+ require File.dirname(__FILE__) + '/helper'
2
+
3
+ class TestPost < Test::Unit::TestCase
4
+ def setup_post(file)
5
+ Post.new(@site, source_dir, '', file)
6
+ end
7
+
8
+ def do_render(post)
9
+ layouts = { "default" => Layout.new(@site, source_dir('_layouts'), "simple.html")}
10
+ post.render(layouts, {"site" => {"posts" => []}})
11
+ end
12
+
13
+ context "A Post" do
14
+ setup do
15
+ clear_dest
16
+ stub(Jekyll).configuration { Jekyll::DEFAULTS }
17
+ @site = Site.new(Jekyll.configuration)
18
+ end
19
+
20
+ should "ensure valid posts are valid" do
21
+ assert Post.valid?("2008-10-19-foo-bar.textile")
22
+ assert Post.valid?("foo/bar/2008-10-19-foo-bar.textile")
23
+
24
+ assert !Post.valid?("lol2008-10-19-foo-bar.textile")
25
+ assert !Post.valid?("blah")
26
+ end
27
+
28
+
29
+ context "processing posts" do
30
+ setup do
31
+ @post = Post.allocate
32
+ @post.site = @site
33
+
34
+ @real_file = "2008-10-18-foo-bar.textile"
35
+ @fake_file = "2008-10-19-foo-bar.textile"
36
+ @source = source_dir('_posts')
37
+ end
38
+
39
+ should "keep date, title, and markup type" do
40
+ @post.process(@fake_file)
41
+
42
+ assert_equal Time.parse("2008-10-19"), @post.date
43
+ assert_equal "foo-bar", @post.slug
44
+ assert_equal ".textile", @post.ext
45
+ assert_equal "/2008/10/19", @post.dir
46
+ assert_equal "/2008/10/19/foo-bar", @post.id
47
+ end
48
+
49
+ should "create url based on date and title" do
50
+ @post.categories = []
51
+ @post.process(@fake_file)
52
+ assert_equal "/2008/10/19/foo-bar.html", @post.url
53
+ end
54
+
55
+ should "CGI escape urls" do
56
+ @post.categories = []
57
+ @post.process("2009-03-12-hash-#1.markdown")
58
+ assert_equal "/2009/03/12/hash-%231.html", @post.url
59
+ assert_equal "/2009/03/12/hash-#1", @post.id
60
+ end
61
+
62
+ should "respect permalink in yaml front matter" do
63
+ file = "2008-12-03-permalinked-post.textile"
64
+ @post.process(file)
65
+ @post.read_yaml(@source, file)
66
+
67
+ assert_equal "my_category/permalinked-post", @post.permalink
68
+ assert_equal "my_category", @post.dir
69
+ assert_equal "my_category/permalinked-post", @post.url
70
+ end
71
+
72
+ context "with site wide permalink" do
73
+ setup do
74
+ @post.categories = []
75
+ end
76
+
77
+ context "with unspecified (date) style" do
78
+ setup do
79
+ @post.process(@fake_file)
80
+ end
81
+
82
+ should "process the url correctly" do
83
+ assert_equal "/:categories/:year/:month/:day/:title.html", @post.template
84
+ assert_equal "/2008/10/19/foo-bar.html", @post.url
85
+ end
86
+ end
87
+
88
+ context "with unspecified (date) style and a category" do
89
+ setup do
90
+ @post.categories << "beer"
91
+ @post.process(@fake_file)
92
+ end
93
+
94
+ should "process the url correctly" do
95
+ assert_equal "/:categories/:year/:month/:day/:title.html", @post.template
96
+ assert_equal "/beer/2008/10/19/foo-bar.html", @post.url
97
+ end
98
+ end
99
+
100
+ context "with unspecified (date) style and categories" do
101
+ setup do
102
+ @post.categories << "food"
103
+ @post.categories << "beer"
104
+ @post.process(@fake_file)
105
+ end
106
+
107
+ should "process the url correctly" do
108
+ assert_equal "/:categories/:year/:month/:day/:title.html", @post.template
109
+ assert_equal "/beer/food/2008/10/19/foo-bar.html", @post.url
110
+ end
111
+ end
112
+
113
+ context "with none style" do
114
+ setup do
115
+ @post.site.permalink_style = :none
116
+ @post.process(@fake_file)
117
+ end
118
+
119
+ should "process the url correctly" do
120
+ assert_equal "/:categories/:title.html", @post.template
121
+ assert_equal "/foo-bar.html", @post.url
122
+ end
123
+ end
124
+
125
+ context "with pretty style" do
126
+ setup do
127
+ @post.site.permalink_style = :pretty
128
+ @post.process(@fake_file)
129
+ end
130
+
131
+ should "process the url correctly" do
132
+ assert_equal "/:categories/:year/:month/:day/:title", @post.template
133
+ assert_equal "/2008/10/19/foo-bar", @post.url
134
+ end
135
+ end
136
+
137
+ context "with prefix style and no extension" do
138
+ setup do
139
+ @post.site.permalink_style = "/prefix/:title"
140
+ @post.process(@fake_file)
141
+ end
142
+
143
+ should "process the url correctly" do
144
+ assert_equal "/prefix/:title", @post.template
145
+ assert_equal "/prefix/foo-bar", @post.url
146
+ end
147
+ end
148
+ end
149
+
150
+ should "read yaml front-matter" do
151
+ @post.read_yaml(@source, @real_file)
152
+
153
+ assert_equal({"title" => "Foo Bar", "layout" => "default"}, @post.data)
154
+ assert_equal "\nh1. {{ page.title }}\n\nBest *post* ever", @post.content
155
+ end
156
+
157
+ should "transform textile" do
158
+ @post.process(@real_file)
159
+ @post.read_yaml(@source, @real_file)
160
+ @post.transform
161
+
162
+ assert_equal "<h1>{{ page.title }}</h1>\n<p>Best <strong>post</strong> ever</p>", @post.content
163
+ end
164
+ end
165
+
166
+ context "when in a site" do
167
+ setup do
168
+ clear_dest
169
+ stub(Jekyll).configuration { Jekyll::DEFAULTS }
170
+ @site = Site.new(Jekyll.configuration)
171
+ @site.posts = [setup_post('2008-02-02-published.textile'),
172
+ setup_post('2009-01-27-categories.textile')]
173
+ end
174
+
175
+ should "have next post" do
176
+ assert_equal(@site.posts.last, @site.posts.first.next)
177
+ end
178
+
179
+ should "have previous post" do
180
+ assert_equal(@site.posts.first, @site.posts.last.previous)
181
+ end
182
+
183
+ should "not have previous post if first" do
184
+ assert_equal(nil, @site.posts.first.previous)
185
+ end
186
+
187
+ should "not have next post if last" do
188
+ assert_equal(nil, @site.posts.last.next)
189
+ end
190
+ end
191
+
192
+ context "initializing posts" do
193
+ should "publish when published yaml is no specified" do
194
+ post = setup_post("2008-02-02-published.textile")
195
+ assert_equal true, post.published
196
+ end
197
+
198
+ should "not published when published yaml is false" do
199
+ post = setup_post("2008-02-02-not-published.textile")
200
+ assert_equal false, post.published
201
+ end
202
+
203
+ should "recognize category in yaml" do
204
+ post = setup_post("2009-01-27-category.textile")
205
+ assert post.categories.include?('foo')
206
+ end
207
+
208
+ should "recognize several categories in yaml" do
209
+ post = setup_post("2009-01-27-categories.textile")
210
+ assert post.categories.include?('foo')
211
+ assert post.categories.include?('bar')
212
+ assert post.categories.include?('baz')
213
+ end
214
+
215
+ context "rendering" do
216
+ setup do
217
+ clear_dest
218
+ end
219
+
220
+ should "render properly" do
221
+ post = setup_post("2008-10-18-foo-bar.textile")
222
+ do_render(post)
223
+ assert_equal "<<< <h1>Foo Bar</h1>\n<p>Best <strong>post</strong> ever</p> >>>", post.output
224
+ end
225
+
226
+ should "write properly" do
227
+ post = setup_post("2008-10-18-foo-bar.textile")
228
+ do_render(post)
229
+ post.write(dest_dir)
230
+
231
+ assert File.directory?(dest_dir)
232
+ assert File.exists?(File.join(dest_dir, '2008', '10', '18', 'foo-bar.html'))
233
+ end
234
+
235
+ should "write properly without html extension" do
236
+ post = setup_post("2008-10-18-foo-bar.textile")
237
+ post.site.permalink_style = ":title"
238
+ do_render(post)
239
+ post.write(dest_dir)
240
+
241
+ assert File.directory?(dest_dir)
242
+ assert File.exists?(File.join(dest_dir, 'foo-bar', 'index.html'))
243
+ end
244
+
245
+ should "insert data" do
246
+ post = setup_post("2008-11-21-complex.textile")
247
+ do_render(post)
248
+
249
+ assert_equal "<<< <p>url: /2008/11/21/complex.html<br />\ndate: #{Time.parse("2008-11-21")}<br />\nid: /2008/11/21/complex</p> >>>", post.output
250
+ end
251
+
252
+ should "include templates" do
253
+ post = setup_post("2008-12-13-include.markdown")
254
+ post.site.source = File.join(File.dirname(__FILE__), 'source')
255
+ do_render(post)
256
+
257
+ assert_equal "<<< <hr />\n<p>Tom Preston-Werner github.com/mojombo</p>\n\n<p>This <em>is</em> cool</p> >>>", post.output
258
+ end
259
+ end
260
+ end
261
+
262
+ should "generate categories and topics" do
263
+ post = Post.new(@site, File.join(File.dirname(__FILE__), *%w[source]), 'foo', 'bar/2008-12-12-topical-post.textile')
264
+ assert_equal ['foo'], post.categories
265
+ assert_equal ['bar'], post.topics
266
+ end
267
+
268
+ end
269
+ end
@@ -0,0 +1,65 @@
1
+ require File.dirname(__FILE__) + '/helper'
2
+
3
+ class TestSite < Test::Unit::TestCase
4
+ context "creating sites" do
5
+ setup do
6
+ stub(Jekyll).configuration do
7
+ Jekyll::DEFAULTS.merge({'source' => source_dir, 'destination' => dest_dir})
8
+ end
9
+ @site = Site.new(Jekyll.configuration)
10
+ end
11
+
12
+ should "reset data before processing" do
13
+ clear_dest
14
+ @site.process
15
+ before_posts = @site.posts.length
16
+ before_layouts = @site.layouts.length
17
+ before_categories = @site.categories.length
18
+
19
+ @site.process
20
+ assert_equal before_posts, @site.posts.length
21
+ assert_equal before_layouts, @site.layouts.length
22
+ assert_equal before_categories, @site.categories.length
23
+ end
24
+
25
+ should "read layouts" do
26
+ @site.read_layouts
27
+ assert_equal ["default", "simple"].sort, @site.layouts.keys.sort
28
+ end
29
+
30
+ should "read posts" do
31
+ @site.read_posts('')
32
+ posts = Dir[source_dir('_posts', '*')]
33
+ assert_equal posts.size - 1, @site.posts.size
34
+ end
35
+
36
+ should "deploy payload" do
37
+ clear_dest
38
+ @site.process
39
+
40
+ posts = Dir[source_dir("**", "_posts", "*")]
41
+ categories = %w(bar baz category foo z_category publish_test).sort
42
+
43
+ assert_equal posts.size - 1, @site.posts.size
44
+ assert_equal categories, @site.categories.keys.sort
45
+ assert_equal 4, @site.categories['foo'].size
46
+ end
47
+
48
+ should "filter entries" do
49
+ ent1 = %w[foo.markdown bar.markdown baz.markdown #baz.markdown#
50
+ .baz.markdow foo.markdown~]
51
+ ent2 = %w[.htaccess _posts bla.bla]
52
+
53
+ assert_equal %w[foo.markdown bar.markdown baz.markdown], @site.filter_entries(ent1)
54
+ assert_equal ent2, @site.filter_entries(ent2)
55
+ end
56
+
57
+ should "filter entries with exclude" do
58
+ excludes = %w[README TODO]
59
+ includes = %w[index.html site.css]
60
+
61
+ @site.exclude = excludes
62
+ assert_equal includes, @site.filter_entries(excludes + includes)
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,116 @@
1
+ require File.dirname(__FILE__) + '/helper'
2
+
3
+ class TestTags < Test::Unit::TestCase
4
+
5
+ def create_post(content, override = {}, markdown = true)
6
+ stub(Jekyll).configuration do
7
+ Jekyll::DEFAULTS.merge({'pygments' => true}).merge(override)
8
+ end
9
+ site = Site.new(Jekyll.configuration)
10
+ info = { :filters => [Jekyll::Filters], :registers => { :site => site } }
11
+
12
+ if markdown
13
+ payload = {"content_type" => "markdown"}
14
+ else
15
+ payload = {"content_type" => "textile"}
16
+ end
17
+
18
+ @result = Liquid::Template.parse(content).render(payload, info)
19
+
20
+ if markdown
21
+ @result = site.markdown(@result)
22
+ else
23
+ @result = site.textile(@result)
24
+ end
25
+ end
26
+
27
+ def fill_post(code, override = {})
28
+ content = <<CONTENT
29
+ ---
30
+ title: This is a test
31
+ ---
32
+
33
+ This document results in a markdown error with maruku
34
+
35
+ {% highlight text %}
36
+ #{code}
37
+ {% endhighlight %}
38
+ CONTENT
39
+ create_post(content, override)
40
+ end
41
+
42
+ context "post content has highlight tag" do
43
+ setup do
44
+ fill_post("test")
45
+ end
46
+
47
+ should "not cause a markdown error" do
48
+ assert_no_match /markdown\-html\-error/, @result
49
+ end
50
+
51
+ should "render markdown with pygments line handling" do
52
+ assert_match %{<pre>test\n</pre>}, @result
53
+ end
54
+ end
55
+
56
+ context "post content has highlight tag with UTF character" do
57
+ setup do
58
+ fill_post("Æ")
59
+ end
60
+
61
+ should "render markdown with pygments line handling" do
62
+ assert_match %{<pre>Æ\n</pre>}, @result
63
+ end
64
+ end
65
+
66
+ context "simple post with markdown and pre tags" do
67
+ setup do
68
+ @content = <<CONTENT
69
+ ---
70
+ title: Maruku vs. RDiscount
71
+ ---
72
+
73
+ _FIGHT!_
74
+
75
+ {% highlight ruby %}
76
+ puts "3..2..1.."
77
+ {% endhighlight %}
78
+
79
+ *FINISH HIM*
80
+ CONTENT
81
+ end
82
+
83
+ context "using Textile" do
84
+ setup do
85
+ create_post(@content, {}, false)
86
+ end
87
+
88
+ # Broken in RedCloth 4.1.9
89
+ should "not textilize highlight block" do
90
+ assert_no_match %r{3\.\.2\.\.1\.\.&quot;</span><br />}, @result
91
+ end
92
+ end
93
+
94
+ context "using Maruku" do
95
+ setup do
96
+ create_post(@content)
97
+ end
98
+
99
+ should "parse correctly" do
100
+ assert_match %r{<em>FIGHT!</em>}, @result
101
+ assert_match %r{<em>FINISH HIM</em>}, @result
102
+ end
103
+ end
104
+
105
+ context "using RDiscount" do
106
+ setup do
107
+ create_post(@content, 'markdown' => 'rdiscount')
108
+ end
109
+
110
+ should "parse correctly" do
111
+ assert_match %r{<em>FIGHT!</em>}, @result
112
+ assert_match %r{<em>FINISH HIM</em>}, @result
113
+ end
114
+ end
115
+ end
116
+ end