jekyll-reloaded 0.12

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.
Files changed (109) hide show
  1. data/Gemfile +2 -0
  2. data/History.txt +321 -0
  3. data/LICENSE +21 -0
  4. data/README.textile +41 -0
  5. data/Rakefile +161 -0
  6. data/bin/jekyll +289 -0
  7. data/cucumber.yml +1 -0
  8. data/features/create_sites.feature +112 -0
  9. data/features/embed_filters.feature +60 -0
  10. data/features/markdown.feature +30 -0
  11. data/features/pagination.feature +27 -0
  12. data/features/permalinks.feature +65 -0
  13. data/features/post_data.feature +153 -0
  14. data/features/site_configuration.feature +145 -0
  15. data/features/site_data.feature +82 -0
  16. data/features/step_definitions/jekyll_steps.rb +145 -0
  17. data/features/support/env.rb +19 -0
  18. data/jekyll.gemspec +146 -0
  19. data/lib/guard/jekyll.rb +57 -0
  20. data/lib/jekyll/converter.rb +50 -0
  21. data/lib/jekyll/converters/identity.rb +22 -0
  22. data/lib/jekyll/converters/markdown.rb +125 -0
  23. data/lib/jekyll/converters/textile.rb +50 -0
  24. data/lib/jekyll/convertible.rb +116 -0
  25. data/lib/jekyll/core_ext.rb +52 -0
  26. data/lib/jekyll/errors.rb +6 -0
  27. data/lib/jekyll/filters.rb +118 -0
  28. data/lib/jekyll/generator.rb +7 -0
  29. data/lib/jekyll/generators/pagination.rb +113 -0
  30. data/lib/jekyll/layout.rb +51 -0
  31. data/lib/jekyll/live_site.rb +216 -0
  32. data/lib/jekyll/migrators/csv.rb +26 -0
  33. data/lib/jekyll/migrators/drupal.rb +103 -0
  34. data/lib/jekyll/migrators/enki.rb +49 -0
  35. data/lib/jekyll/migrators/joomla.rb +53 -0
  36. data/lib/jekyll/migrators/marley.rb +52 -0
  37. data/lib/jekyll/migrators/mephisto.rb +84 -0
  38. data/lib/jekyll/migrators/mt.rb +86 -0
  39. data/lib/jekyll/migrators/posterous.rb +67 -0
  40. data/lib/jekyll/migrators/rss.rb +47 -0
  41. data/lib/jekyll/migrators/textpattern.rb +58 -0
  42. data/lib/jekyll/migrators/tumblr.rb +195 -0
  43. data/lib/jekyll/migrators/typo.rb +51 -0
  44. data/lib/jekyll/migrators/wordpress.rb +294 -0
  45. data/lib/jekyll/migrators/wordpressdotcom.rb +70 -0
  46. data/lib/jekyll/page.rb +160 -0
  47. data/lib/jekyll/plugin.rb +77 -0
  48. data/lib/jekyll/post.rb +262 -0
  49. data/lib/jekyll/site.rb +339 -0
  50. data/lib/jekyll/static_file.rb +77 -0
  51. data/lib/jekyll/tags/highlight.rb +118 -0
  52. data/lib/jekyll/tags/include.rb +37 -0
  53. data/lib/jekyll/tags/post_url.rb +38 -0
  54. data/lib/jekyll.rb +134 -0
  55. data/test/helper.rb +34 -0
  56. data/test/source/.htaccess +8 -0
  57. data/test/source/_includes/sig.markdown +3 -0
  58. data/test/source/_layouts/default.html +27 -0
  59. data/test/source/_layouts/simple.html +1 -0
  60. data/test/source/_posts/2008-02-02-not-published.textile +8 -0
  61. data/test/source/_posts/2008-02-02-published.textile +8 -0
  62. data/test/source/_posts/2008-10-18-foo-bar.textile +8 -0
  63. data/test/source/_posts/2008-11-21-complex.textile +8 -0
  64. data/test/source/_posts/2008-12-03-permalinked-post.textile +9 -0
  65. data/test/source/_posts/2008-12-13-include.markdown +8 -0
  66. data/test/source/_posts/2009-01-27-array-categories.textile +10 -0
  67. data/test/source/_posts/2009-01-27-categories.textile +7 -0
  68. data/test/source/_posts/2009-01-27-category.textile +7 -0
  69. data/test/source/_posts/2009-01-27-empty-categories.textile +7 -0
  70. data/test/source/_posts/2009-01-27-empty-category.textile +7 -0
  71. data/test/source/_posts/2009-03-12-hash-#1.markdown +6 -0
  72. data/test/source/_posts/2009-05-18-empty-tag.textile +6 -0
  73. data/test/source/_posts/2009-05-18-empty-tags.textile +6 -0
  74. data/test/source/_posts/2009-05-18-tag.textile +6 -0
  75. data/test/source/_posts/2009-05-18-tags.textile +9 -0
  76. data/test/source/_posts/2009-06-22-empty-yaml.textile +3 -0
  77. data/test/source/_posts/2009-06-22-no-yaml.textile +1 -0
  78. data/test/source/_posts/2010-01-08-triple-dash.markdown +5 -0
  79. data/test/source/_posts/2010-01-09-date-override.textile +7 -0
  80. data/test/source/_posts/2010-01-09-time-override.textile +7 -0
  81. data/test/source/_posts/2010-01-09-timezone-override.textile +7 -0
  82. data/test/source/_posts/2010-01-16-override-data.textile +4 -0
  83. data/test/source/_posts/2011-04-12-md-extension.md +7 -0
  84. data/test/source/_posts/2011-04-12-text-extension.text +0 -0
  85. data/test/source/about.html +6 -0
  86. data/test/source/category/_posts/2008-9-23-categories.textile +6 -0
  87. data/test/source/contacts.html +5 -0
  88. data/test/source/css/screen.css +76 -0
  89. data/test/source/deal.with.dots.html +7 -0
  90. data/test/source/foo/_posts/bar/2008-12-12-topical-post.textile +8 -0
  91. data/test/source/index.html +22 -0
  92. data/test/source/sitemap.xml +32 -0
  93. data/test/source/win/_posts/2009-05-24-yaml-linebreak.markdown +7 -0
  94. data/test/source/z_category/_posts/2008-9-23-categories.textile +6 -0
  95. data/test/suite.rb +11 -0
  96. data/test/test_configuration.rb +29 -0
  97. data/test/test_core_ext.rb +66 -0
  98. data/test/test_filters.rb +62 -0
  99. data/test/test_generated_site.rb +72 -0
  100. data/test/test_kramdown.rb +23 -0
  101. data/test/test_page.rb +117 -0
  102. data/test/test_pager.rb +113 -0
  103. data/test/test_post.rb +450 -0
  104. data/test/test_rdiscount.rb +18 -0
  105. data/test/test_redcarpet.rb +21 -0
  106. data/test/test_redcloth.rb +86 -0
  107. data/test/test_site.rb +220 -0
  108. data/test/test_tags.rb +201 -0
  109. metadata +332 -0
