octopress 3.0.0.alpha1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (269) hide show
  1. checksums.yaml +15 -0
  2. data/.editorconfig +22 -0
  3. data/.gitattributes +1 -0
  4. data/.gitignore +20 -0
  5. data/.powrc +4 -0
  6. data/.rspec +5 -0
  7. data/.rubocop.yml +119 -0
  8. data/.slugignore +3 -0
  9. data/.themes/classic/.editorconfig +44 -0
  10. data/.themes/classic/_config/adn-timeline.yml +10 -0
  11. data/.themes/classic/_config/delicious-feed.yml +4 -0
  12. data/.themes/classic/_config/deploy/gh_pages.yml +9 -0
  13. data/.themes/classic/_config/deploy/rsync.yml +14 -0
  14. data/.themes/classic/_config/disqus.yml +11 -0
  15. data/.themes/classic/_config/facebook-like.yml +2 -0
  16. data/.themes/classic/_config/gauges-analytics.yml +6 -0
  17. data/.themes/classic/_config/github-repos.yml +24 -0
  18. data/.themes/classic/_config/google-analytics.yml +6 -0
  19. data/.themes/classic/_config/google-plus.yml +13 -0
  20. data/.themes/classic/_config/jekyll.yml +37 -0
  21. data/.themes/classic/_config/pinboard-feed.yml +4 -0
  22. data/.themes/classic/_config/require-js.yml +19 -0
  23. data/.themes/classic/_config/theme.yml +54 -0
  24. data/.themes/classic/_config/twitter-timeline.yml +9 -0
  25. data/.themes/classic/assets/javascripts/lib/ios-rotate-scaling-fix.js +18 -0
  26. data/.themes/classic/assets/javascripts/lib/jquery.cookie.js +92 -0
  27. data/.themes/classic/assets/javascripts/lib/modernizr.js +447 -0
  28. data/.themes/classic/assets/javascripts/lib/octopress.js +83 -0
  29. data/.themes/classic/assets/javascripts/modules/adn-timeline.coffee +68 -0
  30. data/.themes/classic/assets/javascripts/modules/delicious-feed.coffee +38 -0
  31. data/.themes/classic/assets/javascripts/modules/github-repos.coffee +60 -0
  32. data/.themes/classic/assets/javascripts/modules/github.coffee +60 -0
  33. data/.themes/classic/assets/javascripts/modules/helpers.coffee +96 -0
  34. data/.themes/classic/assets/javascripts/modules/pinboard-feed.coffee +42 -0
  35. data/.themes/classic/assets/javascripts/modules/site.coffee +11 -0
  36. data/.themes/classic/assets/stylesheets/_base.scss +5 -0
  37. data/.themes/classic/assets/stylesheets/_partials.scss +8 -0
  38. data/.themes/classic/assets/stylesheets/base/_layout.scss +191 -0
  39. data/.themes/classic/assets/stylesheets/base/_solarized.scss +75 -0
  40. data/.themes/classic/assets/stylesheets/base/_theme.scss +92 -0
  41. data/.themes/classic/assets/stylesheets/base/_typography.scss +168 -0
  42. data/.themes/classic/assets/stylesheets/base/_utilities.scss +27 -0
  43. data/.themes/classic/assets/stylesheets/custom/_colors.scss +49 -0
  44. data/.themes/classic/assets/stylesheets/custom/_fonts.scss +10 -0
  45. data/.themes/classic/assets/stylesheets/custom/_layout.scss +17 -0
  46. data/.themes/classic/assets/stylesheets/custom/_styles.scss +2 -0
  47. data/.themes/classic/assets/stylesheets/partials/_archive.scss +77 -0
  48. data/.themes/classic/assets/stylesheets/partials/_blog.scss +165 -0
  49. data/.themes/classic/assets/stylesheets/partials/_footer.scss +19 -0
  50. data/.themes/classic/assets/stylesheets/partials/_header.scss +18 -0
  51. data/.themes/classic/assets/stylesheets/partials/_navigation.scss +136 -0
  52. data/.themes/classic/assets/stylesheets/partials/_sharing.scss +73 -0
  53. data/.themes/classic/assets/stylesheets/partials/_sidebar.scss +4 -0
  54. data/.themes/classic/assets/stylesheets/partials/_syntax.scss +234 -0
  55. data/.themes/classic/assets/stylesheets/partials/sidebar/_base.scss +106 -0
  56. data/.themes/classic/assets/stylesheets/partials/sidebar/_delicious.scss +4 -0
  57. data/.themes/classic/assets/stylesheets/partials/sidebar/_googleplus.scss +26 -0
  58. data/.themes/classic/assets/stylesheets/partials/sidebar/_pinboard.scss +12 -0
  59. data/.themes/classic/assets/stylesheets/plugins/_plugins.scss +5 -0
  60. data/.themes/classic/assets/stylesheets/screen.scss +11 -0
  61. data/.themes/classic/source/404.markdown +9 -0
  62. data/.themes/classic/source/_includes/after_footer.html +7 -0
  63. data/.themes/classic/source/_includes/archive_post.html +12 -0
  64. data/.themes/classic/source/_includes/article.html +23 -0
  65. data/.themes/classic/source/_includes/comments.html +9 -0
  66. data/.themes/classic/source/_includes/custom/after_footer.html +3 -0
  67. data/.themes/classic/source/_includes/custom/after_page.html +1 -0
  68. data/.themes/classic/source/_includes/custom/after_post.html +0 -0
  69. data/.themes/classic/source/_includes/custom/comments.html +5 -0
  70. data/.themes/classic/source/_includes/custom/footer.html +4 -0
  71. data/.themes/classic/source/_includes/custom/head.html +7 -0
  72. data/.themes/classic/source/_includes/custom/header.html +6 -0
  73. data/.themes/classic/source/_includes/custom/navigation.html +4 -0
  74. data/.themes/classic/source/_includes/custom/page_meta.html +1 -0
  75. data/.themes/classic/source/_includes/custom/post_meta.html +1 -0
  76. data/.themes/classic/source/_includes/custom/sharing.html +3 -0
  77. data/.themes/classic/source/_includes/disqus.html +22 -0
  78. data/.themes/classic/source/_includes/facebook_like.html +10 -0
  79. data/.themes/classic/source/_includes/feed_entry.xml +10 -0
  80. data/.themes/classic/source/_includes/footer.html +1 -0
  81. data/.themes/classic/source/_includes/gauges_analytics.html +15 -0
  82. data/.themes/classic/source/_includes/google_analytics.html +13 -0
  83. data/.themes/classic/source/_includes/google_plus_one.html +9 -0
  84. data/.themes/classic/source/_includes/head.html +33 -0
  85. data/.themes/classic/source/_includes/header.html +1 -0
  86. data/.themes/classic/source/_includes/navigation.html +15 -0
  87. data/.themes/classic/source/_includes/post/author.html +8 -0
  88. data/.themes/classic/source/_includes/post/categories.html +10 -0
  89. data/.themes/classic/source/_includes/post/date.html +15 -0
  90. data/.themes/classic/source/_includes/post/disqus_thread.html +1 -0
  91. data/.themes/classic/source/_includes/post/meta.html +3 -0
  92. data/.themes/classic/source/_includes/post/sharing.html +36 -0
  93. data/.themes/classic/source/_includes/post/title.html +5 -0
  94. data/.themes/classic/source/_includes/post/variables.html +14 -0
  95. data/.themes/classic/source/_includes/sidebars/blog_index_default.html +3 -0
  96. data/.themes/classic/source/_includes/sidebars/page_default.html +4 -0
  97. data/.themes/classic/source/_includes/sidebars/post_default.html +4 -0
  98. data/.themes/classic/source/_includes/sidebars/sections/delicious.html +8 -0
  99. data/.themes/classic/source/_includes/sidebars/sections/github.html +9 -0
  100. data/.themes/classic/source/_includes/sidebars/sections/google_plus.html +5 -0
  101. data/.themes/classic/source/_includes/sidebars/sections/pinboard.html +17 -0
  102. data/.themes/classic/source/_includes/sidebars/sections/recent_posts.html +10 -0
  103. data/.themes/classic/source/_includes/twitter_sharing.html +11 -0
  104. data/.themes/classic/source/_layouts/category_feed.xml +24 -0
  105. data/.themes/classic/source/_layouts/category_index.html +19 -0
  106. data/.themes/classic/source/_layouts/default.html +14 -0
  107. data/.themes/classic/source/_layouts/page.html +34 -0
  108. data/.themes/classic/source/_layouts/post.html +39 -0
  109. data/.themes/classic/source/archives/index.html +20 -0
  110. data/.themes/classic/source/assets/jwplayer/glow/controlbar/background.png +0 -0
  111. data/.themes/classic/source/assets/jwplayer/glow/controlbar/blankButton.png +0 -0
  112. data/.themes/classic/source/assets/jwplayer/glow/controlbar/divider.png +0 -0
  113. data/.themes/classic/source/assets/jwplayer/glow/controlbar/fullscreenButton.png +0 -0
  114. data/.themes/classic/source/assets/jwplayer/glow/controlbar/fullscreenButtonOver.png +0 -0
  115. data/.themes/classic/source/assets/jwplayer/glow/controlbar/muteButton.png +0 -0
  116. data/.themes/classic/source/assets/jwplayer/glow/controlbar/muteButtonOver.png +0 -0
  117. data/.themes/classic/source/assets/jwplayer/glow/controlbar/normalscreenButton.png +0 -0
  118. data/.themes/classic/source/assets/jwplayer/glow/controlbar/normalscreenButtonOver.png +0 -0
  119. data/.themes/classic/source/assets/jwplayer/glow/controlbar/pauseButton.png +0 -0
  120. data/.themes/classic/source/assets/jwplayer/glow/controlbar/pauseButtonOver.png +0 -0
  121. data/.themes/classic/source/assets/jwplayer/glow/controlbar/playButton.png +0 -0
  122. data/.themes/classic/source/assets/jwplayer/glow/controlbar/playButtonOver.png +0 -0
  123. data/.themes/classic/source/assets/jwplayer/glow/controlbar/timeSliderBuffer.png +0 -0
  124. data/.themes/classic/source/assets/jwplayer/glow/controlbar/timeSliderCapLeft.png +0 -0
  125. data/.themes/classic/source/assets/jwplayer/glow/controlbar/timeSliderCapRight.png +0 -0
  126. data/.themes/classic/source/assets/jwplayer/glow/controlbar/timeSliderProgress.png +0 -0
  127. data/.themes/classic/source/assets/jwplayer/glow/controlbar/timeSliderRail.png +0 -0
  128. data/.themes/classic/source/assets/jwplayer/glow/controlbar/unmuteButton.png +0 -0
  129. data/.themes/classic/source/assets/jwplayer/glow/controlbar/unmuteButtonOver.png +0 -0
  130. data/.themes/classic/source/assets/jwplayer/glow/display/background.png +0 -0
  131. data/.themes/classic/source/assets/jwplayer/glow/display/bufferIcon.png +0 -0
  132. data/.themes/classic/source/assets/jwplayer/glow/display/muteIcon.png +0 -0
  133. data/.themes/classic/source/assets/jwplayer/glow/display/playIcon.png +0 -0
  134. data/.themes/classic/source/assets/jwplayer/glow/dock/button.png +0 -0
  135. data/.themes/classic/source/assets/jwplayer/glow/glow.xml +115 -0
  136. data/.themes/classic/source/assets/jwplayer/glow/playlist/item.png +0 -0
  137. data/.themes/classic/source/assets/jwplayer/glow/playlist/itemOver.png +0 -0
  138. data/.themes/classic/source/assets/jwplayer/glow/playlist/sliderCapBottom.png +0 -0
  139. data/.themes/classic/source/assets/jwplayer/glow/playlist/sliderCapTop.png +0 -0
  140. data/.themes/classic/source/assets/jwplayer/glow/playlist/sliderRail.png +0 -0
  141. data/.themes/classic/source/assets/jwplayer/glow/playlist/sliderThumb.png +0 -0
  142. data/.themes/classic/source/assets/jwplayer/glow/sharing/embedIcon.png +0 -0
  143. data/.themes/classic/source/assets/jwplayer/glow/sharing/embedScreen.png +0 -0
  144. data/.themes/classic/source/assets/jwplayer/glow/sharing/shareIcon.png +0 -0
  145. data/.themes/classic/source/assets/jwplayer/glow/sharing/shareScreen.png +0 -0
  146. data/.themes/classic/source/assets/jwplayer/player.swf +0 -0
  147. data/.themes/classic/source/atom.xml +23 -0
  148. data/.themes/classic/source/images/bird_32_gray.png +0 -0
  149. data/.themes/classic/source/images/bird_32_gray_fail.png +0 -0
  150. data/.themes/classic/source/images/code_bg.png +0 -0
  151. data/.themes/classic/source/images/dotted-border.png +0 -0
  152. data/.themes/classic/source/images/email.png +0 -0
  153. data/.themes/classic/source/images/icon/facebook.png +0 -0
  154. data/.themes/classic/source/images/icon/github.png +0 -0
  155. data/.themes/classic/source/images/icon/googleplus.png +0 -0
  156. data/.themes/classic/source/images/icon/twitter-bird.png +0 -0
  157. data/.themes/classic/source/images/icon/twitter.png +0 -0
  158. data/.themes/classic/source/images/line-tile.png +0 -0
  159. data/.themes/classic/source/images/noise.png +0 -0
  160. data/.themes/classic/source/images/rss.png +0 -0
  161. data/.themes/classic/source/images/search.png +0 -0
  162. data/.themes/classic/source/index.html +30 -0
  163. data/.themes/classic/source/javascripts/jquery.min.js +5 -0
  164. data/.themes/classic/source/octopress-favicon.png +0 -0
  165. data/.themes/classic/source/robots.txt +7 -0
  166. data/.travis.yml +6 -0
  167. data/CHANGELOG.markdown +46 -0
  168. data/CONTRIBUTING.markdown +17 -0
  169. data/Gemfile +2 -0
  170. data/README.markdown +37 -0
  171. data/Rakefile +76 -0
  172. data/bin/octopress +66 -0
  173. data/lib/console +17 -0
  174. data/lib/guard/jekyll.rb +33 -0
  175. data/lib/octopress.rb +89 -0
  176. data/lib/octopress/command.rb +9 -0
  177. data/lib/octopress/commands.rb +14 -0
  178. data/lib/octopress/commands/build.rb +17 -0
  179. data/lib/octopress/commands/build_javascripts.rb +11 -0
  180. data/lib/octopress/commands/build_jekyll.rb +25 -0
  181. data/lib/octopress/commands/build_stylesheets.rb +13 -0
  182. data/lib/octopress/commands/install.rb +45 -0
  183. data/lib/octopress/commands/new.rb +21 -0
  184. data/lib/octopress/commands/scaffold.rb +101 -0
  185. data/lib/octopress/commands/serve.rb +25 -0
  186. data/lib/octopress/configuration.rb +231 -0
  187. data/lib/octopress/core_ext.rb +44 -0
  188. data/lib/octopress/dependency_installer.rb +287 -0
  189. data/lib/octopress/errors.rb +3 -0
  190. data/lib/octopress/filters/content.rb +66 -0
  191. data/lib/octopress/filters/date.rb +46 -0
  192. data/lib/octopress/filters/post.rb +175 -0
  193. data/lib/octopress/filters/url.rb +34 -0
  194. data/lib/octopress/formatters.rb +9 -0
  195. data/lib/octopress/formatters/base_formatter.rb +17 -0
  196. data/lib/octopress/formatters/simple_formatter.rb +9 -0
  197. data/lib/octopress/formatters/verbose_formatter.rb +9 -0
  198. data/lib/octopress/generators/category_generator.rb +196 -0
  199. data/lib/octopress/generators/sitemap_generator.rb +308 -0
  200. data/lib/octopress/guardfile +43 -0
  201. data/lib/octopress/helpers/titlecase.rb +37 -0
  202. data/lib/octopress/ink.rb +12 -0
  203. data/lib/octopress/inquirable_string.rb +12 -0
  204. data/lib/octopress/installer.rb +92 -0
  205. data/lib/octopress/js_asset_manager.rb +98 -0
  206. data/lib/octopress/liquid_helpers/conditional.rb +36 -0
  207. data/lib/octopress/liquid_helpers/config.rb +58 -0
  208. data/lib/octopress/liquid_helpers/include.rb +33 -0
  209. data/lib/octopress/liquid_helpers/url.rb +29 -0
  210. data/lib/octopress/liquid_helpers/vars.rb +30 -0
  211. data/lib/octopress/plugin.rb +33 -0
  212. data/lib/octopress/rake.rb +16 -0
  213. data/lib/octopress/scaffold/.gitignore +18 -0
  214. data/lib/octopress/scaffold/site/Gemfile +3 -0
  215. data/lib/octopress/scaffold/site/config/compass.rb +27 -0
  216. data/lib/octopress/scaffold/site/config/rack.rb +25 -0
  217. data/lib/octopress/scaffold/site/config/site.yml +0 -0
  218. data/lib/octopress/scaffold/site/javascripts/lib/ios-rotate-scaling-fix.js +19 -0
  219. data/lib/octopress/scaffold/site/javascripts/lib/jquery-1.9.1.js +9598 -0
  220. data/lib/octopress/scaffold/site/javascripts/lib/jquery.cookie.js +93 -0
  221. data/lib/octopress/scaffold/site/stylesheets/_config.scss +1 -0
  222. data/lib/octopress/scaffold/site/stylesheets/_style.scss +1 -0
  223. data/lib/octopress/scaffold/site/stylesheets/site.scss +16 -0
  224. data/lib/octopress/tags/assign.rb +34 -0
  225. data/lib/octopress/tags/capture.rb +31 -0
  226. data/lib/octopress/tags/config-tag.rb +23 -0
  227. data/lib/octopress/tags/include.rb +63 -0
  228. data/lib/octopress/tags/js-assets.rb +23 -0
  229. data/lib/octopress/tags/puts.rb +39 -0
  230. data/lib/octopress/tags/render-partial.rb +89 -0
  231. data/lib/octopress/tags/return.rb +21 -0
  232. data/lib/octopress/version.rb +3 -0
  233. data/lib/rake/clean.rake +8 -0
  234. data/lib/rake/clobber.rake +5 -0
  235. data/lib/rake/console.rake +5 -0
  236. data/lib/rake/deploy.rake +4 -0
  237. data/lib/rake/gen_deploy.rake +2 -0
  238. data/lib/rake/generate.rake +4 -0
  239. data/lib/rake/generate_only.rake +14 -0
  240. data/lib/rake/hygiene.rake +29 -0
  241. data/lib/rake/install.rake +8 -0
  242. data/lib/rake/integrate.rake +4 -0
  243. data/lib/rake/isolate.rake +13 -0
  244. data/lib/rake/list_drafts.rake +7 -0
  245. data/lib/rake/new.rake +7 -0
  246. data/lib/rake/new_page.rake +49 -0
  247. data/lib/rake/new_post.rake +32 -0
  248. data/lib/rake/nuke.rake +4 -0
  249. data/lib/rake/preview.rake +4 -0
  250. data/lib/rake/push.rake +37 -0
  251. data/lib/rake/rsync.rake +20 -0
  252. data/lib/rake/set_root_dir.rake +35 -0
  253. data/lib/rake/setup_github_pages.rake +115 -0
  254. data/lib/rake/watch.rake +11 -0
  255. data/lib/scaffold/Rakefile +142 -0
  256. data/lib/scaffold/plugin-name.gemspec +43 -0
  257. data/lib/spec/fixtures/env/defaults/classic.yml +2 -0
  258. data/lib/spec/fixtures/no_override/defaults/classic.yml +11 -0
  259. data/lib/spec/fixtures/override/defaults/classic.yml +11 -0
  260. data/lib/spec/fixtures/override/site.yml +11 -0
  261. data/lib/spec/octopress/configuration_spec.rb +67 -0
  262. data/lib/spec/octopress/dependency_installer_spec.rb +66 -0
  263. data/lib/spec/octopress/ink_spec.rb +10 -0
  264. data/lib/spec/octopress/octopress_spec.rb +97 -0
  265. data/lib/spec/spec_helper.rb +22 -0
  266. data/lib/spec/support/env.rb +36 -0
  267. data/lib/spec/support/simplecov.rb +52 -0
  268. data/octopress.gemspec +52 -0
  269. metadata +697 -0
