henshin 0.4.2 → 1.0.0.pre
Sign up to get free protection for your applications and to get access to all the features.
- data/LICENCE +18 -0
- data/README.md +133 -0
- data/Rakefile +6 -51
- data/bin/henshin +127 -134
- data/lib/henshin.rb +163 -38
- data/lib/henshin/compressor.rb +31 -0
- data/lib/henshin/compressors/css.rb +20 -0
- data/lib/henshin/compressors/js.rb +20 -0
- data/lib/henshin/core_ext.rb +69 -0
- data/lib/henshin/error.rb +28 -0
- data/lib/henshin/file.rb +67 -0
- data/lib/henshin/files/abstract.rb +102 -0
- data/lib/henshin/files/attributes.rb +31 -0
- data/lib/henshin/files/empty_template.rb +24 -0
- data/lib/henshin/files/physical.rb +117 -0
- data/lib/henshin/files/post.rb +64 -0
- data/lib/henshin/files/templatable.rb +29 -0
- data/lib/henshin/files/template.rb +45 -0
- data/lib/henshin/files/tilt.rb +50 -0
- data/lib/henshin/files/tilt_template.rb +45 -0
- data/lib/henshin/package.rb +27 -0
- data/lib/henshin/packages/script.rb +23 -0
- data/lib/henshin/packages/style.rb +20 -0
- data/lib/henshin/path.rb +143 -0
- data/lib/henshin/publisher.rb +42 -0
- data/lib/henshin/publishers/sftp.rb +79 -0
- data/lib/henshin/reader.rb +68 -0
- data/lib/henshin/safety.rb +74 -0
- data/lib/henshin/scope.rb +55 -0
- data/lib/henshin/site.rb +291 -228
- data/lib/henshin/ui.rb +35 -0
- data/lib/henshin/version.rb +3 -0
- data/lib/henshin/writer.rb +43 -0
- data/lib/rack/henshin.rb +113 -0
- data/site/assets/scripts/config.js +11 -0
- data/site/assets/styles/_mixins.sass +16 -0
- data/site/assets/styles/screen.sass +198 -0
- data/site/config.yml +13 -0
- data/site/drafts/a-work-in-progress.md +5 -0
- data/site/feed.xml.slim +19 -0
- data/site/index.html.slim +28 -0
- data/site/init.rb +33 -0
- data/site/posts/1-hello-world.md +46 -0
- data/site/posts/2-code-testing.md +36 -0
- data/site/posts/3-style-test.md +80 -0
- data/site/templates/default.slim +11 -0
- data/site/templates/post.slim +30 -0
- data/site/test.html.md +7 -0
- data/spec/helper.rb +70 -0
- data/spec/henshin/compressor_spec.rb +25 -0
- data/spec/henshin/compressors/css_spec.rb +22 -0
- data/spec/henshin/compressors/js_spec.rb +22 -0
- data/spec/henshin/core_ext_spec.rb +59 -0
- data/spec/henshin/error_spec.rb +22 -0
- data/spec/henshin/file_spec.rb +28 -0
- data/spec/henshin/files/abstract_spec.rb +98 -0
- data/spec/henshin/files/attributes_spec.rb +25 -0
- data/spec/henshin/files/empty_template_spec.rb +11 -0
- data/spec/henshin/files/physical_spec.rb +55 -0
- data/spec/henshin/files/post_spec.rb +66 -0
- data/spec/henshin/files/template_spec.rb +53 -0
- data/spec/henshin/files/tilt_spec.rb +59 -0
- data/spec/henshin/package_spec.rb +24 -0
- data/spec/henshin/packages/script_spec.rb +17 -0
- data/spec/henshin/packages/style_spec.rb +17 -0
- data/spec/henshin/path_spec.rb +56 -0
- data/spec/henshin/publisher_spec.rb +44 -0
- data/spec/henshin/publishers/sftp_spec.rb +21 -0
- data/spec/henshin/reader_spec.rb +55 -0
- data/spec/henshin/safety_spec.rb +66 -0
- data/spec/henshin/scope_spec.rb +33 -0
- data/spec/henshin/site_spec.rb +142 -0
- data/spec/henshin/ui_spec.rb +26 -0
- data/spec/henshin/writer_spec.rb +26 -0
- metadata +352 -197
- data/.gitignore +0 -27
- data/LICENSE +0 -20
- data/README.markdown +0 -35
- data/VERSION +0 -1
- data/henshin.gemspec +0 -121
- data/lib/henshin/archive.rb +0 -133
- data/lib/henshin/exec/files.rb +0 -46
- data/lib/henshin/ext.rb +0 -55
- data/lib/henshin/gen.rb +0 -154
- data/lib/henshin/labels.rb +0 -144
- data/lib/henshin/plugin.rb +0 -100
- data/lib/henshin/plugins/highlight.rb +0 -24
- data/lib/henshin/plugins/liquid.rb +0 -61
- data/lib/henshin/plugins/maruku.rb +0 -18
- data/lib/henshin/plugins/sass.rb +0 -24
- data/lib/henshin/plugins/textile.rb +0 -18
- data/lib/henshin/post.rb +0 -156
- data/lib/henshin/static.rb +0 -33
- data/test/helper.rb +0 -44
- data/test/site/css/_reset.sass +0 -34
- data/test/site/css/print.css +0 -12
- data/test/site/css/screen.sass +0 -70
- data/test/site/includes/head.html +0 -1
- data/test/site/index.html +0 -23
- data/test/site/layouts/archive_date.html +0 -20
- data/test/site/layouts/archive_month.html +0 -24
- data/test/site/layouts/archive_year.html +0 -26
- data/test/site/layouts/category_index.html +0 -27
- data/test/site/layouts/category_page.html +0 -20
- data/test/site/layouts/main.html +0 -13
- data/test/site/layouts/post.html +0 -36
- data/test/site/layouts/tag_index.html +0 -27
- data/test/site/layouts/tag_page.html +0 -20
- data/test/site/options.yaml +0 -17
- data/test/site/plugins/test.rb +0 -3
- data/test/site/posts/Testing-Stuff.markdown +0 -14
- data/test/site/posts/Textile-Test.textile +0 -7
- data/test/site/posts/cat/test.markdown +0 -6
- data/test/site/posts/lorem-ipsum.markdown +0 -7
- data/test/site/posts/same-date.markdown +0 -7
- data/test/site/static.html +0 -19
- data/test/suite.rb +0 -4
- data/test/test_gen.rb +0 -98
- data/test/test_options.rb +0 -73
- data/test/test_post.rb +0 -67
- data/test/test_site.rb +0 -197
- data/test/test_static.rb +0 -13
@@ -1,18 +0,0 @@
|
|
1
|
-
require 'maruku'
|
2
|
-
|
3
|
-
module Henshin
|
4
|
-
class MarukuPlugin < Generator
|
5
|
-
|
6
|
-
def initialize(site)
|
7
|
-
@extensions = {:input => ['markdown', 'mkdwn', 'md'],
|
8
|
-
:output => 'html'}
|
9
|
-
@config = {}
|
10
|
-
@priority = 5
|
11
|
-
end
|
12
|
-
|
13
|
-
def generate( content )
|
14
|
-
Maruku.new(content).to_html
|
15
|
-
end
|
16
|
-
|
17
|
-
end
|
18
|
-
end
|
data/lib/henshin/plugins/sass.rb
DELETED
@@ -1,24 +0,0 @@
|
|
1
|
-
require 'sass'
|
2
|
-
|
3
|
-
module Henshin
|
4
|
-
class SassPlugin < Generator
|
5
|
-
|
6
|
-
def initialize(site)
|
7
|
-
@extensions = {:input => ['sass', 'scss'],
|
8
|
-
:output => 'css'}
|
9
|
-
@config = {'ignore_layouts' => true,
|
10
|
-
'style' => :nested,
|
11
|
-
'load_paths' => Dir.glob((site.root + '*').to_s),
|
12
|
-
'syntax' => :sass}
|
13
|
-
|
14
|
-
@config.merge!(site.config['sass']) if site.config['sass']
|
15
|
-
|
16
|
-
@priority = 5
|
17
|
-
end
|
18
|
-
|
19
|
-
def generate( content )
|
20
|
-
Sass::Engine.new(content, @config.to_options).render
|
21
|
-
end
|
22
|
-
|
23
|
-
end
|
24
|
-
end
|
@@ -1,18 +0,0 @@
|
|
1
|
-
require 'redcloth'
|
2
|
-
|
3
|
-
module Henshin
|
4
|
-
class TextilePlugin < Generator
|
5
|
-
|
6
|
-
def initialize(site)
|
7
|
-
@extensions = {:input => ['textile'],
|
8
|
-
:output => 'html'}
|
9
|
-
@config = {}
|
10
|
-
@priority = 5
|
11
|
-
end
|
12
|
-
|
13
|
-
def generate( content )
|
14
|
-
RedCloth.new(content).to_html
|
15
|
-
end
|
16
|
-
|
17
|
-
end
|
18
|
-
end
|
data/lib/henshin/post.rb
DELETED
@@ -1,156 +0,0 @@
|
|
1
|
-
module Henshin
|
2
|
-
|
3
|
-
class Post < Gen
|
4
|
-
|
5
|
-
attr_accessor :path, :data, :content, :site, :layout, :generators
|
6
|
-
|
7
|
-
def initialize( path, site )
|
8
|
-
@path = path
|
9
|
-
@site = site
|
10
|
-
|
11
|
-
@content = ''
|
12
|
-
@data = {}
|
13
|
-
@generators = []
|
14
|
-
|
15
|
-
@data['input'] = @path.extname[1..-1]
|
16
|
-
end
|
17
|
-
|
18
|
-
|
19
|
-
##
|
20
|
-
# Reads the file
|
21
|
-
def read
|
22
|
-
self.read_name
|
23
|
-
self.read_file if @path.exist?
|
24
|
-
self.get_generators
|
25
|
-
self.get_layout
|
26
|
-
|
27
|
-
# now tidy up data
|
28
|
-
@data['output'] ||= @data['input']
|
29
|
-
@data['date'] = Time.parse(@data['date'])
|
30
|
-
@data['tags'] = @data['tags'].flatten.uniq if @data['tags']
|
31
|
-
self
|
32
|
-
end
|
33
|
-
|
34
|
-
# Reads the filename and extracts information from it
|
35
|
-
def read_name
|
36
|
-
|
37
|
-
result = Parsey.parse(@path.to_s[(@site.root + 'posts').to_s.size..-1], @site.config['file_name'], Partials)
|
38
|
-
|
39
|
-
result.each do |k, v|
|
40
|
-
unless v.nil?
|
41
|
-
case k
|
42
|
-
when 'title-with-dashes'
|
43
|
-
@data['title'] = v.gsub(/-/, ' ').titlecase
|
44
|
-
when 'title'
|
45
|
-
@data['title'] = v.titlecase
|
46
|
-
else
|
47
|
-
@data[k] = v
|
48
|
-
end
|
49
|
-
end
|
50
|
-
end
|
51
|
-
|
52
|
-
end
|
53
|
-
|
54
|
-
# Creates the data to be sent to the layout engine
|
55
|
-
#
|
56
|
-
# @return [Hash] the payload for the layout engine
|
57
|
-
def payload
|
58
|
-
r = {
|
59
|
-
'yield' => @content,
|
60
|
-
'site' => @site.payload['site'],
|
61
|
-
'post' => self.to_hash
|
62
|
-
}
|
63
|
-
#r['post']['next'] = self.next.to_hash if self.next
|
64
|
-
#r['post']['prev'] = self.prev.to_hash if self.prev
|
65
|
-
r
|
66
|
-
end
|
67
|
-
|
68
|
-
# Turns all of the post data into a hash
|
69
|
-
#
|
70
|
-
# @return [Hash]
|
71
|
-
def to_hash
|
72
|
-
if @hashed
|
73
|
-
@hashed
|
74
|
-
else
|
75
|
-
@hashed = @data.dup
|
76
|
-
@hashed['content'] = @content
|
77
|
-
@hashed['url'] = self.url
|
78
|
-
@hashed['permalink'] = self.permalink
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
if @data['tags']
|
83
|
-
@hashed['tags'] = []
|
84
|
-
@site.tags.select{|t| @data['tags'].include?(t.name)}.each do |tag|
|
85
|
-
# can't call Tag#to_hash or it creates an infinite loop!
|
86
|
-
@hashed['tags'] << {'name' => tag.name, 'url' => tag.url}
|
87
|
-
end
|
88
|
-
end
|
89
|
-
|
90
|
-
if @data['category']
|
91
|
-
@site.categories.each do |cat|
|
92
|
-
if cat.name == @data['category']
|
93
|
-
@hashed['category'] = {'name' => cat.name, 'url' => cat.url}
|
94
|
-
end
|
95
|
-
end
|
96
|
-
end
|
97
|
-
|
98
|
-
@hashed
|
99
|
-
end
|
100
|
-
end
|
101
|
-
|
102
|
-
# Gets the post after this one
|
103
|
-
#
|
104
|
-
# @return [Post] next post
|
105
|
-
def next
|
106
|
-
if i = @site.posts.index(self)
|
107
|
-
if i < @site.posts.size - 1
|
108
|
-
@site.posts[i+1]
|
109
|
-
else
|
110
|
-
nil
|
111
|
-
end
|
112
|
-
end
|
113
|
-
end
|
114
|
-
|
115
|
-
# Gets the post before this one
|
116
|
-
#
|
117
|
-
# @return [Post] previous post
|
118
|
-
def prev
|
119
|
-
if i = @site.posts.index(self)
|
120
|
-
if i > 0
|
121
|
-
@site.posts[i-1]
|
122
|
-
else
|
123
|
-
nil
|
124
|
-
end
|
125
|
-
end
|
126
|
-
end
|
127
|
-
|
128
|
-
# @return [String] the permalink of the post
|
129
|
-
def permalink
|
130
|
-
partials = {'year' => @data['date'].year,
|
131
|
-
'month' => @data['date'].month,
|
132
|
-
'date' => @data['date'].day,
|
133
|
-
'title' => @data['title'].slugify,
|
134
|
-
'category' => @data['category'] || ''}
|
135
|
-
|
136
|
-
perm = @site.config['permalink'].gsub(/\{([a-z-]+)\}/) { partials[$1] }
|
137
|
-
File.join(@site.base, perm)
|
138
|
-
end
|
139
|
-
|
140
|
-
# Sorts on date first, then permalink if dates are equal
|
141
|
-
def <=>(other)
|
142
|
-
s = @data['date'] <=> other.data['date']
|
143
|
-
if s == 0
|
144
|
-
self.permalink <=> other.permalink
|
145
|
-
else
|
146
|
-
s
|
147
|
-
end
|
148
|
-
end
|
149
|
-
|
150
|
-
def inspect
|
151
|
-
"#<Post:#{@path}>"
|
152
|
-
end
|
153
|
-
|
154
|
-
end
|
155
|
-
|
156
|
-
end
|
data/lib/henshin/static.rb
DELETED
@@ -1,33 +0,0 @@
|
|
1
|
-
module Henshin
|
2
|
-
|
3
|
-
class Static
|
4
|
-
|
5
|
-
attr_accessor :path, :site, :content
|
6
|
-
|
7
|
-
def initialize( path, site )
|
8
|
-
@path = path
|
9
|
-
@site = site
|
10
|
-
@content = File.read(path)
|
11
|
-
end
|
12
|
-
|
13
|
-
##
|
14
|
-
# Writes the file to the correct place
|
15
|
-
def write
|
16
|
-
FileUtils.mkdir_p(self.write_path.dirname)
|
17
|
-
file = File.new(self.write_path, "w")
|
18
|
-
file.puts(@content)
|
19
|
-
end
|
20
|
-
|
21
|
-
# @return [Pathname] path to write the file
|
22
|
-
def write_path
|
23
|
-
rel = @path.relative_path_from(@site.root)
|
24
|
-
@site.target + File.join(@site.base, rel)[1..-1]
|
25
|
-
end
|
26
|
-
|
27
|
-
def inspect
|
28
|
-
"#<Static:#{@path}>"
|
29
|
-
end
|
30
|
-
|
31
|
-
end
|
32
|
-
|
33
|
-
end
|
data/test/helper.rb
DELETED
@@ -1,44 +0,0 @@
|
|
1
|
-
require 'test/unit'
|
2
|
-
require 'shoulda'
|
3
|
-
require 'rr'
|
4
|
-
|
5
|
-
require File.dirname(__FILE__) + '/../lib/henshin'
|
6
|
-
|
7
|
-
class Test::Unit::TestCase
|
8
|
-
|
9
|
-
include RR::Adapters::TestUnit
|
10
|
-
|
11
|
-
def site_override
|
12
|
-
{'root' => root_dir, 'target' => target_dir}
|
13
|
-
end
|
14
|
-
|
15
|
-
def root_dir
|
16
|
-
File.join(File.dirname(__FILE__), 'site')
|
17
|
-
end
|
18
|
-
|
19
|
-
def target_dir
|
20
|
-
File.join(root_dir, "_site")
|
21
|
-
end
|
22
|
-
|
23
|
-
def remove_site
|
24
|
-
FileUtils.rm_rf(File.join(root_dir, target_dir))
|
25
|
-
end
|
26
|
-
|
27
|
-
def new_site
|
28
|
-
Henshin::Site.new(site_override)
|
29
|
-
end
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
# Determines whether +instance+ is a +klass+ using #is_a?.
|
34
|
-
# This is similar to assert_instance_of except it doesn't
|
35
|
-
# have to be an instance of +klass+ just an instance of a
|
36
|
-
# decendant of +klass+.
|
37
|
-
#
|
38
|
-
# @param [Class] klass the klass to test for
|
39
|
-
# @param [Object] instance of the object to test
|
40
|
-
def assert_is_a(klass, instance)
|
41
|
-
assert instance.is_a?(klass), "Expected #{instance} to be a #{klass}"
|
42
|
-
end
|
43
|
-
|
44
|
-
end
|
data/test/site/css/_reset.sass
DELETED
@@ -1,34 +0,0 @@
|
|
1
|
-
body, div, dl, dt, dd, ul, ol, li, h1, h2, h3, h4, h5, h6, pre, form, fieldset, input, textarea, p, blockquote, th, td
|
2
|
-
margin: 0
|
3
|
-
padding: 0
|
4
|
-
|
5
|
-
table
|
6
|
-
border-collapse: collapse
|
7
|
-
border-spacing: 0
|
8
|
-
|
9
|
-
fieldset, img
|
10
|
-
border: 0
|
11
|
-
|
12
|
-
address, caption, cite, code, dfn, em, strong, th, var
|
13
|
-
font-style: normal
|
14
|
-
font-weight: normal
|
15
|
-
|
16
|
-
ol, ul
|
17
|
-
list-style: none
|
18
|
-
|
19
|
-
caption, th
|
20
|
-
text-align: left
|
21
|
-
|
22
|
-
h1, h2, h3, h4, h5, h6
|
23
|
-
font-size: 100%
|
24
|
-
font-weight: normal
|
25
|
-
|
26
|
-
q
|
27
|
-
&:before, &:after
|
28
|
-
content: ”
|
29
|
-
|
30
|
-
abbr, acronym
|
31
|
-
border: 0
|
32
|
-
|
33
|
-
h1
|
34
|
-
font-size: 2em
|
data/test/site/css/print.css
DELETED
@@ -1,12 +0,0 @@
|
|
1
|
-
body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,form,fieldset,input,textarea,p,
|
2
|
-
blockquote,th,td {margin:0; padding:0; }
|
3
|
-
table { border-collapse:collapse; border-spacing:0; }
|
4
|
-
fieldset,img { border:0; }
|
5
|
-
address,caption,cite,code,dfn,em,strong,th,var { font-style:normal; font-weight:normal; }
|
6
|
-
ol,ul { list-style:none; }
|
7
|
-
caption,th { text-align:left; }
|
8
|
-
h1,h2,h3,h4,h5,h6 { font-size:100%; font-weight:normal; }
|
9
|
-
q:before,q:after { content:”; }
|
10
|
-
abbr,acronym { border:0; }html {font-size: 62.5%;}p {font-size: 1.2em;}
|
11
|
-
h1 {font-size: 2em;}
|
12
|
-
a:hover, a:active { outline: none; }
|
data/test/site/css/screen.sass
DELETED
@@ -1,70 +0,0 @@
|
|
1
|
-
@import _reset.sass
|
2
|
-
|
3
|
-
body
|
4
|
-
width: 500px
|
5
|
-
margin: 20px
|
6
|
-
background: rgb(254, 254, 254)
|
7
|
-
line-height: 20px
|
8
|
-
font:
|
9
|
-
family: Helvetica, Arial, sans-serif
|
10
|
-
size: 16px
|
11
|
-
|
12
|
-
h1, h2
|
13
|
-
color: rgb(50, 50, 50)
|
14
|
-
line-height: 32px
|
15
|
-
font:
|
16
|
-
size: 22px
|
17
|
-
weight: bold
|
18
|
-
|
19
|
-
h2
|
20
|
-
font-size: 18px
|
21
|
-
|
22
|
-
p, ul, ol, pre
|
23
|
-
margin: 16px 0
|
24
|
-
|
25
|
-
a
|
26
|
-
color: rgb(20, 20, 180)
|
27
|
-
|
28
|
-
b, strong
|
29
|
-
font-weight: bold
|
30
|
-
|
31
|
-
i, em
|
32
|
-
font-style: italic
|
33
|
-
|
34
|
-
pre
|
35
|
-
background: rgb(240, 240, 245)
|
36
|
-
border: 1px solid rgb(200, 200, 202)
|
37
|
-
|
38
|
-
code
|
39
|
-
line-height: 13px
|
40
|
-
font:
|
41
|
-
family: Menlo
|
42
|
-
size: 13px
|
43
|
-
|
44
|
-
ul
|
45
|
-
time
|
46
|
-
font:
|
47
|
-
family: Menlo, monospace
|
48
|
-
size: 13px
|
49
|
-
|
50
|
-
&.tags
|
51
|
-
display: inline
|
52
|
-
li
|
53
|
-
float: left
|
54
|
-
margin: 0 5px
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
// code highlighting
|
59
|
-
code
|
60
|
-
.k
|
61
|
-
color: red
|
62
|
-
|
63
|
-
.nb
|
64
|
-
color: blue
|
65
|
-
|
66
|
-
.nf
|
67
|
-
color: green
|
68
|
-
|
69
|
-
.s2
|
70
|
-
color: grey
|
@@ -1 +0,0 @@
|
|
1
|
-
<link rel="stylesheet" href="/css/screen.css" type="text/css" />
|
data/test/site/index.html
DELETED
@@ -1,23 +0,0 @@
|
|
1
|
-
---
|
2
|
-
layout: main
|
3
|
-
title: Home Page
|
4
|
-
---
|
5
|
-
|
6
|
-
<header>
|
7
|
-
<h1>{{ gen.title }}</h1>
|
8
|
-
</header>
|
9
|
-
|
10
|
-
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
|
11
|
-
<hr/>
|
12
|
-
|
13
|
-
<h2>Posts</h2>
|
14
|
-
<ul>
|
15
|
-
{% for post in site.posts %}
|
16
|
-
<li><time>{{ post.date | date_to_string }}</time> - <a href="{{ post.url }}">{{ post.title }}</a></li>
|
17
|
-
{% endfor %}
|
18
|
-
</ul>
|
19
|
-
|
20
|
-
<ul>
|
21
|
-
<li><a href="/category/">Categories</a></li>
|
22
|
-
<li><a href="/tag/">Tags</a></li>
|
23
|
-
</ul>
|