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
@@ -0,0 +1,19 @@
1
+ ---
2
+ template: none
3
+ permalink: /feed.xml
4
+ ---
5
+
6
+ doctype xml
7
+ rss version='2.0' xmlns:atom="http://www.w3.org/2005/Atom"
8
+ channel
9
+ atom:link rel='self' type='application/rss+xml' href=(site.url + permalink)
10
+ title = site.title
11
+ link = site.url
12
+ description = site.description
13
+
14
+ - for post in site.posts.take(10)
15
+ item
16
+ title = post.title
17
+ description = post.text
18
+ pubDate = post.rss_date
19
+ link = site.url + post.url.to_s
@@ -0,0 +1,28 @@
1
+ header
2
+ h1 = site.title
3
+
4
+ ul.list
5
+ h3 Posts
6
+ - for post in site.posts do
7
+ - if post.published?
8
+ li
9
+ a href=post.url = post.title
10
+ - else
11
+ li#draft
12
+ a href=post.url = post.title
13
+
14
+
15
+ - if site.projects
16
+
17
+ ul.list
18
+ h3 Projects
19
+ - for project in site.projects do
20
+ li
21
+ a href=project.url = project.title
22
+ span — #{project.desc}
23
+
24
+
25
+ - if site.description
26
+
27
+ h3 About
28
+ = site.description
@@ -0,0 +1,33 @@
1
+ # -*- coding: utf-8 -*-
2
+ # Edits the output from markdown files to work with SyntaxHighlighter.
3
+
4
+ class ModifiedRedcarpetFile < File::TiltWithTemplate
5
+ def text
6
+ super.gsub /<code class="(.*)">/ do
7
+ "<code class='brush: #{$1}'>"
8
+ end
9
+ end
10
+ end
11
+
12
+ File.register /\.(md|mkd|markdown)\Z/, ModifiedRedcarpetFile
13
+
14
+ module Helpers
15
+ def format_date(date)
16
+ date.strftime("%B %e, %Y")
17
+ end
18
+
19
+ def truncate(text, len=50, with='…')
20
+ return text if text.length <= len
21
+
22
+ str = ''
23
+ text.split(' ').each do |word|
24
+ if (str + word).length <= len
25
+ str += ' ' + word
26
+ else
27
+ break
28
+ end
29
+ end
30
+
31
+ str + with
32
+ end
33
+ end
@@ -0,0 +1,46 @@
1
+ ---
2
+ title: Hello World
3
+ date: 2012-03-01
4
+ ---
5
+
6
+ Maecenas lacinia pharetra porta. Praesent turpis purus, vestibulum a molestie
7
+ id, lobortis a massa. Suspendisse potenti. Fusce in molestie augue. Sed at mi at
8
+ nulla pulvinar auctor in sed urna. Vivamus euismod massa vitae mi sollicitudin
9
+ vel scelerisque magna euismod. Nam sit amet dolor eu nulla bibendum facilisis a
10
+ eget felis. Suspendisse vitae est ac mi pharetra interdum vel eget
11
+ turpis. Curabitur rutrum lectus nec odio porttitor placerat. Maecenas quis
12
+ turpis eget magna rhoncus vehicula lacinia sit amet metus. Nulla pretium
13
+ lobortis cursus. Nullam eu odio eget nibh vehicula tristique vitae eget
14
+ nisi. Suspendisse eget nisl ac turpis rutrum posuere. Aliquam volutpat magna et
15
+ libero interdum at malesuada felis imperdiet. Sed porttitor consectetur augue,
16
+ eu eleifend sem tincidunt eu.
17
+
18
+ Etiam ut diam id risus dictum tempus vitae sed tellus. Quisque felis orci,
19
+ ultricies et elementum quis, consequat sit amet lorem. Sed convallis ipsum sed
20
+ tellus consectetur eget volutpat dui lacinia. Praesent vitae pretium
21
+ tortor. Proin sed nisi arcu. Cras id tortor odio. Praesent sed augue non elit
22
+ congue ultrices.
23
+
24
+ Cras aliquam tempus purus, commodo lacinia ante vulputate blandit. Vestibulum
25
+ felis tellus, vestibulum in accumsan at, egestas in velit. Suspendisse
26
+ potenti. Curabitur pulvinar sollicitudin auctor. Fusce nec quam mi. Nulla
27
+ lobortis hendrerit turpis, eu malesuada mi volutpat nec. Quisque velit lectus,
28
+ aliquet nec vulputate pretium, elementum et purus. Fusce non metus nec ipsum
29
+ ultricies laoreet id eu mauris. Sed suscipit nisl lectus, id pulvinar sem. In
30
+ hac habitasse platea dictumst. Proin lacus quam, hendrerit eget ultricies
31
+ venenatis, lobortis quis est. Maecenas elementum malesuada libero in
32
+ euismod. Vestibulum sodales turpis quis felis fringilla luctus.
33
+
34
+ Donec eu magna arcu, ut varius nisi. Donec at metus lectus, at lacinia
35
+ lacus. Duis eu arcu mi. Fusce vel dolor a justo mattis accumsan. Nunc ac quam
36
+ ligula. Etiam vulputate malesuada justo. Proin hendrerit ultrices libero quis
37
+ consequat. Nunc sollicitudin cursus posuere. Fusce id elit et eros facilisis
38
+ rhoncus. Aliquam non lorem ipsum, tempor ullamcorper sapien.
39
+
40
+ Nullam fringilla convallis diam ut semper. Praesent rutrum varius
41
+ ultricies. Morbi sed ipsum erat, sit amet aliquam turpis. Quisque bibendum enim
42
+ sit amet nisi dignissim nec condimentum sem auctor. Nunc ut orci nec turpis
43
+ cursus posuere. Suspendisse aliquet tempor urna a ultrices. Maecenas pretium
44
+ convallis lectus. Vivamus ornare libero at lectus ultrices gravida. Ut et orci
45
+ id est interdum tempor ut nec quam. Vestibulum in risus et sem semper
46
+ ullamcorper dignissim ac lectus. Praesent placerat semper erat sed congue.
@@ -0,0 +1,36 @@
1
+ ---
2
+ title: Code Testing
3
+ date: 2012-03-05
4
+ ---
5
+
6
+ A test of the code highlighting abilities. This is from henshin past.
7
+
8
+ ``` ruby
9
+ require 'henshin/plugin'
10
+ require 'liquid'
11
+
12
+ class LiquidPlugin < Henshin::LayoutParser
13
+
14
+ attr_accessor :extensions
15
+
16
+ def initialize
17
+ @extensions = []
18
+ end
19
+
20
+ def generate( layout, data )
21
+ t = Liquid::Template.parse( read(layout) )
22
+ t.render(data)
23
+ end
24
+
25
+ # returns the layout as a string
26
+ def read( file )
27
+ f = File.open(file, "r")
28
+ r = ""
29
+ f.each do |l|
30
+ r << l
31
+ end
32
+ r
33
+ end
34
+
35
+ end
36
+ ```
@@ -0,0 +1,80 @@
1
+ ---
2
+ title: Style Test
3
+ date: 2012-03-12
4
+ ---
5
+
6
+ Maecenas <http://google.com> lacinia pharetra porta. Praesent turpis purus,
7
+ vestibulum a molestie id, lobortis a massa. Suspendisse potenti. Fusce in
8
+ molestie augue. Sed at mi at nulla pulvinar auctor in sed urna. Vivamus euismod
9
+ massa vitae mi sollicitudin vel scelerisque magna euismod. Nam sit amet dolor eu
10
+ nulla bibendum facilisis a eget felis. Suspendisse vitae est ac mi pharetra
11
+ interdum vel eget turpis. Curabitur rutrum lectus nec odio porttitor
12
+ placerat. Maecenas quis turpis eget magna rhoncus vehicula lacinia sit amet
13
+ metus. Nulla pretium lobortis cursus. Nullam eu odio eget nibh vehicula
14
+ tristique vitae eget nisi. Suspendisse eget nisl ac turpis rutrum
15
+ posuere. Aliquam volutpat magna et libero interdum at malesuada felis
16
+ imperdiet. Sed porttitor consectetur augue, eu eleifend sem tincidunt eu.
17
+
18
+ `<html>` Etiam ut __diam__ id risus dictum tempus *vitae* sed tellus. Quisque felis
19
+ orci, ultricies et elementum quis, consequat sit amet lorem. Sed convallis ipsum
20
+ sed tellus consectetur eget volutpat dui lacinia. Praesent vitae pretium
21
+ tortor. Proin sed nisi arcu. Cras id tortor odio. Praesent sed augue non elit
22
+ congue ultrices.
23
+
24
+ > Cras aliquam tempus purus, commodo lacinia ante vulputate blandit. Vestibulum
25
+ > felis tellus, vestibulum in accumsan at, egestas in velit. Suspendisse
26
+ > potenti. Curabitur pulvinar sollicitudin auctor. Fusce nec quam mi. Nulla
27
+ > lobortis hendrerit turpis, eu malesuada mi volutpat nec. Quisque velit lectus,
28
+ > aliquet nec vulputate pretium, elementum et purus. Fusce non metus nec ipsum
29
+ > ultricies laoreet id eu mauris. Sed suscipit nisl lectus, id pulvinar sem. In
30
+ > hac habitasse platea dictumst. Proin lacus quam, hendrerit eget ultricies
31
+ > venenatis, lobortis quis est. Maecenas elementum malesuada libero in
32
+ > euismod. Vestibulum sodales turpis quis felis fringilla luctus.
33
+
34
+ Donec eu magna arcu, ut varius nisi. Donec at metus lectus, at lacinia
35
+ lacus. Duis eu arcu mi. Fusce vel dolor a justo mattis accumsan. Nunc ac quam
36
+ ligula. Etiam vulputate malesuada justo. Proin hendrerit ultrices libero quis
37
+ consequat. Nunc sollicitudin cursus posuere. Fusce id elit et eros facilisis
38
+ rhoncus. Aliquam non lorem ipsum, tempor ullamcorper sapien.
39
+
40
+ ## Ham Sandwich
41
+
42
+ ### Ingredients
43
+
44
+ - Ham
45
+ - Bread
46
+ - Butter
47
+
48
+ ### Tools
49
+
50
+ - Hands
51
+ - Knife
52
+
53
+ ### Method
54
+
55
+ 1. Take knife, use to butter bread.
56
+ 2. Put ham on one slice of bread.
57
+ 3. Put other slice on top.
58
+ 4. Enjoy.
59
+
60
+ ### Opinions
61
+
62
+ Nullam fringilla convallis diam ut semper. Praesent rutrum varius
63
+ ultricies. Morbi sed ipsum erat, sit amet aliquam turpis. Quisque bibendum enim
64
+ sit amet nisi dignissim nec condimentum sem auctor. Nunc ut orci nec turpis
65
+ cursus posuere. Suspendisse aliquet tempor urna a ultrices. Maecenas pretium
66
+ convallis lectus. Vivamus ornare libero at lectus ultrices gravida. Ut et orci
67
+ id est interdum tempor ut nec quam. Vestibulum in risus et sem semper
68
+ ullamcorper dignissim ac lectus. Praesent placerat semper erat sed congue.
69
+
70
+ - - -
71
+
72
+ Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus
73
+ mus. Duis viverra ante id orci rhoncus hendrerit. Morbi lacinia nunc at mauris
74
+ laoreet facilisis ac quis lacus. Integer ornare eros sit amet lacus convallis
75
+ vulputate hendrerit diam gravida. Nullam sit amet blandit enim. Ut in vehicula
76
+ tortor. Cras id augue vitae turpis sodales varius. Donec viverra imperdiet
77
+ lectus quis tempus. Mauris eu magna enim, sit amet porta dolor. Fusce accumsan,
78
+ felis non pellentesque fringilla, sem risus convallis eros, dapibus faucibus
79
+ purus sem eu arcu. Aliquam dignissim dapibus eros. Etiam eu dui sapien, vel
80
+ ullamcorper diam.
@@ -0,0 +1,11 @@
1
+ doctype html
2
+ html lang='en'
3
+ head
4
+ meta charset='utf-8'
5
+ link rel='stylesheet' href=site.style.url
6
+ title = (title || site.title)
7
+
8
+ body
9
+ == yield
10
+
11
+ script src=site.script.url
@@ -0,0 +1,30 @@
1
+ doctype html
2
+ html lang='en'
3
+ head
4
+ meta charset='utf-8'
5
+ link rel='stylesheet' href=site.style.url
6
+ title = title
7
+
8
+ body onload="window.scrollBy(0,54);"
9
+
10
+ nav
11
+ - if prev_post
12
+ a.prev href=prev_post.url &larr; #{truncate(prev_post.title, 25)}
13
+
14
+ a.home href=site.root Home
15
+
16
+ - if next_post
17
+ a.next href=next_post.url #{truncate(next_post.title, 25)} &rarr;
18
+
19
+ header
20
+ h1 = title
21
+
22
+ == yield
23
+
24
+ div.meta
25
+ span.date
26
+ ' &mdash; #{format_date(date)}
27
+
28
+ script src='http://alexgorbatchev.com/pub/sh/current/scripts/shCore.js'
29
+ script src='http://alexgorbatchev.com/pub/sh/current/scripts/shAutoloader.js'
30
+ script src=site.script.url
@@ -0,0 +1,7 @@
1
+ ---
2
+ title: A test of a single markdown file
3
+ ---
4
+
5
+ # A test of a single markdown file
6
+
7
+ So this should be nicely inserted into the correct (`default`) template!
@@ -0,0 +1,70 @@
1
+ $: << File.dirname(__FILE__) + '/..'
2
+
3
+ begin
4
+ require 'duvet'
5
+ Duvet.start :filter => 'lib/henshin'
6
+ rescue LoadError => e
7
+ # Doesn't matter if duvet doesn't run
8
+ warn 'Problem with duvet?'
9
+ raise e
10
+ end
11
+
12
+ gem 'minitest'
13
+ require 'minitest/autorun'
14
+ require 'minitest/pride'
15
+ require 'mocha'
16
+ require 'lib/henshin'
17
+
18
+ Henshin.set :dry_run
19
+
20
+ def with_writing!
21
+ Henshin.unset :dry_run
22
+ yield
23
+ Henshin.set :dry_run
24
+ end
25
+
26
+ def with_profiling!
27
+ Henshin.set :profile
28
+ yield
29
+ Henshin.unset :profile
30
+ end
31
+
32
+
33
+ class DummySite < Henshin::Site
34
+ def config
35
+ {}
36
+ end
37
+ end
38
+
39
+ def test_path
40
+ Pathname.new(__FILE__).dirname + '..' + 'site'
41
+ end
42
+
43
+ def test_site
44
+ Henshin::Site.new test_path
45
+ end
46
+
47
+
48
+ # For some reason, must_be and wont_be don't work properly using MiniTest 3.0.0.
49
+ module MiniTest::Expectations
50
+
51
+ alias_method :_must_be, :must_be
52
+ alias_method :_wont_be, :wont_be
53
+
54
+ def must_be(*args)
55
+ if args.size == 1
56
+ self.send(args.first).must_equal true
57
+ else
58
+ _must_be *args
59
+ end
60
+ end
61
+
62
+ def wont_be(*args)
63
+ if args.size == 1
64
+ self.send(args.first).must_equal false
65
+ else
66
+ _wont_be *args
67
+ end
68
+ end
69
+
70
+ end
@@ -0,0 +1,25 @@
1
+ require_relative '../helper'
2
+
3
+ describe Henshin::Compressor do
4
+
5
+ subject { Henshin::Compressor }
6
+
7
+ let(:f1) { stub(:text => "f1") }
8
+ let(:f2) { stub(:text => "f2") }
9
+ let(:f3) { stub(:text => "f3") }
10
+
11
+ let(:compressor) { subject.new([f1, f2, f3]) }
12
+
13
+ describe '#join' do
14
+ it 'joins the contents of the files together' do
15
+ compressor.join.must_equal "f1\nf2\nf3"
16
+ end
17
+ end
18
+
19
+ describe '#compress' do
20
+ it 'calls #join' do
21
+ compressor.compress.must_equal "f1\nf2\nf3"
22
+ end
23
+ end
24
+
25
+ end
@@ -0,0 +1,22 @@
1
+ require_relative '../../helper'
2
+
3
+ describe Henshin::Compressor::Css do
4
+
5
+ subject { Henshin::Compressor::Css }
6
+
7
+ before { YUI::CssCompressor.stubs(:new).returns(yui) }
8
+
9
+ let(:f1) { stub(:text => "f1") }
10
+ let(:f2) { stub(:text => "f2") }
11
+ let(:f3) { stub(:text => "f3") }
12
+
13
+ let(:compressor) { subject.new([f1, f2, f3]) }
14
+ let(:yui) { mock(:compress => "f1\nf2\nf3") }
15
+
16
+ describe '#compress' do
17
+ it 'concatenates the files' do
18
+ compressor.compress
19
+ end
20
+ end
21
+
22
+ end
@@ -0,0 +1,22 @@
1
+ require_relative '../../helper'
2
+
3
+ describe Henshin::Compressor::Js do
4
+
5
+ subject { Henshin::Compressor::Js }
6
+
7
+ before { YUI::JavaScriptCompressor.stubs(:new).returns(yui) }
8
+
9
+ let(:f1) { stub(:text => "f1") }
10
+ let(:f2) { stub(:text => "f2") }
11
+ let(:f3) { stub(:text => "f3") }
12
+
13
+ let(:compressor) { subject.new([f1, f2, f3]) }
14
+ let(:yui) { mock(:compress => "f1\nf2\nf3") }
15
+
16
+ describe '#compress' do
17
+ it 'concatenates the files' do
18
+ compressor.compress
19
+ end
20
+ end
21
+
22
+ end