@@ -0,0 +1,175 @@
1
+ module Jekyll
2
+
3
+ # Extended plugin type that allows the plugin
4
+ # to be called on varous callback methods.
5
+ #
6
+ # Examples:
7
+ # https://github.com/tedkulp/octopress/blob/master/plugins/post_metaweblog.rb
8
+ class PostFilter < Plugin
9
+
10
+ #Called before post is sent to the converter. Allows
11
+ #you to modify the post object before the converter
12
+ #does it's thing
13
+ def pre_render(post)
14
+ end
15
+
16
+ #Called after the post is rendered with the converter.
17
+ #Use the post object to modify it's contents before the
18
+ #post is inserted into the template.
19
+ def post_render(post)
20
+ end
21
+
22
+ #Called after the post is written to the disk.
23
+ #Use the post object to read it's contents to do something
24
+ #after the post is safely written.
25
+ def post_write(post)
26
+ end
27
+ end
28
+
29
+ # Monkey patch for the Jekyll Site class. For the original class,
30
+ # see: https://github.com/mojombo/jekyll/blob/master/lib/jekyll/site.rb
31
+ class Site
32
+
33
+ # Instance variable to store the various post_filter
34
+ # plugins that are loaded.
35
+ attr_accessor :post_filters
36
+
37
+ # Instantiates all of the post_filter plugins. This is basically
38
+ # a duplication of the other loaders in Site#setup.
39
+ def load_post_filters
40
+ self.post_filters = instantiate_subclasses(Jekyll::PostFilter)
41
+ end
42
+ end
43
+
44
+ # Monkey patch for the Jekyll Post class. For the original class,
45
+ # see: https://github.com/mojombo/jekyll/blob/master/lib/jekyll/post.rb
46
+ class Post
47
+
48
+ # Copy the #write method to #old_write, so we can redefine #write
49
+ # method.
50
+ alias_method :old_write, :write
51
+
52
+ # Write the generated post file to the destination directory. It
53
+ # then calls any post_write methods that may exist.
54
+ # +dest+ is the String path to the destination dir
55
+ #
56
+ # Returns nothing
57
+ def write(dest)
58
+ old_write(dest)
59
+ post_write if respond_to?(:post_write)
60
+ end
61
+ end
62
+
63
+ # Monkey patch for the Jekyll Page class. For the original class,
64
+ # see: https://github.com/mojombo/jekyll/blob/master/lib/jekyll/page.rb
65
+ class Page
66
+
67
+ # Copy the #write method to #old_write, so we can redefine #write
68
+ # method.
69
+ alias_method :old_write, :write
70
+
71
+ # Write the generated post file to the destination directory. It
72
+ # then calls any post_write methods that may exist.
73
+ # +dest+ is the String path to the destination dir
74
+ #
75
+ # Returns nothing
76
+ def write(dest)
77
+ old_write(dest)
78
+ post_write if respond_to?(:post_write)
79
+ end
80
+ end
81
+
82
+ # Monkey patch for the Jekyll Convertible module. For the original class,
83
+ # see: https://github.com/mojombo/jekyll/blob/master/lib/jekyll/convertible.rb
84
+ module Convertible
85
+
86
+ def is_post?
87
+ self.class.to_s == 'Jekyll::Post'
88
+ end
89
+
90
+ def is_page?
91
+ self.class.to_s == 'Jekyll::Page'
92
+ end
93
+
94
+ def is_convertible_page?
95
+ self.class.to_s == 'Jekyll::ConvertiblePage'
96
+ end
97
+
98
+ def is_filterable?
99
+ is_post? or is_page? or is_convertible_page?
100
+ end
101
+
102
+ # Call the #pre_render methods on all of the loaded
103
+ # post_filter plugins.
104
+ #
105
+ # Returns nothing
106
+ def pre_render
107
+ self.site.load_post_filters unless self.site.post_filters
108
+
109
+ if self.site.post_filters and is_filterable?
110
+ self.site.post_filters.each do |filter|
111
+ filter.pre_render(self)
112
+ end
113
+ end
114
+ end
115
+
116
+ # Call the #post_render methods on all of the loaded
117
+ # post_filter plugins.
118
+ #
119
+ # Returns nothing
120
+ def post_render
121
+ if self.site.post_filters and is_filterable?
122
+ self.site.post_filters.each do |filter|
123
+ filter.post_render(self)
124
+ end
125
+ end
126
+ end
127
+
128
+ # Call the #post_write methods on all of the loaded
129
+ # post_filter plugins.
130
+ #
131
+ # Returns nothing
132
+ def post_write
133
+ if self.site.post_filters and is_filterable?
134
+ self.site.post_filters.each do |filter|
135
+ filter.post_write(self)
136
+ end
137
+ end
138
+ end
139
+
140
+ # Copy the #transform method to #old_transform, so we can
141
+ # redefine #transform method.
142
+ alias_method :old_transform, :transform
143
+
144
+ # Transform the contents based on the content type. Then calls the
145
+ # #post_render method if it exists
146
+ #
147
+ # Returns nothing.
148
+ def transform
149
+ old_transform
150
+ post_render if respond_to?(:post_render)
151
+ end
152
+
153
+ # Copy the #do_layout method to #old_do_layout, so we can
154
+ # redefine #do_layout method.
155
+ alias_method :old_do_layout, :do_layout
156
+
157
+ # Calls the pre_render method if it exists and then adds any necessary
158
+ # layouts to this convertible document.
159
+ #
160
+ # payload - The site payload Hash.
161
+ # layouts - A Hash of {"name" => "layout"}.
162
+ #
163
+ # Returns nothing.
164
+ def do_layout(payload, layouts)
165
+ pre_render if respond_to?(:pre_render)
166
+ old_do_layout(payload, layouts)
167
+ end
168
+
169
+ # Returns the full url of the post, including the
170
+ # configured url
171
+ def full_url
172
+ self.site.config['url'] + self.url
173
+ end
174
+ end
175
+ end
@@ -0,0 +1,34 @@
1
+ # Liquid filters for Octopress
2
+
3
+ module Octopress
4
+ module UrlFilters
5
+ include UrlHelpers
6
+
7
+ # Replaces relative urls with full urls
8
+
9
+ def expand_urls(input, url='')
10
+ url ||= '/'
11
+ input.gsub /(\s+(href|src)\s*=\s*["|']{1})(\/(?!\/)[^\"'>]*)/ do
12
+ $1+url+$3
13
+ end
14
+ end
15
+
16
+ # Removes trailing forward slash from a string for easily appending url segments
17
+
18
+ def strip_slash(input)
19
+ input.sub(/\/\s*$/, '')
20
+ end
21
+
22
+ # Returns a url without the protocol (http://)
23
+
24
+ def shorthand_url(input)
25
+ input.gsub /(https?:\/\/)(\S+)/ do
26
+ $2
27
+ end
28
+ end
29
+
30
+ end
31
+ end
32
+
33
+ Liquid::Template.register_filter Octopress::UrlFilters
34
+
@@ -0,0 +1,9 @@
1
+ $:.unshift(File.dirname(__FILE__))
2
+
3
+ module Octopress
4
+ module Formatters
5
+ autoload :BaseFormatter, 'formatters/base_formatter'
6
+ autoload :SimpleFormatter, 'formatters/simple_formatter'
7
+ autoload :VerboseFormatter, 'formatters/verbose_formatter'
8
+ end
9
+ end
@@ -0,0 +1,17 @@
1
+ module Octopress
2
+ module Formatters
3
+ class BaseFormatter < Logger::Formatter
4
+
5
+ COLORS = {
6
+ "ERROR" => "red",
7
+ "WARN" => "yellow",
8
+ "INFO" => "green",
9
+ "DEBUG" => "white"
10
+ }
11
+
12
+ def call(severity, timestamp, progname, msg)
13
+ (progname || msg).to_s.send(COLORS[severity]) + "\n"
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,9 @@
1
+ module Octopress
2
+ module Formatters
3
+ class SimpleFormatter < Logger::Formatter
4
+ def call(severity, timestamp, progname, msg)
5
+ "#{msg}\n"
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ module Octopress
2
+ module Formatters
3
+ class VerboseFormatter < Logger::Formatter
4
+ def call(severity, timestamp, progname, msg)
5
+ "[#{timestamp}] #{severity}: #{msg}\n"
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,196 @@
1
+ # encoding: utf-8
2
+ #
3
+ # Jekyll category page generator.
4
+ # http://recursive-design.com/projects/jekyll-plugins/
5
+ #
6
+ # Version: 0.1.4 (201101061053)
7
+ #
8
+ # Copyright (c) 2010 Dave Perrett, http://recursive-design.com/
9
+ # Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php)
10
+ #
11
+ # A generator that creates category pages for jekyll sites.
12
+ #
13
+ # Included filters :
14
+ # - category_links: Outputs the list of categories as comma-separated <a> links.
15
+ # - date_to_html_string: Outputs the post.date as formatted html, with hooks for CSS styling.
16
+ #
17
+ # Available _config.yml settings :
18
+ # - category_dir: The subfolder to build category pages in (default is 'categories').
19
+ # - category_title_prefix: The string used before the category name in the page title (default is
20
+ # 'Category: ').
21
+
22
+ require 'stringex'
23
+
24
+ module Jekyll
25
+
26
+ # The CategoryIndex class creates a single category page for the specified category.
27
+ class CategoryIndex < Page
28
+
29
+ # Initializes a new CategoryIndex.
30
+ #
31
+ # +base+ is the String path to the <source>.
32
+ # +category_dir+ is the String path between <source> and the category folder.
33
+ # +category+ is the category currently being processed.
34
+ def initialize(site, base, category_dir, category, title)
35
+ @site = site
36
+ @base = base
37
+ @dir = category_dir
38
+ @name = 'index.html'
39
+ self.process(@name)
40
+ # Read the YAML data from the layout page.
41
+ return unless self.read_yaml(File.join(base, '_layouts'), 'category-index.html')
42
+ self.data['category'] = category
43
+ # Set the title for this page.
44
+ title_prefix = site.config['category_title_prefix'] || 'Category: '
45
+ self.data['title'] = "#{title_prefix}#{title}"
46
+ # Set the meta-description for this page.
47
+ meta_description_prefix = site.config['category_meta_description_prefix'] || 'Category: '
48
+ self.data['description'] = "#{meta_description_prefix}#{title}"
49
+ end
50
+
51
+ end
52
+
53
+ # The CategoryFeed class creates an Atom feed for the specified category.
54
+ class CategoryFeed < Page
55
+
56
+ # Initializes a new CategoryFeed.
57
+ #
58
+ # +base+ is the String path to the <source>.
59
+ # +category_dir+ is the String path between <source> and the category folder.
60
+ # +category+ is the category currently being processed.
61
+ def initialize(site, base, category_dir, category, title)
62
+ @site = site
63
+ @base = base
64
+ @dir = category_dir
65
+ @name = 'atom.xml'
66
+ self.process(@name)
67
+ # Read the YAML data from the layout page.
68
+ self.read_yaml(File.join(base, '_includes/custom'), 'category-feed.xml')
69
+ self.data['category'] = category
70
+ # Set the title for this page.
71
+ title_prefix = site.config['category_title_prefix'] || 'Category: '
72
+ self.data['title'] = "#{title_prefix}#{title}"
73
+ # Set the meta-description for this page.
74
+ meta_description_prefix = site.config['category_meta_description_prefix'] || 'Category: '
75
+ self.data['description'] = "#{meta_description_prefix}#{title}"
76
+
77
+ # Set the correct feed URL.
78
+ self.data['feed_url'] = "#{category_dir}/#{name}"
79
+ end
80
+
81
+ end
82
+
83
+ # The Site class is a built-in Jekyll class with access to global site config information.
84
+ class Site
85
+
86
+ # Creates an instance of CategoryIndex for each category page, renders it, and
87
+ # writes the output to a file.
88
+ #
89
+ # +category_dir+ is the String path to the category folder.
90
+ # +category+ is the category currently being processed.
91
+ def write_category_index(category_dir, category, title)
92
+ index = CategoryIndex.new(self, self.source, category_dir, category, title)
93
+ index.render(self.layouts, site_payload)
94
+ index.write(self.dest)
95
+ # Record the fact that this page has been added, otherwise Site::cleanup will remove it.
96
+ self.pages << index
97
+
98
+ # Create an Atom-feed for each index.
99
+ if self.config['category_feeds']
100
+ feed = CategoryFeed.new(self, self.source, category_dir, category, title)
101
+ feed.render(self.layouts, site_payload)
102
+ feed.write(self.dest)
103
+ # Record the fact that this page has been added, otherwise Site::cleanup will remove it.
104
+ self.pages << feed
105
+ end
106
+ end
107
+
108
+
109
+ # Loops through the list of category pages and processes each one.
110
+ def write_category_indexes
111
+ return unless self.layouts.key? 'category_index'
112
+ dir = self.config['category_dir']
113
+ self.categories.keys.each do |category|
114
+ if category =~ /(.+)\[(.+)\]/
115
+ slug = $1.strip
116
+ title = $2.strip
117
+ else
118
+ slug = title = category
119
+ end
120
+ cat_dir = slug.to_url
121
+ cat_dir = File.join(dir, cat_dir) unless dir.nil? or dir.empty?
122
+ self.write_category_index(cat_dir, category, title)
123
+ end
124
+ end
125
+ end
126
+
127
+
128
+ # Jekyll hook - the generate method is called by jekyll, and generates all of the category pages.
129
+ class GenerateCategories < Generator
130
+ safe true
131
+ priority :low
132
+
133
+ def generate(site)
134
+ site.write_category_indexes
135
+ end
136
+
137
+ end
138
+
139
+
140
+ # Adds some extra filters used during the category creation process.
141
+ module Filters
142
+
143
+ # Outputs a list of categories as comma-separated <a> links. This is used
144
+ # to output the category list for each post on a category page.
145
+ #
146
+ # +categories+ is the list of categories to format.
147
+ #
148
+ # Returns string
149
+ #
150
+ def category_links(categories)
151
+ categories = categories.sort!.map { |c| category_link c }
152
+ case categories.length
153
+ when 0
154
+ ""
155
+ when 1
156
+ categories[0].to_s
157
+ else
158
+ "#{categories[0...-1].join(', ')}, #{categories[-1]}"
159
+ end
160
+ end
161
+
162
+ # Outputs a single category as an <a> link.
163
+ #
164
+ # +category+ is a category string to format as an <a> link
165
+ #
166
+ # Returns string
167
+ #
168
+ def category_link(category)
169
+ if category =~ /(.+)\[(.+)\]/
170
+ slug = $1.strip
171
+ title = $2.strip
172
+ else
173
+ slug = title = category
174
+ end
175
+ dir = @context.registers[:site].config['category_dir']
176
+ url = slug.to_url
177
+ url = "#{dir}/#{url}" unless dir.nil? or dir.empty?
178
+ "<a class='category' href='/#{url}/'>#{title}</a>"
179
+ end
180
+
181
+ # Outputs the post.date as formatted html, with hooks for CSS styling.
182
+ #
183
+ # +date+ is the date object to format as HTML.
184
+ #
185
+ # Returns string
186
+ def date_to_html_string(date)
187
+ string = <<HTML.strip
188
+ <span class='month'>#{date.strftime('%b').upcase}</span>
189
+ #{date.strftime('<span class="day">%d</span>')}
190
+ #{date.strftime('<span class="year">%Y</span>')}
191
+ HTML
192
+ end
193
+
194
+ end
195
+
196
+ end