matflores-jekyll 0.4.1
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/History.txt +113 -0
- data/README.textile +508 -0
- data/VERSION.yml +4 -0
- data/bin/jekyll +136 -0
- data/lib/jekyll.rb +69 -0
- data/lib/jekyll/albino.rb +120 -0
- data/lib/jekyll/archive.rb +25 -0
- data/lib/jekyll/converters/csv.rb +26 -0
- data/lib/jekyll/converters/mephisto.rb +79 -0
- data/lib/jekyll/converters/mt.rb +59 -0
- data/lib/jekyll/converters/textpattern.rb +50 -0
- data/lib/jekyll/converters/typo.rb +49 -0
- data/lib/jekyll/converters/wordpress.rb +55 -0
- data/lib/jekyll/convertible.rb +71 -0
- data/lib/jekyll/core_ext.rb +22 -0
- data/lib/jekyll/filters.rb +50 -0
- data/lib/jekyll/layout.rb +33 -0
- data/lib/jekyll/page.rb +64 -0
- data/lib/jekyll/post.rb +201 -0
- data/lib/jekyll/site.rb +241 -0
- data/lib/jekyll/tags/highlight.rb +53 -0
- data/lib/jekyll/tags/include.rb +31 -0
- data/test/helper.rb +14 -0
- data/test/source/_includes/sig.markdown +3 -0
- data/test/source/_layouts/default.html +27 -0
- data/test/source/_layouts/simple.html +1 -0
- data/test/source/_posts/2008-10-18-foo-bar.textile +8 -0
- data/test/source/_posts/2008-11-21-complex.textile +8 -0
- data/test/source/_posts/2008-12-03-permalinked-post.textile +9 -0
- data/test/source/_posts/2008-12-13-include.markdown +8 -0
- data/test/source/category/_posts/2008-9-23-categories.textile +6 -0
- data/test/source/css/screen.css +76 -0
- data/test/source/foo/_posts/bar/2008-12-12-topical-post.textile +8 -0
- data/test/source/index.html +22 -0
- data/test/source/z_category/_posts/2008-9-23-categories.textile +6 -0
- data/test/suite.rb +9 -0
- data/test/test_filters.rb +41 -0
- data/test/test_generated_site.rb +60 -0
- data/test/test_jekyll.rb +0 -0
- data/test/test_post.rb +141 -0
- data/test/test_site.rb +45 -0
- data/test/test_tags.rb +31 -0
- metadata +170 -0
@@ -0,0 +1,31 @@
|
|
1
|
+
module Jekyll
|
2
|
+
|
3
|
+
class IncludeTag < Liquid::Tag
|
4
|
+
def initialize(tag_name, file, tokens)
|
5
|
+
super
|
6
|
+
@file = file.strip
|
7
|
+
end
|
8
|
+
|
9
|
+
def render(context)
|
10
|
+
if @file !~ /^[a-zA-Z0-9_\/\.-]+$/ || @file =~ /\.\// || @file =~ /\/\./
|
11
|
+
return "Include file '#{@file}' contains invalid characters or sequences"
|
12
|
+
end
|
13
|
+
|
14
|
+
Dir.chdir(File.join(Jekyll.source, '_includes')) do
|
15
|
+
choices = Dir['**/*'].reject { |x| File.symlink?(x) }
|
16
|
+
if choices.include?(@file)
|
17
|
+
source = File.read(@file)
|
18
|
+
partial = Liquid::Template.parse(source)
|
19
|
+
context.stack do
|
20
|
+
partial.render(context)
|
21
|
+
end
|
22
|
+
else
|
23
|
+
"Included file '#{@file}' not found in _includes directory"
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
30
|
+
|
31
|
+
Liquid::Template.register_tag('include', Jekyll::IncludeTag)
|
data/test/helper.rb
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), *%w[.. lib jekyll])
|
2
|
+
|
3
|
+
require 'test/unit'
|
4
|
+
require 'redgreen'
|
5
|
+
|
6
|
+
include Jekyll
|
7
|
+
|
8
|
+
def dest_dir
|
9
|
+
File.join(File.dirname(__FILE__), *%w[dest])
|
10
|
+
end
|
11
|
+
|
12
|
+
def clear_dest
|
13
|
+
FileUtils.rm_rf(dest_dir)
|
14
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
|
2
|
+
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
3
|
+
|
4
|
+
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en-us">
|
5
|
+
<head>
|
6
|
+
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
|
7
|
+
<title>{{ page.title }}</title>
|
8
|
+
<meta name="author" content="<%= @page.author %>" />
|
9
|
+
|
10
|
+
<!-- CodeRay syntax highlighting CSS -->
|
11
|
+
<link rel="stylesheet" href="/css/coderay.css" type="text/css" />
|
12
|
+
|
13
|
+
<!-- Homepage CSS -->
|
14
|
+
<link rel="stylesheet" href="/css/screen.css" type="text/css" media="screen, projection" />
|
15
|
+
</head>
|
16
|
+
<body>
|
17
|
+
|
18
|
+
<div class="site">
|
19
|
+
<div class="title">
|
20
|
+
Tom Preston-Werner
|
21
|
+
</div>
|
22
|
+
|
23
|
+
{{ content }}
|
24
|
+
</div>
|
25
|
+
|
26
|
+
</body>
|
27
|
+
</html>
|
@@ -0,0 +1 @@
|
|
1
|
+
<<< {{ content }} >>>
|
@@ -0,0 +1,76 @@
|
|
1
|
+
/*****************************************************************************/
|
2
|
+
/*
|
3
|
+
/* Common
|
4
|
+
/*
|
5
|
+
/*****************************************************************************/
|
6
|
+
|
7
|
+
/* Global Reset */
|
8
|
+
|
9
|
+
* {
|
10
|
+
margin: 0;
|
11
|
+
padding: 0;
|
12
|
+
}
|
13
|
+
|
14
|
+
html, body {
|
15
|
+
height: 100%;
|
16
|
+
}
|
17
|
+
|
18
|
+
body {
|
19
|
+
background-color: white;
|
20
|
+
font: 13.34px helvetica, arial, clean, sans-serif;
|
21
|
+
*font-size: small;
|
22
|
+
text-align: center;
|
23
|
+
}
|
24
|
+
|
25
|
+
h1, h2, h3, h4, h5, h6 {
|
26
|
+
font-size: 100%;
|
27
|
+
}
|
28
|
+
|
29
|
+
h1 {
|
30
|
+
margin-bottom: 1em;
|
31
|
+
}
|
32
|
+
|
33
|
+
p {
|
34
|
+
margin: 1em 0;
|
35
|
+
}
|
36
|
+
|
37
|
+
a {
|
38
|
+
color: #00a;
|
39
|
+
}
|
40
|
+
|
41
|
+
a:hover {
|
42
|
+
color: black;
|
43
|
+
}
|
44
|
+
|
45
|
+
a:visited {
|
46
|
+
color: #a0a;
|
47
|
+
}
|
48
|
+
|
49
|
+
table {
|
50
|
+
font-size: inherit;
|
51
|
+
font: 100%;
|
52
|
+
}
|
53
|
+
|
54
|
+
/*****************************************************************************/
|
55
|
+
/*
|
56
|
+
/* Site
|
57
|
+
/*
|
58
|
+
/*****************************************************************************/
|
59
|
+
|
60
|
+
.site {
|
61
|
+
font-size: 110%;
|
62
|
+
text-align: justify;
|
63
|
+
width: 40em;
|
64
|
+
margin: 3em auto 2em auto;
|
65
|
+
line-height: 1.5em;
|
66
|
+
}
|
67
|
+
|
68
|
+
.title {
|
69
|
+
color: #a00;
|
70
|
+
font-weight: bold;
|
71
|
+
margin-bottom: 2em;
|
72
|
+
}
|
73
|
+
|
74
|
+
.site .meta {
|
75
|
+
color: #aaa;
|
76
|
+
}
|
@@ -0,0 +1,22 @@
|
|
1
|
+
---
|
2
|
+
layout: default
|
3
|
+
title: Tom Preston-Werner
|
4
|
+
---
|
5
|
+
|
6
|
+
h1. Welcome to my site
|
7
|
+
|
8
|
+
h2. Please read our {{ site.posts | size }} Posts
|
9
|
+
|
10
|
+
<ul>
|
11
|
+
{% for post in site.posts %}
|
12
|
+
<li>{{ post.date }} <a href="{{ post.url }}">{{ post.title }}</a></li>
|
13
|
+
{% endfor %}
|
14
|
+
</ul>
|
15
|
+
|
16
|
+
{% assign first_post = site.posts.first %}
|
17
|
+
<div id="first_post">
|
18
|
+
<h1>{{ first_post.title }}</h1>
|
19
|
+
<div>
|
20
|
+
{{ first_post.content }}
|
21
|
+
</div>
|
22
|
+
</div>
|
data/test/suite.rb
ADDED
@@ -0,0 +1,41 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/helper'
|
2
|
+
|
3
|
+
class TestFilters < Test::Unit::TestCase
|
4
|
+
|
5
|
+
class JekyllFilter
|
6
|
+
include Jekyll::Filters
|
7
|
+
end
|
8
|
+
|
9
|
+
def setup
|
10
|
+
@filter = JekyllFilter.new
|
11
|
+
end
|
12
|
+
|
13
|
+
def test_textilize_with_simple_string
|
14
|
+
assert_equal "<p>something <strong>really</strong> simple</p>", @filter.textilize("something *really* simple")
|
15
|
+
end
|
16
|
+
|
17
|
+
def test_array_to_sentence_string_with_no_args
|
18
|
+
assert_equal "", @filter.array_to_sentence_string([])
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_array_to_sentence_string_with_one_arg
|
22
|
+
assert_equal "1", @filter.array_to_sentence_string([1])
|
23
|
+
assert_equal "chunky", @filter.array_to_sentence_string(["chunky"])
|
24
|
+
end
|
25
|
+
|
26
|
+
def test_array_to_sentence_string_with_two_args
|
27
|
+
assert_equal "1 and 2", @filter.array_to_sentence_string([1, 2])
|
28
|
+
assert_equal "chunky and bacon", @filter.array_to_sentence_string(["chunky", "bacon"])
|
29
|
+
end
|
30
|
+
|
31
|
+
def test_array_to_sentence_string_with_multiple_args
|
32
|
+
assert_equal "1, 2, 3, and 4", @filter.array_to_sentence_string([1, 2, 3, 4])
|
33
|
+
assert_equal "chunky, bacon, bits, and pieces", @filter.array_to_sentence_string(["chunky", "bacon", "bits", "pieces"])
|
34
|
+
end
|
35
|
+
|
36
|
+
def test_xml_escape_with_ampersands
|
37
|
+
assert_equal "AT&T", @filter.xml_escape("AT&T")
|
38
|
+
assert_equal "<code>command &lt;filename&gt;</code>", @filter.xml_escape("<code>command <filename></code>")
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/helper'
|
2
|
+
|
3
|
+
class TestGeneratedSite < Test::Unit::TestCase
|
4
|
+
def setup
|
5
|
+
clear_dest
|
6
|
+
@source = File.join(File.dirname(__FILE__), *%w[source])
|
7
|
+
@s = Site.new(@source, dest_dir)
|
8
|
+
@s.process
|
9
|
+
@index = File.read(File.join(dest_dir, 'index.html'))
|
10
|
+
end
|
11
|
+
|
12
|
+
def test_site_posts_in_index
|
13
|
+
# confirm that {{ site.posts }} is working
|
14
|
+
assert @index.include?("#{@s.posts.size} Posts")
|
15
|
+
end
|
16
|
+
|
17
|
+
def test_post_content_in_index
|
18
|
+
# confirm that the {{ post.content }} is rendered OK
|
19
|
+
latest_post = Dir[File.join(@source, '_posts/*')].last
|
20
|
+
post = Post.new(@source, '', File.basename(latest_post))
|
21
|
+
Jekyll.content_type = post.determine_content_type
|
22
|
+
post.transform
|
23
|
+
assert @index.include?(post.content)
|
24
|
+
end
|
25
|
+
|
26
|
+
def test_unpublished_posts_are_hidden
|
27
|
+
published = Dir[File.join(dest_dir, 'publish_test/2008/02/02/*.html')].map {|f| File.basename(f)}
|
28
|
+
|
29
|
+
assert_equal 1, published.size
|
30
|
+
assert_equal "published.html", published.first
|
31
|
+
end
|
32
|
+
|
33
|
+
def test_posts_directory_not_copied
|
34
|
+
assert !File.exist?(File.join(dest_dir, '_posts'))
|
35
|
+
end
|
36
|
+
|
37
|
+
def test_yearly_archive_creation
|
38
|
+
filename = File.join(dest_dir, '2008', 'index.html')
|
39
|
+
assert File.exists?(filename)
|
40
|
+
assert File.read(filename).include?("<h1>2008</h1>")
|
41
|
+
end
|
42
|
+
|
43
|
+
def test_monthly_archive_creation
|
44
|
+
filename = File.join(dest_dir, '2008', '02', 'index.html')
|
45
|
+
assert File.exists?(filename)
|
46
|
+
assert File.read(filename).include?("<h1>February 2008</h1>")
|
47
|
+
end
|
48
|
+
|
49
|
+
def test_daily_archive_creation
|
50
|
+
filename = File.join(dest_dir, '2008', '02', '02', 'index.html')
|
51
|
+
assert File.exists?(filename)
|
52
|
+
assert File.read(filename).include?("<h1>February 2, 2008</h1>")
|
53
|
+
end
|
54
|
+
|
55
|
+
def test_category_index_creation
|
56
|
+
filename = File.join(dest_dir, 'category', 'foo', 'index.html')
|
57
|
+
assert File.exists?(filename)
|
58
|
+
assert File.read(filename).include?("<h1>Category: foo (#{@s.categories['foo'].size} posts)</h1>")
|
59
|
+
end
|
60
|
+
end
|
data/test/test_jekyll.rb
ADDED
File without changes
|
data/test/test_post.rb
ADDED
@@ -0,0 +1,141 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/helper'
|
2
|
+
|
3
|
+
class TestPost < Test::Unit::TestCase
|
4
|
+
def setup
|
5
|
+
|
6
|
+
end
|
7
|
+
|
8
|
+
def test_valid
|
9
|
+
assert Post.valid?("2008-10-19-foo-bar.textile")
|
10
|
+
assert Post.valid?("foo/bar/2008-10-19-foo-bar.textile")
|
11
|
+
|
12
|
+
assert !Post.valid?("lol2008-10-19-foo-bar.textile")
|
13
|
+
assert !Post.valid?("blah")
|
14
|
+
end
|
15
|
+
|
16
|
+
def test_process
|
17
|
+
p = Post.allocate
|
18
|
+
p.process("2008-10-19-foo-bar.textile")
|
19
|
+
|
20
|
+
assert_equal Time.parse("2008-10-19"), p.date
|
21
|
+
assert_equal "foo-bar", p.slug
|
22
|
+
assert_equal ".textile", p.ext
|
23
|
+
end
|
24
|
+
|
25
|
+
def test_url
|
26
|
+
p = Post.allocate
|
27
|
+
p.categories = []
|
28
|
+
p.process("2008-10-19-foo-bar.textile")
|
29
|
+
|
30
|
+
assert_equal "/2008/10/19/foo-bar.html", p.url
|
31
|
+
end
|
32
|
+
|
33
|
+
def test_permalink
|
34
|
+
p = Post.allocate
|
35
|
+
p.process("2008-12-03-permalinked-post.textile")
|
36
|
+
p.read_yaml(File.join(File.dirname(__FILE__), *%w[source _posts]), "2008-12-03-permalinked-post.textile")
|
37
|
+
|
38
|
+
assert_equal "my_category/permalinked-post", p.permalink
|
39
|
+
end
|
40
|
+
|
41
|
+
def test_dir_respects_permalink
|
42
|
+
p = Post.allocate
|
43
|
+
p.process("2008-12-03-permalinked-post.textile")
|
44
|
+
p.read_yaml(File.join(File.dirname(__FILE__), *%w[source _posts]), "2008-12-03-permalinked-post.textile")
|
45
|
+
|
46
|
+
assert_equal "my_category/", p.dir
|
47
|
+
end
|
48
|
+
|
49
|
+
def test_url_respects_permalink
|
50
|
+
p = Post.allocate
|
51
|
+
p.process("2008-12-03-permalinked-post.textile")
|
52
|
+
p.read_yaml(File.join(File.dirname(__FILE__), *%w[source _posts]), "2008-12-03-permalinked-post.textile")
|
53
|
+
|
54
|
+
assert_equal "my_category/permalinked-post", p.url
|
55
|
+
end
|
56
|
+
|
57
|
+
def test_read_yaml
|
58
|
+
p = Post.allocate
|
59
|
+
p.read_yaml(File.join(File.dirname(__FILE__), *%w[source _posts]), "2008-10-18-foo-bar.textile")
|
60
|
+
|
61
|
+
assert_equal({"title" => "Foo Bar", "layout" => "default"}, p.data)
|
62
|
+
assert_equal "\nh1. {{ page.title }}\n\nBest *post* ever", p.content
|
63
|
+
end
|
64
|
+
|
65
|
+
def test_transform
|
66
|
+
p = Post.allocate
|
67
|
+
p.process("2008-10-18-foo-bar.textile")
|
68
|
+
p.read_yaml(File.join(File.dirname(__FILE__), *%w[source _posts]), "2008-10-18-foo-bar.textile")
|
69
|
+
p.transform
|
70
|
+
|
71
|
+
assert_equal "<h1>{{ page.title }}</h1>\n<p>Best <strong>post</strong> ever</p>", p.content
|
72
|
+
end
|
73
|
+
|
74
|
+
def test_published
|
75
|
+
p = Post.new(File.join(File.dirname(__FILE__), *%w[source]), '', "2008-02-02-published.textile")
|
76
|
+
assert_equal true, p.published
|
77
|
+
end
|
78
|
+
|
79
|
+
def test_not_published
|
80
|
+
p = Post.new(File.join(File.dirname(__FILE__), *%w[source]), '', "2008-02-02-not-published.textile")
|
81
|
+
assert_equal false, p.published
|
82
|
+
end
|
83
|
+
|
84
|
+
def test_yaml_category
|
85
|
+
p = Post.new(File.join(File.dirname(__FILE__), *%w[source]), '', "2009-01-27-category.textile")
|
86
|
+
assert p.categories.include?('foo')
|
87
|
+
end
|
88
|
+
|
89
|
+
def test_yaml_categories
|
90
|
+
p1 = Post.new(File.join(File.dirname(__FILE__), *%w[source]), '',
|
91
|
+
"2009-01-27-categories.textile")
|
92
|
+
p2 = Post.new(File.join(File.dirname(__FILE__), *%w[source]), '',
|
93
|
+
"2009-01-27-array-categories.textile")
|
94
|
+
|
95
|
+
[p1, p2].each do |p|
|
96
|
+
assert p.categories.include?('foo')
|
97
|
+
assert p.categories.include?('bar')
|
98
|
+
assert p.categories.include?('baz')
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
def test_render
|
103
|
+
p = Post.new(File.join(File.dirname(__FILE__), *%w[source]), '', "2008-10-18-foo-bar.textile")
|
104
|
+
layouts = {"default" => Layout.new(File.join(File.dirname(__FILE__), *%w[source _layouts]), "simple.html")}
|
105
|
+
p.render(layouts, {"site" => {"posts" => []}})
|
106
|
+
|
107
|
+
assert_equal "<<< <h1>Foo Bar</h1>\n<p>Best <strong>post</strong> ever</p> >>>", p.output
|
108
|
+
end
|
109
|
+
|
110
|
+
def test_write
|
111
|
+
clear_dest
|
112
|
+
|
113
|
+
p = Post.new(File.join(File.dirname(__FILE__), *%w[source]), '', "2008-10-18-foo-bar.textile")
|
114
|
+
layouts = {"default" => Layout.new(File.join(File.dirname(__FILE__), *%w[source _layouts]), "simple.html")}
|
115
|
+
p.render(layouts, {"site" => {"posts" => []}})
|
116
|
+
p.write(dest_dir)
|
117
|
+
end
|
118
|
+
|
119
|
+
def test_data
|
120
|
+
p = Post.new(File.join(File.dirname(__FILE__), *%w[source]), '', "2008-11-21-complex.textile")
|
121
|
+
layouts = {"default" => Layout.new(File.join(File.dirname(__FILE__), *%w[source _layouts]), "simple.html")}
|
122
|
+
p.render(layouts, {"site" => {"posts" => []}})
|
123
|
+
|
124
|
+
assert_equal "<<< <p>url: /2008/11/21/complex.html<br />\ndate: #{Time.parse("2008-11-21")}<br />\nid: /2008/11/21/complex</p> >>>", p.output
|
125
|
+
end
|
126
|
+
|
127
|
+
def test_categories_and_topics
|
128
|
+
p = Post.new(File.join(File.dirname(__FILE__), *%w[source]), 'foo', 'bar/2008-12-12-topical-post.textile')
|
129
|
+
assert_equal ['foo'], p.categories
|
130
|
+
assert_equal ['bar'], p.topics
|
131
|
+
end
|
132
|
+
|
133
|
+
def test_include
|
134
|
+
Jekyll.source = File.join(File.dirname(__FILE__), *%w[source])
|
135
|
+
p = Post.new(File.join(File.dirname(__FILE__), *%w[source]), '', "2008-12-13-include.markdown")
|
136
|
+
layouts = {"default" => Layout.new(File.join(File.dirname(__FILE__), *%w[source _layouts]), "simple.html")}
|
137
|
+
p.render(layouts, {"site" => {"posts" => []}})
|
138
|
+
|
139
|
+
assert_equal "<<< <hr />\n<p>Tom Preston-Werner github.com/mojombo</p>\n\n<p>This <em>is</em> cool</p> >>>", p.output
|
140
|
+
end
|
141
|
+
end
|