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.
Files changed (122) hide show
  1. data/LICENCE +18 -0
  2. data/README.md +133 -0
  3. data/Rakefile +6 -51
  4. data/bin/henshin +127 -134
  5. data/lib/henshin.rb +163 -38
  6. data/lib/henshin/compressor.rb +31 -0
  7. data/lib/henshin/compressors/css.rb +20 -0
  8. data/lib/henshin/compressors/js.rb +20 -0
  9. data/lib/henshin/core_ext.rb +69 -0
  10. data/lib/henshin/error.rb +28 -0
  11. data/lib/henshin/file.rb +67 -0
  12. data/lib/henshin/files/abstract.rb +102 -0
  13. data/lib/henshin/files/attributes.rb +31 -0
  14. data/lib/henshin/files/empty_template.rb +24 -0
  15. data/lib/henshin/files/physical.rb +117 -0
  16. data/lib/henshin/files/post.rb +64 -0
  17. data/lib/henshin/files/templatable.rb +29 -0
  18. data/lib/henshin/files/template.rb +45 -0
  19. data/lib/henshin/files/tilt.rb +50 -0
  20. data/lib/henshin/files/tilt_template.rb +45 -0
  21. data/lib/henshin/package.rb +27 -0
  22. data/lib/henshin/packages/script.rb +23 -0
  23. data/lib/henshin/packages/style.rb +20 -0
  24. data/lib/henshin/path.rb +143 -0
  25. data/lib/henshin/publisher.rb +42 -0
  26. data/lib/henshin/publishers/sftp.rb +79 -0
  27. data/lib/henshin/reader.rb +68 -0
  28. data/lib/henshin/safety.rb +74 -0
  29. data/lib/henshin/scope.rb +55 -0
  30. data/lib/henshin/site.rb +291 -228
  31. data/lib/henshin/ui.rb +35 -0
  32. data/lib/henshin/version.rb +3 -0
  33. data/lib/henshin/writer.rb +43 -0
  34. data/lib/rack/henshin.rb +113 -0
  35. data/site/assets/scripts/config.js +11 -0
  36. data/site/assets/styles/_mixins.sass +16 -0
  37. data/site/assets/styles/screen.sass +198 -0
  38. data/site/config.yml +13 -0
  39. data/site/drafts/a-work-in-progress.md +5 -0
  40. data/site/feed.xml.slim +19 -0
  41. data/site/index.html.slim +28 -0
  42. data/site/init.rb +33 -0
  43. data/site/posts/1-hello-world.md +46 -0
  44. data/site/posts/2-code-testing.md +36 -0
  45. data/site/posts/3-style-test.md +80 -0
  46. data/site/templates/default.slim +11 -0
  47. data/site/templates/post.slim +30 -0
  48. data/site/test.html.md +7 -0
  49. data/spec/helper.rb +70 -0
  50. data/spec/henshin/compressor_spec.rb +25 -0
  51. data/spec/henshin/compressors/css_spec.rb +22 -0
  52. data/spec/henshin/compressors/js_spec.rb +22 -0
  53. data/spec/henshin/core_ext_spec.rb +59 -0
  54. data/spec/henshin/error_spec.rb +22 -0
  55. data/spec/henshin/file_spec.rb +28 -0
  56. data/spec/henshin/files/abstract_spec.rb +98 -0
  57. data/spec/henshin/files/attributes_spec.rb +25 -0
  58. data/spec/henshin/files/empty_template_spec.rb +11 -0
  59. data/spec/henshin/files/physical_spec.rb +55 -0
  60. data/spec/henshin/files/post_spec.rb +66 -0
  61. data/spec/henshin/files/template_spec.rb +53 -0
  62. data/spec/henshin/files/tilt_spec.rb +59 -0
  63. data/spec/henshin/package_spec.rb +24 -0
  64. data/spec/henshin/packages/script_spec.rb +17 -0
  65. data/spec/henshin/packages/style_spec.rb +17 -0
  66. data/spec/henshin/path_spec.rb +56 -0
  67. data/spec/henshin/publisher_spec.rb +44 -0
  68. data/spec/henshin/publishers/sftp_spec.rb +21 -0
  69. data/spec/henshin/reader_spec.rb +55 -0
  70. data/spec/henshin/safety_spec.rb +66 -0
  71. data/spec/henshin/scope_spec.rb +33 -0
  72. data/spec/henshin/site_spec.rb +142 -0
  73. data/spec/henshin/ui_spec.rb +26 -0
  74. data/spec/henshin/writer_spec.rb +26 -0
  75. metadata +352 -197
  76. data/.gitignore +0 -27
  77. data/LICENSE +0 -20
  78. data/README.markdown +0 -35
  79. data/VERSION +0 -1
  80. data/henshin.gemspec +0 -121
  81. data/lib/henshin/archive.rb +0 -133
  82. data/lib/henshin/exec/files.rb +0 -46
  83. data/lib/henshin/ext.rb +0 -55
  84. data/lib/henshin/gen.rb +0 -154
  85. data/lib/henshin/labels.rb +0 -144
  86. data/lib/henshin/plugin.rb +0 -100
  87. data/lib/henshin/plugins/highlight.rb +0 -24
  88. data/lib/henshin/plugins/liquid.rb +0 -61
  89. data/lib/henshin/plugins/maruku.rb +0 -18
  90. data/lib/henshin/plugins/sass.rb +0 -24
  91. data/lib/henshin/plugins/textile.rb +0 -18
  92. data/lib/henshin/post.rb +0 -156
  93. data/lib/henshin/static.rb +0 -33
  94. data/test/helper.rb +0 -44
  95. data/test/site/css/_reset.sass +0 -34
  96. data/test/site/css/print.css +0 -12
  97. data/test/site/css/screen.sass +0 -70
  98. data/test/site/includes/head.html +0 -1
  99. data/test/site/index.html +0 -23
  100. data/test/site/layouts/archive_date.html +0 -20
  101. data/test/site/layouts/archive_month.html +0 -24
  102. data/test/site/layouts/archive_year.html +0 -26
  103. data/test/site/layouts/category_index.html +0 -27
  104. data/test/site/layouts/category_page.html +0 -20
  105. data/test/site/layouts/main.html +0 -13
  106. data/test/site/layouts/post.html +0 -36
  107. data/test/site/layouts/tag_index.html +0 -27
  108. data/test/site/layouts/tag_page.html +0 -20
  109. data/test/site/options.yaml +0 -17
  110. data/test/site/plugins/test.rb +0 -3
  111. data/test/site/posts/Testing-Stuff.markdown +0 -14
  112. data/test/site/posts/Textile-Test.textile +0 -7
  113. data/test/site/posts/cat/test.markdown +0 -6
  114. data/test/site/posts/lorem-ipsum.markdown +0 -7
  115. data/test/site/posts/same-date.markdown +0 -7
  116. data/test/site/static.html +0 -19
  117. data/test/suite.rb +0 -4
  118. data/test/test_gen.rb +0 -98
  119. data/test/test_options.rb +0 -73
  120. data/test/test_post.rb +0 -67
  121. data/test/test_site.rb +0 -197
  122. 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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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; }
@@ -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" />
@@ -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>