data/jekyll.gemspec ADDED
@@ -0,0 +1,146 @@
1
+ # encoding: utf-8
2
+ Gem::Specification.new do |s|
3
+ s.name = 'jekyll-reloaded'
4
+ s.version = '0.12'
5
+
6
+ s.summary = "Mislav's fork of Jekyll"
7
+ s.description = "Jekyll is a simple, blog aware, static site generator."
8
+
9
+ s.authors = ["Tom Preston-Werner", "Mislav Marohnić"]
10
+ s.email = 'mislav.marohnic@gmail.com'
11
+ s.homepage = 'https://github.com/mislav/jekyll/tree/reloaded'
12
+
13
+ # s.executables = ["jekyll"]
14
+
15
+ s.add_runtime_dependency('liquid', "~> 2.3")
16
+ s.add_runtime_dependency('classifier', "~> 1.3")
17
+ s.add_runtime_dependency('directory_watcher', "~> 1.1")
18
+ s.add_runtime_dependency('maruku', "~> 0.5")
19
+ s.add_runtime_dependency('kramdown', "~> 0.13")
20
+ s.add_runtime_dependency('pygments.rb', "~> 0.2.4")
21
+
22
+ s.add_development_dependency('rake', "~> 0.9")
23
+ s.add_development_dependency('rdoc', "~> 3.11")
24
+ s.add_development_dependency('redgreen', "~> 1.2")
25
+ s.add_development_dependency('shoulda', "~> 2.11")
26
+ s.add_development_dependency('rr', "~> 1.0")
27
+ s.add_development_dependency('cucumber', "1.1")
28
+ s.add_development_dependency('RedCloth', "~> 4.2")
29
+ s.add_development_dependency('rdiscount', "~> 1.6")
30
+ s.add_development_dependency('redcarpet', "~> 1.9")
31
+
32
+ # = MANIFEST =
33
+ s.files = %w[
34
+ Gemfile
35
+ History.txt
36
+ LICENSE
37
+ README.textile
38
+ Rakefile
39
+ bin/jekyll
40
+ cucumber.yml
41
+ features/create_sites.feature
42
+ features/embed_filters.feature
43
+ features/markdown.feature
44
+ features/pagination.feature
45
+ features/permalinks.feature
46
+ features/post_data.feature
47
+ features/site_configuration.feature
48
+ features/site_data.feature
49
+ features/step_definitions/jekyll_steps.rb
50
+ features/support/env.rb
51
+ jekyll.gemspec
52
+ lib/guard/jekyll.rb
53
+ lib/jekyll.rb
54
+ lib/jekyll/converter.rb
55
+ lib/jekyll/converters/identity.rb
56
+ lib/jekyll/converters/markdown.rb
57
+ lib/jekyll/converters/textile.rb
58
+ lib/jekyll/convertible.rb
59
+ lib/jekyll/core_ext.rb
60
+ lib/jekyll/errors.rb
61
+ lib/jekyll/filters.rb
62
+ lib/jekyll/generator.rb
63
+ lib/jekyll/generators/pagination.rb
64
+ lib/jekyll/layout.rb
65
+ lib/jekyll/live_site.rb
66
+ lib/jekyll/migrators/csv.rb
67
+ lib/jekyll/migrators/drupal.rb
68
+ lib/jekyll/migrators/enki.rb
69
+ lib/jekyll/migrators/joomla.rb
70
+ lib/jekyll/migrators/marley.rb
71
+ lib/jekyll/migrators/mephisto.rb
72
+ lib/jekyll/migrators/mt.rb
73
+ lib/jekyll/migrators/posterous.rb
74
+ lib/jekyll/migrators/rss.rb
75
+ lib/jekyll/migrators/textpattern.rb
76
+ lib/jekyll/migrators/tumblr.rb
77
+ lib/jekyll/migrators/typo.rb
78
+ lib/jekyll/migrators/wordpress.rb
79
+ lib/jekyll/migrators/wordpressdotcom.rb
80
+ lib/jekyll/page.rb
81
+ lib/jekyll/plugin.rb
82
+ lib/jekyll/post.rb
83
+ lib/jekyll/site.rb
84
+ lib/jekyll/static_file.rb
85
+ lib/jekyll/tags/highlight.rb
86
+ lib/jekyll/tags/include.rb
87
+ lib/jekyll/tags/post_url.rb
88
+ test/helper.rb
89
+ test/source/.htaccess
90
+ test/source/_includes/sig.markdown
91
+ test/source/_layouts/default.html
92
+ test/source/_layouts/simple.html
93
+ test/source/_posts/2008-02-02-not-published.textile
94
+ test/source/_posts/2008-02-02-published.textile
95
+ test/source/_posts/2008-10-18-foo-bar.textile
96
+ test/source/_posts/2008-11-21-complex.textile
97
+ test/source/_posts/2008-12-03-permalinked-post.textile
98
+ test/source/_posts/2008-12-13-include.markdown
99
+ test/source/_posts/2009-01-27-array-categories.textile
100
+ test/source/_posts/2009-01-27-categories.textile
101
+ test/source/_posts/2009-01-27-category.textile
102
+ test/source/_posts/2009-01-27-empty-categories.textile
103
+ test/source/_posts/2009-01-27-empty-category.textile
104
+ test/source/_posts/2009-03-12-hash-#1.markdown
105
+ test/source/_posts/2009-05-18-empty-tag.textile
106
+ test/source/_posts/2009-05-18-empty-tags.textile
107
+ test/source/_posts/2009-05-18-tag.textile
108
+ test/source/_posts/2009-05-18-tags.textile
109
+ test/source/_posts/2009-06-22-empty-yaml.textile
110
+ test/source/_posts/2009-06-22-no-yaml.textile
111
+ test/source/_posts/2010-01-08-triple-dash.markdown
112
+ test/source/_posts/2010-01-09-date-override.textile
113
+ test/source/_posts/2010-01-09-time-override.textile
114
+ test/source/_posts/2010-01-09-timezone-override.textile
115
+ test/source/_posts/2010-01-16-override-data.textile
116
+ test/source/_posts/2011-04-12-md-extension.md
117
+ test/source/_posts/2011-04-12-text-extension.text
118
+ test/source/about.html
119
+ test/source/category/_posts/2008-9-23-categories.textile
120
+ test/source/contacts.html
121
+ test/source/css/screen.css
122
+ test/source/deal.with.dots.html
123
+ test/source/foo/_posts/bar/2008-12-12-topical-post.textile
124
+ test/source/index.html
125
+ test/source/sitemap.xml
126
+ test/source/win/_posts/2009-05-24-yaml-linebreak.markdown
127
+ test/source/z_category/_posts/2008-9-23-categories.textile
128
+ test/suite.rb
129
+ test/test_configuration.rb
130
+ test/test_core_ext.rb
131
+ test/test_filters.rb
132
+ test/test_generated_site.rb
133
+ test/test_kramdown.rb
134
+ test/test_page.rb
135
+ test/test_pager.rb
136
+ test/test_post.rb
137
+ test/test_rdiscount.rb
138
+ test/test_redcarpet.rb
139
+ test/test_redcloth.rb
140
+ test/test_site.rb
141
+ test/test_tags.rb
142
+ ]
143
+ # = MANIFEST =
144
+
145
+ s.test_files = s.files.select { |path| path =~ /^test\/test_.*\.rb/ }
146
+ end
@@ -0,0 +1,57 @@
1
+ require 'guard/guard'
2
+ require 'jekyll/live_site'
3
+
4
+ class Guard::Jekyll < Guard::Guard
5
+ attr_reader :workdir
6
+
7
+ def initialize(watchers = [], options = {})
8
+ super
9
+ @site = nil
10
+ @workdir = Dir.pwd
11
+ end
12
+
13
+ def init_site
14
+ jekyll_options = ::Jekyll::configuration(@options)
15
+ @site = ::Jekyll::LiveSite.new(jekyll_options)
16
+ @destination = File.join(File.expand_path(jekyll_options['destination'], @workdir), '')
17
+ print "Rebuilding Jekyll site... "
18
+ @site.process
19
+ puts "done."
20
+ end
21
+ alias_method :start, :init_site
22
+ alias_method :reload, :init_site
23
+ alias_method :run_all, :init_site
24
+
25
+ def run_on_change paths
26
+ init_site if paths.include? '_config.yml'
27
+ return if @site.nil?
28
+ render_files paths
29
+ end
30
+
31
+ def filter_files paths
32
+ paths.reject { |path| in_destination? path }
33
+ end
34
+
35
+ def in_destination? path
36
+ File.expand_path(path, workdir).index(@destination) == 0
37
+ end
38
+
39
+ def render_files paths
40
+ changed = []
41
+ @site.process_files filter_files(paths) do |processed|
42
+ relative = processed.sub("#{workdir}/", '')
43
+ puts "Jekyll: #{relative}"
44
+ changed << relative
45
+ end
46
+
47
+ notify changed if changed.any?
48
+ end
49
+
50
+ def notify changed_files
51
+ ::Guard.guards.each do |guard|
52
+ next if self.class === guard
53
+ paths = ::Guard::Watcher.match_files(guard, changed_files)
54
+ guard.run_on_change(paths) unless paths.empty?
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,50 @@
1
+ module Jekyll
2
+
3
+ class Converter < Plugin
4
+ # Public: Get or set the pygments prefix. When an argument is specified,
5
+ # the prefix will be set. If no argument is specified, the current prefix
6
+ # will be returned.
7
+ #
8
+ # pygments_prefix - The String prefix (default: nil).
9
+ #
10
+ # Returns the String prefix.
11
+ def self.pygments_prefix(pygments_prefix = nil)
12
+ @pygments_prefix = pygments_prefix if pygments_prefix
13
+ @pygments_prefix
14
+ end
15
+
16
+ # Public: Get or set the pygments suffix. When an argument is specified,
17
+ # the suffix will be set. If no argument is specified, the current suffix
18
+ # will be returned.
19
+ #
20
+ # pygments_suffix - The String suffix (default: nil).
21
+ #
22
+ # Returns the String suffix.
23
+ def self.pygments_suffix(pygments_suffix = nil)
24
+ @pygments_suffix = pygments_suffix if pygments_suffix
25
+ @pygments_suffix
26
+ end
27
+
28
+ # Initialize the converter.
29
+ #
30
+ # Returns an initialized Converter.
31
+ def initialize(config = {})
32
+ @config = config
33
+ end
34
+
35
+ # Get the pygments prefix.
36
+ #
37
+ # Returns the String prefix.
38
+ def pygments_prefix
39
+ self.class.pygments_prefix
40
+ end
41
+
42
+ # Get the pygments suffix.
43
+ #
44
+ # Returns the String suffix.
45
+ def pygments_suffix
46
+ self.class.pygments_suffix
47
+ end
48
+ end
49
+
50
+ end
@@ -0,0 +1,22 @@
1
+ module Jekyll
2
+
3
+ class IdentityConverter < Converter
4
+ safe true
5
+
6
+ priority :lowest
7
+
8
+ def matches(ext)
9
+ true
10
+ end
11
+
12
+ def output_ext(ext)
13
+ ext
14
+ end
15
+
16
+ def convert(content)
17
+ content
18
+ end
19
+
20
+ end
21
+
22
+ end
@@ -0,0 +1,125 @@
1
+ module Jekyll
2
+
3
+ class MarkdownConverter < Converter
4
+ safe true
5
+
6
+ pygments_prefix "\n"
7
+ pygments_suffix "\n"
8
+
9
+ def setup
10
+ return if @setup
11
+ # Set the Markdown interpreter (and Maruku self.config, if necessary)
12
+ case @config['markdown']
13
+ when 'redcarpet'
14
+ begin
15
+ require 'redcarpet'
16
+ @redcarpet_extensions = @config['redcarpet']['extensions'].map { |e| e.to_sym }
17
+ rescue LoadError
18
+ STDERR.puts 'You are missing a library required for Markdown. Please run:'
19
+ STDERR.puts ' $ [sudo] gem install redcarpet'
20
+ raise FatalException.new("Missing dependency: redcarpet")
21
+ end
22
+ when 'kramdown'
23
+ begin
24
+ require 'kramdown'
25
+ rescue LoadError
26
+ STDERR.puts 'You are missing a library required for Markdown. Please run:'
27
+ STDERR.puts ' $ [sudo] gem install kramdown'
28
+ raise FatalException.new("Missing dependency: kramdown")
29
+ end
30
+ when 'rdiscount'
31
+ begin
32
+ require 'rdiscount'
33
+
34
+ # Load rdiscount extensions
35
+ @rdiscount_extensions = @config['rdiscount']['extensions'].map { |e| e.to_sym }
36
+ rescue LoadError
37
+ STDERR.puts 'You are missing a library required for Markdown. Please run:'
38
+ STDERR.puts ' $ [sudo] gem install rdiscount'
39
+ raise FatalException.new("Missing dependency: rdiscount")
40
+ end
41
+ when 'maruku'
42
+ begin
43
+ require 'maruku'
44
+
45
+ if @config['maruku']['use_divs']
46
+ require 'maruku/ext/div'
47
+ STDERR.puts 'Maruku: Using extended syntax for div elements.'
48
+ end
49
+
50
+ if @config['maruku']['use_tex']
51
+ require 'maruku/ext/math'
52
+ STDERR.puts "Maruku: Using LaTeX extension. Images in `#{@config['maruku']['png_dir']}`."
53
+
54
+ # Switch off MathML output
55
+ MaRuKu::Globals[:html_math_output_mathml] = false
56
+ MaRuKu::Globals[:html_math_engine] = 'none'
57
+
58
+ # Turn on math to PNG support with blahtex
59
+ # Resulting PNGs stored in `images/latex`
60
+ MaRuKu::Globals[:html_math_output_png] = true
61
+ MaRuKu::Globals[:html_png_engine] = @config['maruku']['png_engine']
62
+ MaRuKu::Globals[:html_png_dir] = @config['maruku']['png_dir']
63
+ MaRuKu::Globals[:html_png_url] = @config['maruku']['png_url']
64
+ end
65
+ rescue LoadError
66
+ STDERR.puts 'You are missing a library required for Markdown. Please run:'
67
+ STDERR.puts ' $ [sudo] gem install maruku'
68
+ raise FatalException.new("Missing dependency: maruku")
69
+ end
70
+ else
71
+ STDERR.puts "Invalid Markdown processor: #{@config['markdown']}"
72
+ STDERR.puts " Valid options are [ maruku | rdiscount | kramdown ]"
73
+ raise FatalException.new("Invalid Markdown process: #{@config['markdown']}")
74
+ end
75
+ @setup = true
76
+ end
77
+
78
+ def matches(ext)
79
+ rgx = '(' + @config['markdown_ext'].gsub(',','|') +')'
80
+ ext =~ Regexp.new(rgx, Regexp::IGNORECASE)
81
+ end
82
+
83
+ def output_ext(ext)
84
+ ".html"
85
+ end
86
+
87
+ def convert(content)
88
+ setup
89
+ case @config['markdown']
90
+ when 'redcarpet'
91
+ Redcarpet.new(content, *@redcarpet_extensions).to_html
92
+ when 'kramdown'
93
+ # Check for use of coderay
94
+ if @config['kramdown']['use_coderay']
95
+ Kramdown::Document.new(content, {
96
+ :auto_ids => @config['kramdown']['auto_ids'],
97
+ :footnote_nr => @config['kramdown']['footnote_nr'],
98
+ :entity_output => @config['kramdown']['entity_output'],
99
+ :toc_levels => @config['kramdown']['toc_levels'],
100
+
101
+ :coderay_wrap => @config['kramdown']['coderay']['coderay_wrap'],
102
+ :coderay_line_numbers => @config['kramdown']['coderay']['coderay_line_numbers'],
103
+ :coderay_line_number_start => @config['kramdown']['coderay']['coderay_line_number_start'],
104
+ :coderay_tab_width => @config['kramdown']['coderay']['coderay_tab_width'],
105
+ :coderay_bold_every => @config['kramdown']['coderay']['coderay_bold_every'],
106
+ :coderay_css => @config['kramdown']['coderay']['coderay_css']
107
+ }).to_html
108
+ else
109
+ # not using coderay
110
+ Kramdown::Document.new(content, {
111
+ :auto_ids => @config['kramdown']['auto_ids'],
112
+ :footnote_nr => @config['kramdown']['footnote_nr'],
113
+ :entity_output => @config['kramdown']['entity_output'],
114
+ :toc_levels => @config['kramdown']['toc_levels']
115
+ }).to_html
116
+ end
117
+ when 'rdiscount'
118
+ RDiscount.new(content, *@rdiscount_extensions).to_html
119
+ when 'maruku'
120
+ Maruku.new(content).to_html
121
+ end
122
+ end
123
+ end
124
+
125
+ end
@@ -0,0 +1,50 @@
1
+ module Jekyll
2
+
3
+ class TextileConverter < Converter
4
+ safe true
5
+
6
+ pygments_prefix '<notextile>'
7
+ pygments_suffix '</notextile>'
8
+
9
+ def setup
10
+ return if @setup
11
+ require 'redcloth'
12
+ @setup = true
13
+ rescue LoadError
14
+ STDERR.puts 'You are missing a library required for Textile. Please run:'
15
+ STDERR.puts ' $ [sudo] gem install RedCloth'
16
+ raise FatalException.new("Missing dependency: RedCloth")
17
+ end
18
+
19
+ def matches(ext)
20
+ rgx = '(' + @config['textile_ext'].gsub(',','|') +')'
21
+ ext =~ Regexp.new(rgx, Regexp::IGNORECASE)
22
+ end
23
+
24
+ def output_ext(ext)
25
+ ".html"
26
+ end
27
+
28
+ def convert(content)
29
+ setup
30
+
31
+ # Shortcut if config doesn't contain RedCloth section
32
+ return RedCloth.new(content).to_html if @config['redcloth'].nil?
33
+
34
+ # List of attributes defined on RedCloth
35
+ # (from http://redcloth.rubyforge.org/classes/RedCloth/TextileDoc.html)
36
+ attrs = ['filter_classes', 'filter_html', 'filter_ids', 'filter_styles',
37
+ 'hard_breaks', 'lite_mode', 'no_span_caps', 'sanitize_html']
38
+
39
+ r = RedCloth.new(content)
40
+
41
+ # Set attributes in r if they are NOT nil in the config
42
+ attrs.each do |attr|
43
+ r.instance_variable_set("@#{attr}".to_sym, @config['redcloth'][attr]) unless @config['redcloth'][attr].nil?
44
+ end
45
+
46
+ r.to_html
47
+ end
48
+ end
49
+
50
+ end
@@ -0,0 +1,116 @@
1
+ require 'set'
2
+
3
+ # Convertible provides methods for converting a pagelike item
4
+ # from a certain type of markup into actual content
5
+ #
6
+ # Requires
7
+ # self.site -> Jekyll::Site
8
+ # self.content
9
+ # self.content=
10
+ # self.data
11
+ # self.data=
12
+ # self.ext
13
+ # self.output
14
+ # self.output=
15
+ # self.name
16
+ module Jekyll
17
+ module Convertible
18
+ # Returns the contents as a String.
19
+ def to_s
20
+ self.content || ''
21
+ end
22
+
23
+ # Read the YAML frontmatter.
24
+ #
25
+ # base - The String path to the dir containing the file.
26
+ # name - The String filename of the file.
27
+ #
28
+ # Returns nothing.
29
+ def read_yaml(base, name)
30
+ self.content = File.read(File.join(base, name))
31
+
32
+ if self.content =~ /^(---\s*\n.*?\n?)^(---\s*$\n?)/m
33
+ self.content = $POSTMATCH
34
+ data = begin
35
+ YAML.load($1)
36
+ rescue => e
37
+ puts "YAML Exception reading #{name}: #{e.message}"
38
+ nil
39
+ end
40
+ self.data = data
41
+ end
42
+
43
+ self.data ||= {}
44
+ end
45
+
46
+ # Transform the contents based on the content type.
47
+ #
48
+ # Returns nothing.
49
+ def transform
50
+ self.content = converter.convert(self.content)
51
+ end
52
+
53
+ # Determine the extension depending on content_type.
54
+ #
55
+ # Returns the String extension for the output file.
56
+ # e.g. ".html" for an HTML output file.
57
+ def output_ext
58
+ converter.output_ext(self.ext)
59
+ end
60
+
61
+ # Determine which converter to use based on this convertible's
62
+ # extension.
63
+ #
64
+ # Returns the Converter instance.
65
+ def converter
66
+ @converter ||= self.site.converters.find { |c| c.matches(self.ext) }
67
+ end
68
+
69
+ # Add any necessary layouts to this convertible document.
70
+ #
71
+ # payload - The site payload Hash.
72
+ # layouts - A Hash of {"name" => "layout"}.
73
+ #
74
+ # Returns nothing.
75
+ def do_layout(payload, layouts)
76
+ info = { :filters => [Jekyll::Filters], :registers => { :site => self.site } }
77
+
78
+ # render and transform content (this becomes the final content of the object)
79
+ payload["pygments_prefix"] = converter.pygments_prefix
80
+ payload["pygments_suffix"] = converter.pygments_suffix
81
+
82
+ begin
83
+ self.content = Liquid::Template.parse(self.content).render(payload, info)
84
+ rescue => e
85
+ puts "Liquid Exception: #{e.message} in #{self.name}"
86
+ end
87
+
88
+ self.transform
89
+
90
+ # output keeps track of what will finally be written
91
+ self.output = self.content
92
+
93
+ # recursively render layouts
94
+ layout = layouts[self.data["layout"]]
95
+ used = Set.new([layout])
96
+
97
+ while layout
98
+ payload = payload.deep_merge({"content" => self.output, "page" => layout.data})
99
+
100
+ begin
101
+ self.output = Liquid::Template.parse(layout.content).render(payload, info)
102
+ rescue => e
103
+ puts "Liquid Exception: #{e.message} in #{self.data["layout"]}"
104
+ end
105
+
106
+ if layout = layouts[layout.data["layout"]]
107
+ if used.include?(layout)
108
+ layout = nil # avoid recursive chain
109
+ else
110
+ used << layout
111
+ end
112
+ end
113
+ end
114
+ end
115
+ end
116
+ end
@@ -0,0 +1,52 @@
1
+ class Hash
2
+ # Merges self with another hash, recursively.
3
+ #
4
+ # This code was lovingly stolen from some random gem:
5
+ # http://gemjack.com/gems/tartan-0.1.1/classes/Hash.html
6
+ #
7
+ # Thanks to whoever made it.
8
+ def deep_merge(hash)
9
+ target = dup
10
+
11
+ hash.keys.each do |key|
12
+ if hash[key].is_a? Hash and self[key].is_a? Hash
13
+ target[key] = target[key].deep_merge(hash[key])
14
+ next
15
+ end
16
+
17
+ target[key] = hash[key]
18
+ end
19
+
20
+ target
21
+ end
22
+
23
+ # Read array from the supplied hash favouring the singular key
24
+ # and then the plural key, and handling any nil entries.
25
+ # +hash+ the hash to read from
26
+ # +singular_key+ the singular key
27
+ # +plural_key+ the singular key
28
+ #
29
+ # Returns an array
30
+ def pluralized_array(singular_key, plural_key)
31
+ hash = self
32
+ if hash.has_key?(singular_key)
33
+ array = [hash[singular_key]] if hash[singular_key]
34
+ elsif hash.has_key?(plural_key)
35
+ case hash[plural_key]
36
+ when String
37
+ array = hash[plural_key].split
38
+ when Array
39
+ array = hash[plural_key].compact
40
+ end
41
+ end
42
+ array || []
43
+ end
44
+ end
45
+
46
+ # Thanks, ActiveSupport!
47
+ class Date
48
+ # Converts datetime to an appropriate format for use in XML
49
+ def xmlschema
50
+ strftime("%Y-%m-%dT%H:%M:%S%Z")
51
+ end if RUBY_VERSION < '1.9'
52
+ end
@@ -0,0 +1,6 @@
1
+ module Jekyll
2
+
3
+ class FatalException < StandardError
4
+ end
5
+
6
+ end