link-checker 0.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (348) hide show
  1. data/.rvmrc +81 -0
  2. data/Gemfile +12 -0
  3. data/Gemfile.lock +56 -0
  4. data/LICENSE.txt +20 -0
  5. data/README.md +15 -0
  6. data/Rakefile +29 -0
  7. data/VERSION +1 -0
  8. data/bin/check-links +8 -0
  9. data/lib/link_checker.rb +80 -0
  10. data/link-checker.gemspec +404 -0
  11. data/spec/link-checker_spec.rb +92 -0
  12. data/spec/spec_helper.rb +4 -0
  13. data/spec/test-site/.gitignore +12 -0
  14. data/spec/test-site/.powrc +5 -0
  15. data/spec/test-site/.rbenv-version +1 -0
  16. data/spec/test-site/.rvmrc +1 -0
  17. data/spec/test-site/.slugignore +3 -0
  18. data/spec/test-site/.themes/classic/sass/_base.scss +5 -0
  19. data/spec/test-site/.themes/classic/sass/_partials.scss +8 -0
  20. data/spec/test-site/.themes/classic/sass/base/_layout.scss +192 -0
  21. data/spec/test-site/.themes/classic/sass/base/_solarized.scss +46 -0
  22. data/spec/test-site/.themes/classic/sass/base/_theme.scss +86 -0
  23. data/spec/test-site/.themes/classic/sass/base/_typography.scss +161 -0
  24. data/spec/test-site/.themes/classic/sass/base/_utilities.scss +28 -0
  25. data/spec/test-site/.themes/classic/sass/custom/_colors.scss +43 -0
  26. data/spec/test-site/.themes/classic/sass/custom/_fonts.scss +10 -0
  27. data/spec/test-site/.themes/classic/sass/custom/_layout.scss +21 -0
  28. data/spec/test-site/.themes/classic/sass/custom/_styles.scss +2 -0
  29. data/spec/test-site/.themes/classic/sass/partials/_archive.scss +72 -0
  30. data/spec/test-site/.themes/classic/sass/partials/_blog.scss +141 -0
  31. data/spec/test-site/.themes/classic/sass/partials/_footer.scss +19 -0
  32. data/spec/test-site/.themes/classic/sass/partials/_header.scss +18 -0
  33. data/spec/test-site/.themes/classic/sass/partials/_navigation.scss +137 -0
  34. data/spec/test-site/.themes/classic/sass/partials/_sharing.scss +8 -0
  35. data/spec/test-site/.themes/classic/sass/partials/_sidebar.scss +5 -0
  36. data/spec/test-site/.themes/classic/sass/partials/_syntax.scss +253 -0
  37. data/spec/test-site/.themes/classic/sass/partials/sidebar/_base.scss +106 -0
  38. data/spec/test-site/.themes/classic/sass/partials/sidebar/_delicious.scss +4 -0
  39. data/spec/test-site/.themes/classic/sass/partials/sidebar/_googleplus.scss +26 -0
  40. data/spec/test-site/.themes/classic/sass/partials/sidebar/_pinboard.scss +12 -0
  41. data/spec/test-site/.themes/classic/sass/partials/sidebar/_twitter.scss +34 -0
  42. data/spec/test-site/.themes/classic/sass/screen.scss +10 -0
  43. data/spec/test-site/.themes/classic/source/_includes/after_footer.html +5 -0
  44. data/spec/test-site/.themes/classic/source/_includes/archive_post.html +8 -0
  45. data/spec/test-site/.themes/classic/source/_includes/article.html +28 -0
  46. data/spec/test-site/.themes/classic/source/_includes/asides/delicious.html +8 -0
  47. data/spec/test-site/.themes/classic/source/_includes/asides/github.html +30 -0
  48. data/spec/test-site/.themes/classic/source/_includes/asides/googleplus.html +11 -0
  49. data/spec/test-site/.themes/classic/source/_includes/asides/pinboard.html +19 -0
  50. data/spec/test-site/.themes/classic/source/_includes/asides/recent_posts.html +10 -0
  51. data/spec/test-site/.themes/classic/source/_includes/asides/twitter.html +19 -0
  52. data/spec/test-site/.themes/classic/source/_includes/custom/after_footer.html +3 -0
  53. data/spec/test-site/.themes/classic/source/_includes/custom/asides/about.html +4 -0
  54. data/spec/test-site/.themes/classic/source/_includes/custom/category_feed.xml +27 -0
  55. data/spec/test-site/.themes/classic/source/_includes/custom/footer.html +4 -0
  56. data/spec/test-site/.themes/classic/source/_includes/custom/head.html +3 -0
  57. data/spec/test-site/.themes/classic/source/_includes/custom/header.html +6 -0
  58. data/spec/test-site/.themes/classic/source/_includes/custom/navigation.html +4 -0
  59. data/spec/test-site/.themes/classic/source/_includes/disqus.html +21 -0
  60. data/spec/test-site/.themes/classic/source/_includes/facebook_like.html +10 -0
  61. data/spec/test-site/.themes/classic/source/_includes/footer.html +1 -0
  62. data/spec/test-site/.themes/classic/source/_includes/google_analytics.html +13 -0
  63. data/spec/test-site/.themes/classic/source/_includes/google_plus_one.html +9 -0
  64. data/spec/test-site/.themes/classic/source/_includes/head.html +29 -0
  65. data/spec/test-site/.themes/classic/source/_includes/header.html +1 -0
  66. data/spec/test-site/.themes/classic/source/_includes/navigation.html +15 -0
  67. data/spec/test-site/.themes/classic/source/_includes/post/author.html +8 -0
  68. data/spec/test-site/.themes/classic/source/_includes/post/categories.html +10 -0
  69. data/spec/test-site/.themes/classic/source/_includes/post/date.html +15 -0
  70. data/spec/test-site/.themes/classic/source/_includes/post/disqus_thread.html +1 -0
  71. data/spec/test-site/.themes/classic/source/_includes/post/sharing.html +11 -0
  72. data/spec/test-site/.themes/classic/source/_includes/twitter_sharing.html +11 -0
  73. data/spec/test-site/.themes/classic/source/_layouts/category_index.html +17 -0
  74. data/spec/test-site/.themes/classic/source/_layouts/default.html +14 -0
  75. data/spec/test-site/.themes/classic/source/_layouts/page.html +42 -0
  76. data/spec/test-site/.themes/classic/source/_layouts/post.html +43 -0
  77. data/spec/test-site/.themes/classic/source/assets/jwplayer/glow/controlbar/background.png +0 -0
  78. data/spec/test-site/.themes/classic/source/assets/jwplayer/glow/controlbar/blankButton.png +0 -0
  79. data/spec/test-site/.themes/classic/source/assets/jwplayer/glow/controlbar/divider.png +0 -0
  80. data/spec/test-site/.themes/classic/source/assets/jwplayer/glow/controlbar/fullscreenButton.png +0 -0
  81. data/spec/test-site/.themes/classic/source/assets/jwplayer/glow/controlbar/fullscreenButtonOver.png +0 -0
  82. data/spec/test-site/.themes/classic/source/assets/jwplayer/glow/controlbar/muteButton.png +0 -0
  83. data/spec/test-site/.themes/classic/source/assets/jwplayer/glow/controlbar/muteButtonOver.png +0 -0
  84. data/spec/test-site/.themes/classic/source/assets/jwplayer/glow/controlbar/normalscreenButton.png +0 -0
  85. data/spec/test-site/.themes/classic/source/assets/jwplayer/glow/controlbar/normalscreenButtonOver.png +0 -0
  86. data/spec/test-site/.themes/classic/source/assets/jwplayer/glow/controlbar/pauseButton.png +0 -0
  87. data/spec/test-site/.themes/classic/source/assets/jwplayer/glow/controlbar/pauseButtonOver.png +0 -0
  88. data/spec/test-site/.themes/classic/source/assets/jwplayer/glow/controlbar/playButton.png +0 -0
  89. data/spec/test-site/.themes/classic/source/assets/jwplayer/glow/controlbar/playButtonOver.png +0 -0
  90. data/spec/test-site/.themes/classic/source/assets/jwplayer/glow/controlbar/timeSliderBuffer.png +0 -0
  91. data/spec/test-site/.themes/classic/source/assets/jwplayer/glow/controlbar/timeSliderCapLeft.png +0 -0
  92. data/spec/test-site/.themes/classic/source/assets/jwplayer/glow/controlbar/timeSliderCapRight.png +0 -0
  93. data/spec/test-site/.themes/classic/source/assets/jwplayer/glow/controlbar/timeSliderProgress.png +0 -0
  94. data/spec/test-site/.themes/classic/source/assets/jwplayer/glow/controlbar/timeSliderRail.png +0 -0
  95. data/spec/test-site/.themes/classic/source/assets/jwplayer/glow/controlbar/unmuteButton.png +0 -0
  96. data/spec/test-site/.themes/classic/source/assets/jwplayer/glow/controlbar/unmuteButtonOver.png +0 -0
  97. data/spec/test-site/.themes/classic/source/assets/jwplayer/glow/display/background.png +0 -0
  98. data/spec/test-site/.themes/classic/source/assets/jwplayer/glow/display/bufferIcon.png +0 -0
  99. data/spec/test-site/.themes/classic/source/assets/jwplayer/glow/display/muteIcon.png +0 -0
  100. data/spec/test-site/.themes/classic/source/assets/jwplayer/glow/display/playIcon.png +0 -0
  101. data/spec/test-site/.themes/classic/source/assets/jwplayer/glow/dock/button.png +0 -0
  102. data/spec/test-site/.themes/classic/source/assets/jwplayer/glow/glow.xml +115 -0
  103. data/spec/test-site/.themes/classic/source/assets/jwplayer/glow/playlist/item.png +0 -0
  104. data/spec/test-site/.themes/classic/source/assets/jwplayer/glow/playlist/itemOver.png +0 -0
  105. data/spec/test-site/.themes/classic/source/assets/jwplayer/glow/playlist/sliderCapBottom.png +0 -0
  106. data/spec/test-site/.themes/classic/source/assets/jwplayer/glow/playlist/sliderCapTop.png +0 -0
  107. data/spec/test-site/.themes/classic/source/assets/jwplayer/glow/playlist/sliderRail.png +0 -0
  108. data/spec/test-site/.themes/classic/source/assets/jwplayer/glow/playlist/sliderThumb.png +0 -0
  109. data/spec/test-site/.themes/classic/source/assets/jwplayer/glow/sharing/embedIcon.png +0 -0
  110. data/spec/test-site/.themes/classic/source/assets/jwplayer/glow/sharing/embedScreen.png +0 -0
  111. data/spec/test-site/.themes/classic/source/assets/jwplayer/glow/sharing/shareIcon.png +0 -0
  112. data/spec/test-site/.themes/classic/source/assets/jwplayer/glow/sharing/shareScreen.png +0 -0
  113. data/spec/test-site/.themes/classic/source/assets/jwplayer/player.swf +0 -0
  114. data/spec/test-site/.themes/classic/source/atom.xml +27 -0
  115. data/spec/test-site/.themes/classic/source/blog/archives/index.html +18 -0
  116. data/spec/test-site/.themes/classic/source/favicon.png +0 -0
  117. data/spec/test-site/.themes/classic/source/images/bird_32_gray.png +0 -0
  118. data/spec/test-site/.themes/classic/source/images/bird_32_gray_fail.png +0 -0
  119. data/spec/test-site/.themes/classic/source/images/code_bg.png +0 -0
  120. data/spec/test-site/.themes/classic/source/images/dotted-border.png +0 -0
  121. data/spec/test-site/.themes/classic/source/images/email.png +0 -0
  122. data/spec/test-site/.themes/classic/source/images/line-tile.png +0 -0
  123. data/spec/test-site/.themes/classic/source/images/noise.png +0 -0
  124. data/spec/test-site/.themes/classic/source/images/rss.png +0 -0
  125. data/spec/test-site/.themes/classic/source/images/search.png +0 -0
  126. data/spec/test-site/.themes/classic/source/index.html +29 -0
  127. data/spec/test-site/.themes/classic/source/javascripts/ender.js +45 -0
  128. data/spec/test-site/.themes/classic/source/javascripts/github.js +37 -0
  129. data/spec/test-site/.themes/classic/source/javascripts/libs/ender.js +1497 -0
  130. data/spec/test-site/.themes/classic/source/javascripts/libs/jXHR.js +85 -0
  131. data/spec/test-site/.themes/classic/source/javascripts/libs/swfobject-dynamic.js +298 -0
  132. data/spec/test-site/.themes/classic/source/javascripts/modernizr-2.0.js +5 -0
  133. data/spec/test-site/.themes/classic/source/javascripts/octopress.js +161 -0
  134. data/spec/test-site/.themes/classic/source/javascripts/pinboard.js +56 -0
  135. data/spec/test-site/.themes/classic/source/javascripts/twitter.js +78 -0
  136. data/spec/test-site/CHANGELOG.markdown +29 -0
  137. data/spec/test-site/Gemfile +18 -0
  138. data/spec/test-site/Gemfile.lock +69 -0
  139. data/spec/test-site/README.markdown +36 -0
  140. data/spec/test-site/Rakefile +379 -0
  141. data/spec/test-site/_config.yml +99 -0
  142. data/spec/test-site/config.rb +16 -0
  143. data/spec/test-site/config.ru +25 -0
  144. data/spec/test-site/plugins/backtick_code_block.rb +43 -0
  145. data/spec/test-site/plugins/blockquote.rb +83 -0
  146. data/spec/test-site/plugins/category_generator.rb +174 -0
  147. data/spec/test-site/plugins/code_block.rb +98 -0
  148. data/spec/test-site/plugins/date.rb +98 -0
  149. data/spec/test-site/plugins/gist_tag.rb +100 -0
  150. data/spec/test-site/plugins/haml.rb +24 -0
  151. data/spec/test-site/plugins/image_tag.rb +50 -0
  152. data/spec/test-site/plugins/include_array.rb +58 -0
  153. data/spec/test-site/plugins/include_code.rb +73 -0
  154. data/spec/test-site/plugins/jsfiddle.rb +40 -0
  155. data/spec/test-site/plugins/octopress_filters.rb +135 -0
  156. data/spec/test-site/plugins/pagination.rb +121 -0
  157. data/spec/test-site/plugins/post_filters.rb +176 -0
  158. data/spec/test-site/plugins/preview_unpublished.rb +48 -0
  159. data/spec/test-site/plugins/pullquote.rb +45 -0
  160. data/spec/test-site/plugins/pygments_code.rb +41 -0
  161. data/spec/test-site/plugins/raw.rb +40 -0
  162. data/spec/test-site/plugins/render_partial.rb +69 -0
  163. data/spec/test-site/plugins/rubypants.rb +489 -0
  164. data/spec/test-site/plugins/sitemap_generator.rb +312 -0
  165. data/spec/test-site/plugins/titlecase.rb +36 -0
  166. data/spec/test-site/plugins/video_tag.rb +47 -0
  167. data/spec/test-site/public/assets/jwplayer/glow/controlbar/background.png +0 -0
  168. data/spec/test-site/public/assets/jwplayer/glow/controlbar/blankButton.png +0 -0
  169. data/spec/test-site/public/assets/jwplayer/glow/controlbar/divider.png +0 -0
  170. data/spec/test-site/public/assets/jwplayer/glow/controlbar/fullscreenButton.png +0 -0
  171. data/spec/test-site/public/assets/jwplayer/glow/controlbar/fullscreenButtonOver.png +0 -0
  172. data/spec/test-site/public/assets/jwplayer/glow/controlbar/muteButton.png +0 -0
  173. data/spec/test-site/public/assets/jwplayer/glow/controlbar/muteButtonOver.png +0 -0
  174. data/spec/test-site/public/assets/jwplayer/glow/controlbar/normalscreenButton.png +0 -0
  175. data/spec/test-site/public/assets/jwplayer/glow/controlbar/normalscreenButtonOver.png +0 -0
  176. data/spec/test-site/public/assets/jwplayer/glow/controlbar/pauseButton.png +0 -0
  177. data/spec/test-site/public/assets/jwplayer/glow/controlbar/pauseButtonOver.png +0 -0
  178. data/spec/test-site/public/assets/jwplayer/glow/controlbar/playButton.png +0 -0
  179. data/spec/test-site/public/assets/jwplayer/glow/controlbar/playButtonOver.png +0 -0
  180. data/spec/test-site/public/assets/jwplayer/glow/controlbar/timeSliderBuffer.png +0 -0
  181. data/spec/test-site/public/assets/jwplayer/glow/controlbar/timeSliderCapLeft.png +0 -0
  182. data/spec/test-site/public/assets/jwplayer/glow/controlbar/timeSliderCapRight.png +0 -0
  183. data/spec/test-site/public/assets/jwplayer/glow/controlbar/timeSliderProgress.png +0 -0
  184. data/spec/test-site/public/assets/jwplayer/glow/controlbar/timeSliderRail.png +0 -0
  185. data/spec/test-site/public/assets/jwplayer/glow/controlbar/unmuteButton.png +0 -0
  186. data/spec/test-site/public/assets/jwplayer/glow/controlbar/unmuteButtonOver.png +0 -0
  187. data/spec/test-site/public/assets/jwplayer/glow/display/background.png +0 -0
  188. data/spec/test-site/public/assets/jwplayer/glow/display/bufferIcon.png +0 -0
  189. data/spec/test-site/public/assets/jwplayer/glow/display/muteIcon.png +0 -0
  190. data/spec/test-site/public/assets/jwplayer/glow/display/playIcon.png +0 -0
  191. data/spec/test-site/public/assets/jwplayer/glow/dock/button.png +0 -0
  192. data/spec/test-site/public/assets/jwplayer/glow/glow.xml +115 -0
  193. data/spec/test-site/public/assets/jwplayer/glow/playlist/item.png +0 -0
  194. data/spec/test-site/public/assets/jwplayer/glow/playlist/itemOver.png +0 -0
  195. data/spec/test-site/public/assets/jwplayer/glow/playlist/sliderCapBottom.png +0 -0
  196. data/spec/test-site/public/assets/jwplayer/glow/playlist/sliderCapTop.png +0 -0
  197. data/spec/test-site/public/assets/jwplayer/glow/playlist/sliderRail.png +0 -0
  198. data/spec/test-site/public/assets/jwplayer/glow/playlist/sliderThumb.png +0 -0
  199. data/spec/test-site/public/assets/jwplayer/glow/sharing/embedIcon.png +0 -0
  200. data/spec/test-site/public/assets/jwplayer/glow/sharing/embedScreen.png +0 -0
  201. data/spec/test-site/public/assets/jwplayer/glow/sharing/shareIcon.png +0 -0
  202. data/spec/test-site/public/assets/jwplayer/glow/sharing/shareScreen.png +0 -0
  203. data/spec/test-site/public/assets/jwplayer/player.swf +0 -0
  204. data/spec/test-site/public/atom.xml +27 -0
  205. data/spec/test-site/public/blog/2012/10/02/a-list-of-links/index.html +196 -0
  206. data/spec/test-site/public/blog/archives/index.html +149 -0
  207. data/spec/test-site/public/favicon.png +0 -0
  208. data/spec/test-site/public/images/bird_32_gray.png +0 -0
  209. data/spec/test-site/public/images/bird_32_gray_fail.png +0 -0
  210. data/spec/test-site/public/images/code_bg.png +0 -0
  211. data/spec/test-site/public/images/dotted-border.png +0 -0
  212. data/spec/test-site/public/images/email.png +0 -0
  213. data/spec/test-site/public/images/line-tile.png +0 -0
  214. data/spec/test-site/public/images/noise.png +0 -0
  215. data/spec/test-site/public/images/rss.png +0 -0
  216. data/spec/test-site/public/images/search.png +0 -0
  217. data/spec/test-site/public/index.html +165 -0
  218. data/spec/test-site/public/javascripts/ender.js +45 -0
  219. data/spec/test-site/public/javascripts/github.js +37 -0
  220. data/spec/test-site/public/javascripts/libs/ender.js +1497 -0
  221. data/spec/test-site/public/javascripts/libs/jXHR.js +85 -0
  222. data/spec/test-site/public/javascripts/libs/swfobject-dynamic.js +298 -0
  223. data/spec/test-site/public/javascripts/modernizr-2.0.js +5 -0
  224. data/spec/test-site/public/javascripts/octopress.js +161 -0
  225. data/spec/test-site/public/javascripts/pinboard.js +56 -0
  226. data/spec/test-site/public/javascripts/twitter.js +78 -0
  227. data/spec/test-site/public/sitemap.xml +15 -0
  228. data/spec/test-site/public/stylesheets/screen.css +1 -0
  229. data/spec/test-site/sass/_base.scss +5 -0
  230. data/spec/test-site/sass/_partials.scss +8 -0
  231. data/spec/test-site/sass/base/_layout.scss +192 -0
  232. data/spec/test-site/sass/base/_solarized.scss +46 -0
  233. data/spec/test-site/sass/base/_theme.scss +86 -0
  234. data/spec/test-site/sass/base/_typography.scss +161 -0
  235. data/spec/test-site/sass/base/_utilities.scss +28 -0
  236. data/spec/test-site/sass/custom/_colors.scss +43 -0
  237. data/spec/test-site/sass/custom/_fonts.scss +10 -0
  238. data/spec/test-site/sass/custom/_layout.scss +21 -0
  239. data/spec/test-site/sass/custom/_styles.scss +2 -0
  240. data/spec/test-site/sass/partials/_archive.scss +72 -0
  241. data/spec/test-site/sass/partials/_blog.scss +141 -0
  242. data/spec/test-site/sass/partials/_footer.scss +19 -0
  243. data/spec/test-site/sass/partials/_header.scss +18 -0
  244. data/spec/test-site/sass/partials/_navigation.scss +137 -0
  245. data/spec/test-site/sass/partials/_sharing.scss +8 -0
  246. data/spec/test-site/sass/partials/_sidebar.scss +5 -0
  247. data/spec/test-site/sass/partials/_syntax.scss +253 -0
  248. data/spec/test-site/sass/partials/sidebar/_base.scss +106 -0
  249. data/spec/test-site/sass/partials/sidebar/_delicious.scss +4 -0
  250. data/spec/test-site/sass/partials/sidebar/_googleplus.scss +26 -0
  251. data/spec/test-site/sass/partials/sidebar/_pinboard.scss +12 -0
  252. data/spec/test-site/sass/partials/sidebar/_twitter.scss +34 -0
  253. data/spec/test-site/sass/screen.scss +10 -0
  254. data/spec/test-site/source/_includes/after_footer.html +5 -0
  255. data/spec/test-site/source/_includes/archive_post.html +8 -0
  256. data/spec/test-site/source/_includes/article.html +28 -0
  257. data/spec/test-site/source/_includes/asides/delicious.html +8 -0
  258. data/spec/test-site/source/_includes/asides/github.html +30 -0
  259. data/spec/test-site/source/_includes/asides/googleplus.html +11 -0
  260. data/spec/test-site/source/_includes/asides/pinboard.html +19 -0
  261. data/spec/test-site/source/_includes/asides/recent_posts.html +10 -0
  262. data/spec/test-site/source/_includes/asides/twitter.html +19 -0
  263. data/spec/test-site/source/_includes/custom/after_footer.html +3 -0
  264. data/spec/test-site/source/_includes/custom/asides/about.html +4 -0
  265. data/spec/test-site/source/_includes/custom/category_feed.xml +27 -0
  266. data/spec/test-site/source/_includes/custom/footer.html +4 -0
  267. data/spec/test-site/source/_includes/custom/head.html +3 -0
  268. data/spec/test-site/source/_includes/custom/header.html +6 -0
  269. data/spec/test-site/source/_includes/custom/navigation.html +4 -0
  270. data/spec/test-site/source/_includes/disqus.html +21 -0
  271. data/spec/test-site/source/_includes/facebook_like.html +10 -0
  272. data/spec/test-site/source/_includes/footer.html +1 -0
  273. data/spec/test-site/source/_includes/google_analytics.html +13 -0
  274. data/spec/test-site/source/_includes/google_plus_one.html +9 -0
  275. data/spec/test-site/source/_includes/head.html +29 -0
  276. data/spec/test-site/source/_includes/header.html +1 -0
  277. data/spec/test-site/source/_includes/navigation.html +15 -0
  278. data/spec/test-site/source/_includes/post/author.html +8 -0
  279. data/spec/test-site/source/_includes/post/categories.html +10 -0
  280. data/spec/test-site/source/_includes/post/date.html +15 -0
  281. data/spec/test-site/source/_includes/post/disqus_thread.html +1 -0
  282. data/spec/test-site/source/_includes/post/sharing.html +11 -0
  283. data/spec/test-site/source/_includes/twitter_sharing.html +11 -0
  284. data/spec/test-site/source/_layouts/category_index.html +17 -0
  285. data/spec/test-site/source/_layouts/default.html +14 -0
  286. data/spec/test-site/source/_layouts/page.html +42 -0
  287. data/spec/test-site/source/_layouts/post.html +43 -0
  288. data/spec/test-site/source/_posts/2012-10-02-a-list-of-links.markdown +11 -0
  289. data/spec/test-site/source/assets/jwplayer/glow/controlbar/background.png +0 -0
  290. data/spec/test-site/source/assets/jwplayer/glow/controlbar/blankButton.png +0 -0
  291. data/spec/test-site/source/assets/jwplayer/glow/controlbar/divider.png +0 -0
  292. data/spec/test-site/source/assets/jwplayer/glow/controlbar/fullscreenButton.png +0 -0
  293. data/spec/test-site/source/assets/jwplayer/glow/controlbar/fullscreenButtonOver.png +0 -0
  294. data/spec/test-site/source/assets/jwplayer/glow/controlbar/muteButton.png +0 -0
  295. data/spec/test-site/source/assets/jwplayer/glow/controlbar/muteButtonOver.png +0 -0
  296. data/spec/test-site/source/assets/jwplayer/glow/controlbar/normalscreenButton.png +0 -0
  297. data/spec/test-site/source/assets/jwplayer/glow/controlbar/normalscreenButtonOver.png +0 -0
  298. data/spec/test-site/source/assets/jwplayer/glow/controlbar/pauseButton.png +0 -0
  299. data/spec/test-site/source/assets/jwplayer/glow/controlbar/pauseButtonOver.png +0 -0
  300. data/spec/test-site/source/assets/jwplayer/glow/controlbar/playButton.png +0 -0
  301. data/spec/test-site/source/assets/jwplayer/glow/controlbar/playButtonOver.png +0 -0
  302. data/spec/test-site/source/assets/jwplayer/glow/controlbar/timeSliderBuffer.png +0 -0
  303. data/spec/test-site/source/assets/jwplayer/glow/controlbar/timeSliderCapLeft.png +0 -0
  304. data/spec/test-site/source/assets/jwplayer/glow/controlbar/timeSliderCapRight.png +0 -0
  305. data/spec/test-site/source/assets/jwplayer/glow/controlbar/timeSliderProgress.png +0 -0
  306. data/spec/test-site/source/assets/jwplayer/glow/controlbar/timeSliderRail.png +0 -0
  307. data/spec/test-site/source/assets/jwplayer/glow/controlbar/unmuteButton.png +0 -0
  308. data/spec/test-site/source/assets/jwplayer/glow/controlbar/unmuteButtonOver.png +0 -0
  309. data/spec/test-site/source/assets/jwplayer/glow/display/background.png +0 -0
  310. data/spec/test-site/source/assets/jwplayer/glow/display/bufferIcon.png +0 -0
  311. data/spec/test-site/source/assets/jwplayer/glow/display/muteIcon.png +0 -0
  312. data/spec/test-site/source/assets/jwplayer/glow/display/playIcon.png +0 -0
  313. data/spec/test-site/source/assets/jwplayer/glow/dock/button.png +0 -0
  314. data/spec/test-site/source/assets/jwplayer/glow/glow.xml +115 -0
  315. data/spec/test-site/source/assets/jwplayer/glow/playlist/item.png +0 -0
  316. data/spec/test-site/source/assets/jwplayer/glow/playlist/itemOver.png +0 -0
  317. data/spec/test-site/source/assets/jwplayer/glow/playlist/sliderCapBottom.png +0 -0
  318. data/spec/test-site/source/assets/jwplayer/glow/playlist/sliderCapTop.png +0 -0
  319. data/spec/test-site/source/assets/jwplayer/glow/playlist/sliderRail.png +0 -0
  320. data/spec/test-site/source/assets/jwplayer/glow/playlist/sliderThumb.png +0 -0
  321. data/spec/test-site/source/assets/jwplayer/glow/sharing/embedIcon.png +0 -0
  322. data/spec/test-site/source/assets/jwplayer/glow/sharing/embedScreen.png +0 -0
  323. data/spec/test-site/source/assets/jwplayer/glow/sharing/shareIcon.png +0 -0
  324. data/spec/test-site/source/assets/jwplayer/glow/sharing/shareScreen.png +0 -0
  325. data/spec/test-site/source/assets/jwplayer/player.swf +0 -0
  326. data/spec/test-site/source/atom.xml +27 -0
  327. data/spec/test-site/source/blog/archives/index.html +18 -0
  328. data/spec/test-site/source/favicon.png +0 -0
  329. data/spec/test-site/source/images/bird_32_gray.png +0 -0
  330. data/spec/test-site/source/images/bird_32_gray_fail.png +0 -0
  331. data/spec/test-site/source/images/code_bg.png +0 -0
  332. data/spec/test-site/source/images/dotted-border.png +0 -0
  333. data/spec/test-site/source/images/email.png +0 -0
  334. data/spec/test-site/source/images/line-tile.png +0 -0
  335. data/spec/test-site/source/images/noise.png +0 -0
  336. data/spec/test-site/source/images/rss.png +0 -0
  337. data/spec/test-site/source/images/search.png +0 -0
  338. data/spec/test-site/source/index.html +29 -0
  339. data/spec/test-site/source/javascripts/ender.js +45 -0
  340. data/spec/test-site/source/javascripts/github.js +37 -0
  341. data/spec/test-site/source/javascripts/libs/ender.js +1497 -0
  342. data/spec/test-site/source/javascripts/libs/jXHR.js +85 -0
  343. data/spec/test-site/source/javascripts/libs/swfobject-dynamic.js +298 -0
  344. data/spec/test-site/source/javascripts/modernizr-2.0.js +5 -0
  345. data/spec/test-site/source/javascripts/octopress.js +161 -0
  346. data/spec/test-site/source/javascripts/pinboard.js +56 -0
  347. data/spec/test-site/source/javascripts/twitter.js +78 -0
  348. metadata +475 -0
@@ -0,0 +1,45 @@
1
+ #
2
+ # Author: Brandon Mathis
3
+ # Based on the semantic pullquote technique by Maykel Loomans at http://miekd.com/articles/pull-quotes-with-html5-and-css/
4
+ #
5
+ # Outputs a span with a data-pullquote attribute set from the marked pullquote. Example:
6
+ #
7
+ # {% pullquote %}
8
+ # When writing longform posts, I find it helpful to include pullquotes, which help those scanning a post discern whether or not a post is helpful.
9
+ # It is important to note, {" pullquotes are merely visual in presentation and should not appear twice in the text. "} That is why it is prefered
10
+ # to use a CSS only technique for styling pullquotes.
11
+ # {% endpullquote %}
12
+ # ...will output...
13
+ # <p>
14
+ # <span data-pullquote="pullquotes are merely visual in presentation and should not appear twice in the text.">
15
+ # When writing longform posts, I find it helpful to include pullquotes, which help those scanning a post discern whether or not a post is helpful.
16
+ # It is important to note, pullquotes are merely visual in presentation and should not appear twice in the text. This is why a CSS only approach
17
+ # for styling pullquotes is prefered.
18
+ # </span>
19
+ # </p>
20
+ #
21
+ # {% pullquote left %} will create a left-aligned pullquote instead.
22
+ #
23
+ # Note: this plugin now creates pullquotes with the class of pullquote-right by default
24
+
25
+ module Jekyll
26
+
27
+ class PullquoteTag < Liquid::Block
28
+ def initialize(tag_name, markup, tokens)
29
+ @align = (markup =~ /left/i) ? "left" : "right"
30
+ super
31
+ end
32
+
33
+ def render(context)
34
+ output = super
35
+ if output =~ /\{"\s*(.+?)\s*"\}/m
36
+ @quote = RubyPants.new($1).to_html
37
+ "<span class='pullquote-#{@align}' data-pullquote='#{@quote}'>#{output.gsub(/\{"\s*|\s*"\}/, '')}</span>"
38
+ else
39
+ return "Surround your pullquote like this {\" text to be quoted \"}"
40
+ end
41
+ end
42
+ end
43
+ end
44
+
45
+ Liquid::Template.register_tag('pullquote', Jekyll::PullquoteTag)
@@ -0,0 +1,41 @@
1
+ require 'pygments'
2
+ require 'fileutils'
3
+ require 'digest/md5'
4
+
5
+ PYGMENTS_CACHE_DIR = File.expand_path('../../.pygments-cache', __FILE__)
6
+ FileUtils.mkdir_p(PYGMENTS_CACHE_DIR)
7
+
8
+ module HighlightCode
9
+ def highlight(str, lang)
10
+ lang = 'ruby' if lang == 'ru'
11
+ lang = 'objc' if lang == 'm'
12
+ lang = 'perl' if lang == 'pl'
13
+ lang = 'yaml' if lang == 'yml'
14
+ str = pygments(str, lang).match(/<pre>(.+)<\/pre>/m)[1].to_s.gsub(/ *$/, '') #strip out divs <div class="highlight">
15
+ tableize_code(str, lang)
16
+ end
17
+
18
+ def pygments(code, lang)
19
+ if defined?(PYGMENTS_CACHE_DIR)
20
+ path = File.join(PYGMENTS_CACHE_DIR, "#{lang}-#{Digest::MD5.hexdigest(code)}.html")
21
+ if File.exist?(path)
22
+ highlighted_code = File.read(path)
23
+ else
24
+ highlighted_code = Pygments.highlight(code, :lexer => lang, :formatter => 'html', :options => {:encoding => 'utf-8'})
25
+ File.open(path, 'w') {|f| f.print(highlighted_code) }
26
+ end
27
+ else
28
+ highlighted_code = Pygments.highlight(code, :lexer => lang, :formatter => 'html', :options => {:encoding => 'utf-8'})
29
+ end
30
+ highlighted_code
31
+ end
32
+ def tableize_code (str, lang = '')
33
+ table = '<div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers">'
34
+ code = ''
35
+ str.lines.each_with_index do |line,index|
36
+ table += "<span class='line-number'>#{index+1}</span>\n"
37
+ code += "<span class='line'>#{line}</span>"
38
+ end
39
+ table += "</pre></td><td class='code'><pre><code class='#{lang}'>#{code}</code></pre></td></tr></table></div>"
40
+ end
41
+ end
@@ -0,0 +1,40 @@
1
+ # Author: Brandon Mathis
2
+ # Description: Provides plugins with a method for wrapping and unwrapping input to prevent Markdown and Textile from parsing it.
3
+ # Purpose: This is useful for preventing Markdown and Textile from being too aggressive and incorrectly parsing in-line HTML.
4
+ module TemplateWrapper
5
+ # Wrap input with a <div>
6
+ def safe_wrap(input)
7
+ "<div class='bogus-wrapper'><notextile>#{input}</notextile></div>"
8
+ end
9
+ # This must be applied after the
10
+ def unwrap(input)
11
+ input.gsub /<div class='bogus-wrapper'><notextile>(.+?)<\/notextile><\/div>/m do
12
+ $1
13
+ end
14
+ end
15
+ end
16
+
17
+ # Author: phaer, https://github.com/phaer
18
+ # Source: https://gist.github.com/1020852
19
+ # Description: Raw tag for jekyll. Keeps liquid from parsing text betweeen {% raw %} and {% endraw %}
20
+
21
+ module Jekyll
22
+ class RawTag < Liquid::Block
23
+ def parse(tokens)
24
+ @nodelist ||= []
25
+ @nodelist.clear
26
+
27
+ while token = tokens.shift
28
+ if token =~ FullToken
29
+ if block_delimiter == $1
30
+ end_tag
31
+ return
32
+ end
33
+ end
34
+ @nodelist << token if not token.empty?
35
+ end
36
+ end
37
+ end
38
+ end
39
+
40
+ Liquid::Template.register_tag('raw', Jekyll::RawTag)
@@ -0,0 +1,69 @@
1
+ # Title: Render Partial Tag for Jekyll
2
+ # Author: Brandon Mathis http://brandonmathis.com
3
+ # Description: Import files on your filesystem into any blog post and render them inline.
4
+ # Note: Paths are relative to the source directory, if you import a file with yaml front matter, the yaml will be stripped out.
5
+ #
6
+ # Syntax {% render_partial path/to/file %}
7
+ #
8
+ # Example 1:
9
+ # {% render_partial about/_bio.markdown %}
10
+ #
11
+ # This will import source/about/_bio.markdown and render it inline.
12
+ # In this example I used an underscore at the beginning of the filename to prevent Jekyll
13
+ # from generating an about/bio.html (Jekyll doesn't convert files beginning with underscores)
14
+ #
15
+ # Example 2:
16
+ # {% render_partial ../README.markdown %}
17
+ #
18
+ # You can use relative pathnames, to include files outside of the source directory.
19
+ # This might be useful if you want to have a page for a project's README without having
20
+ # to duplicated the contents
21
+ #
22
+ #
23
+
24
+ require 'pathname'
25
+ require './plugins/octopress_filters'
26
+
27
+ module Jekyll
28
+
29
+ class RenderPartialTag < Liquid::Tag
30
+ include OctopressFilters
31
+ def initialize(tag_name, markup, tokens)
32
+ @file = nil
33
+ @raw = false
34
+ if markup =~ /^(\S+)\s?(\w+)?/
35
+ @file = $1.strip
36
+ @raw = $2 == 'raw'
37
+ end
38
+ super
39
+ end
40
+
41
+ def render(context)
42
+ file_dir = (context.registers[:site].source || 'source')
43
+ file_path = Pathname.new(file_dir).expand_path
44
+ file = file_path + @file
45
+
46
+ unless file.file?
47
+ return "File #{file} could not be found"
48
+ end
49
+
50
+ Dir.chdir(file_path) do
51
+ contents = file.read
52
+ if contents =~ /\A-{3}.+[^\A]-{3}\n(.+)/m
53
+ contents = $1.lstrip
54
+ end
55
+ contents = pre_filter(contents)
56
+ if @raw
57
+ contents
58
+ else
59
+ partial = Liquid::Template.parse(contents)
60
+ context.stack do
61
+ partial.render(context)
62
+ end
63
+ end
64
+ end
65
+ end
66
+ end
67
+ end
68
+
69
+ Liquid::Template.register_tag('render_partial', Jekyll::RenderPartialTag)
@@ -0,0 +1,489 @@
1
+ #
2
+ # = RubyPants -- SmartyPants ported to Ruby
3
+ #
4
+ # Ported by Christian Neukirchen <mailto:chneukirchen@gmail.com>
5
+ # Copyright (C) 2004 Christian Neukirchen
6
+ #
7
+ # Incooporates ideas, comments and documentation by Chad Miller
8
+ # Copyright (C) 2004 Chad Miller
9
+ #
10
+ # Original SmartyPants by John Gruber
11
+ # Copyright (C) 2003 John Gruber
12
+ #
13
+
14
+ #
15
+ # = RubyPants -- SmartyPants ported to Ruby
16
+ #
17
+ # == Synopsis
18
+ #
19
+ # RubyPants is a Ruby port of the smart-quotes library SmartyPants.
20
+ #
21
+ # The original "SmartyPants" is a free web publishing plug-in for
22
+ # Movable Type, Blosxom, and BBEdit that easily translates plain ASCII
23
+ # punctuation characters into "smart" typographic punctuation HTML
24
+ # entities.
25
+ #
26
+ #
27
+ # == Description
28
+ #
29
+ # RubyPants can perform the following transformations:
30
+ #
31
+ # * Straight quotes (<tt>"</tt> and <tt>'</tt>) into "curly" quote
32
+ # HTML entities
33
+ # * Backticks-style quotes (<tt>``like this''</tt>) into "curly" quote
34
+ # HTML entities
35
+ # * Dashes (<tt>--</tt> and <tt>---</tt>) into en- and em-dash
36
+ # entities
37
+ # * Three consecutive dots (<tt>...</tt> or <tt>. . .</tt>) into an
38
+ # ellipsis entity
39
+ #
40
+ # This means you can write, edit, and save your posts using plain old
41
+ # ASCII straight quotes, plain dashes, and plain dots, but your
42
+ # published posts (and final HTML output) will appear with smart
43
+ # quotes, em-dashes, and proper ellipses.
44
+ #
45
+ # RubyPants does not modify characters within <tt><pre></tt>,
46
+ # <tt><code></tt>, <tt><kbd></tt>, <tt><math></tt> or
47
+ # <tt><script></tt> tag blocks. Typically, these tags are used to
48
+ # display text where smart quotes and other "smart punctuation" would
49
+ # not be appropriate, such as source code or example markup.
50
+ #
51
+ #
52
+ # == Backslash Escapes
53
+ #
54
+ # If you need to use literal straight quotes (or plain hyphens and
55
+ # periods), RubyPants accepts the following backslash escape sequences
56
+ # to force non-smart punctuation. It does so by transforming the
57
+ # escape sequence into a decimal-encoded HTML entity:
58
+ #
59
+ # \\ \" \' \. \- \`
60
+ #
61
+ # This is useful, for example, when you want to use straight quotes as
62
+ # foot and inch marks: 6'2" tall; a 17" iMac. (Use <tt>6\'2\"</tt>
63
+ # resp. <tt>17\"</tt>.)
64
+ #
65
+ #
66
+ # == Algorithmic Shortcomings
67
+ #
68
+ # One situation in which quotes will get curled the wrong way is when
69
+ # apostrophes are used at the start of leading contractions. For
70
+ # example:
71
+ #
72
+ # 'Twas the night before Christmas.
73
+ #
74
+ # In the case above, RubyPants will turn the apostrophe into an
75
+ # opening single-quote, when in fact it should be a closing one. I
76
+ # don't think this problem can be solved in the general case--every
77
+ # word processor I've tried gets this wrong as well. In such cases,
78
+ # it's best to use the proper HTML entity for closing single-quotes
79
+ # ("<tt>&#8217;</tt>") by hand.
80
+ #
81
+ #
82
+ # == Bugs
83
+ #
84
+ # To file bug reports or feature requests (except see above) please
85
+ # send email to: mailto:chneukirchen@gmail.com
86
+ #
87
+ # If the bug involves quotes being curled the wrong way, please send
88
+ # example text to illustrate.
89
+ #
90
+ #
91
+ # == Authors
92
+ #
93
+ # John Gruber did all of the hard work of writing this software in
94
+ # Perl for Movable Type and almost all of this useful documentation.
95
+ # Chad Miller ported it to Python to use with Pyblosxom.
96
+ #
97
+ # Christian Neukirchen provided the Ruby port, as a general-purpose
98
+ # library that follows the *Cloth API.
99
+ #
100
+ #
101
+ # == Copyright and License
102
+ #
103
+ # === SmartyPants license:
104
+ #
105
+ # Copyright (c) 2003 John Gruber
106
+ # (http://daringfireball.net)
107
+ # All rights reserved.
108
+ #
109
+ # Redistribution and use in source and binary forms, with or without
110
+ # modification, are permitted provided that the following conditions
111
+ # are met:
112
+ #
113
+ # * Redistributions of source code must retain the above copyright
114
+ # notice, this list of conditions and the following disclaimer.
115
+ #
116
+ # * Redistributions in binary form must reproduce the above copyright
117
+ # notice, this list of conditions and the following disclaimer in
118
+ # the documentation and/or other materials provided with the
119
+ # distribution.
120
+ #
121
+ # * Neither the name "SmartyPants" nor the names of its contributors
122
+ # may be used to endorse or promote products derived from this
123
+ # software without specific prior written permission.
124
+ #
125
+ # This software is provided by the copyright holders and contributors
126
+ # "as is" and any express or implied warranties, including, but not
127
+ # limited to, the implied warranties of merchantability and fitness
128
+ # for a particular purpose are disclaimed. In no event shall the
129
+ # copyright owner or contributors be liable for any direct, indirect,
130
+ # incidental, special, exemplary, or consequential damages (including,
131
+ # but not limited to, procurement of substitute goods or services;
132
+ # loss of use, data, or profits; or business interruption) however
133
+ # caused and on any theory of liability, whether in contract, strict
134
+ # liability, or tort (including negligence or otherwise) arising in
135
+ # any way out of the use of this software, even if advised of the
136
+ # possibility of such damage.
137
+ #
138
+ # === RubyPants license
139
+ #
140
+ # RubyPants is a derivative work of SmartyPants and smartypants.py.
141
+ #
142
+ # Redistribution and use in source and binary forms, with or without
143
+ # modification, are permitted provided that the following conditions
144
+ # are met:
145
+ #
146
+ # * Redistributions of source code must retain the above copyright
147
+ # notice, this list of conditions and the following disclaimer.
148
+ #
149
+ # * Redistributions in binary form must reproduce the above copyright
150
+ # notice, this list of conditions and the following disclaimer in
151
+ # the documentation and/or other materials provided with the
152
+ # distribution.
153
+ #
154
+ # This software is provided by the copyright holders and contributors
155
+ # "as is" and any express or implied warranties, including, but not
156
+ # limited to, the implied warranties of merchantability and fitness
157
+ # for a particular purpose are disclaimed. In no event shall the
158
+ # copyright owner or contributors be liable for any direct, indirect,
159
+ # incidental, special, exemplary, or consequential damages (including,
160
+ # but not limited to, procurement of substitute goods or services;
161
+ # loss of use, data, or profits; or business interruption) however
162
+ # caused and on any theory of liability, whether in contract, strict
163
+ # liability, or tort (including negligence or otherwise) arising in
164
+ # any way out of the use of this software, even if advised of the
165
+ # possibility of such damage.
166
+ #
167
+ #
168
+ # == Links
169
+ #
170
+ # John Gruber:: http://daringfireball.net
171
+ # SmartyPants:: http://daringfireball.net/projects/smartypants
172
+ #
173
+ # Chad Miller:: http://web.chad.org
174
+ #
175
+ # Christian Neukirchen:: http://kronavita.de/chris
176
+ #
177
+
178
+
179
+ class RubyPants < String
180
+
181
+ # Create a new RubyPants instance with the text in +string+.
182
+ #
183
+ # Allowed elements in the options array:
184
+ #
185
+ # 0 :: do nothing
186
+ # 1 :: enable all, using only em-dash shortcuts
187
+ # 2 :: enable all, using old school en- and em-dash shortcuts (*default*)
188
+ # 3 :: enable all, using inverted old school en and em-dash shortcuts
189
+ # -1 :: stupefy (translate HTML entities to their ASCII-counterparts)
190
+ #
191
+ # If you don't like any of these defaults, you can pass symbols to change
192
+ # RubyPants' behavior:
193
+ #
194
+ # <tt>:quotes</tt> :: quotes
195
+ # <tt>:backticks</tt> :: backtick quotes (``double'' only)
196
+ # <tt>:allbackticks</tt> :: backtick quotes (``double'' and `single')
197
+ # <tt>:dashes</tt> :: dashes
198
+ # <tt>:oldschool</tt> :: old school dashes
199
+ # <tt>:inverted</tt> :: inverted old school dashes
200
+ # <tt>:ellipses</tt> :: ellipses
201
+ # <tt>:convertquotes</tt> :: convert <tt>&quot;</tt> entities to
202
+ # <tt>"</tt> for Dreamweaver users
203
+ # <tt>:stupefy</tt> :: translate RubyPants HTML entities
204
+ # to their ASCII counterparts.
205
+ #
206
+ def initialize(string, options=[2])
207
+ super string
208
+ @options = [*options]
209
+ end
210
+
211
+ # Apply SmartyPants transformations.
212
+ def to_html
213
+ do_quotes = do_backticks = do_dashes = do_ellipses = do_stupify = nil
214
+ convert_quotes = false
215
+
216
+ if @options.include? 0
217
+ # Do nothing.
218
+ return self
219
+ elsif @options.include? 1
220
+ # Do everything, turn all options on.
221
+ do_quotes = do_backticks = do_ellipses = true
222
+ do_dashes = :normal
223
+ elsif @options.include? 2
224
+ # Do everything, turn all options on, use old school dash shorthand.
225
+ do_quotes = do_backticks = do_ellipses = true
226
+ do_dashes = :oldschool
227
+ elsif @options.include? 3
228
+ # Do everything, turn all options on, use inverted old school
229
+ # dash shorthand.
230
+ do_quotes = do_backticks = do_ellipses = true
231
+ do_dashes = :inverted
232
+ elsif @options.include?(-1)
233
+ do_stupefy = true
234
+ else
235
+ do_quotes = @options.include? :quotes
236
+ do_backticks = @options.include? :backticks
237
+ do_backticks = :both if @options.include? :allbackticks
238
+ do_dashes = :normal if @options.include? :dashes
239
+ do_dashes = :oldschool if @options.include? :oldschool
240
+ do_dashes = :inverted if @options.include? :inverted
241
+ do_ellipses = @options.include? :ellipses
242
+ convert_quotes = @options.include? :convertquotes
243
+ do_stupefy = @options.include? :stupefy
244
+ end
245
+
246
+ # Parse the HTML
247
+ tokens = tokenize
248
+
249
+ # Keep track of when we're inside <pre> or <code> tags.
250
+ in_pre = false
251
+
252
+ # Here is the result stored in.
253
+ result = ""
254
+
255
+ # This is a cheat, used to get some context for one-character
256
+ # tokens that consist of just a quote char. What we do is remember
257
+ # the last character of the previous text token, to use as context
258
+ # to curl single- character quote tokens correctly.
259
+ prev_token_last_char = nil
260
+
261
+ tokens.each { |token|
262
+ if token.first == :tag
263
+ result << token[1]
264
+ if token[1] =~ %r!<(/?)(?:pre|code|kbd|script|math)[\s>]!
265
+ in_pre = ($1 != "/") # Opening or closing tag?
266
+ end
267
+ else
268
+ t = token[1]
269
+
270
+ # Remember last char of this token before processing.
271
+ last_char = t[-1].chr
272
+
273
+ unless in_pre
274
+ t = process_escapes t
275
+
276
+ t.gsub!(/&quot;/, '"') if convert_quotes
277
+
278
+ if do_dashes
279
+ t = educate_dashes t if do_dashes == :normal
280
+ t = educate_dashes_oldschool t if do_dashes == :oldschool
281
+ t = educate_dashes_inverted t if do_dashes == :inverted
282
+ end
283
+
284
+ t = educate_ellipses t if do_ellipses
285
+
286
+ # Note: backticks need to be processed before quotes.
287
+ if do_backticks
288
+ t = educate_backticks t
289
+ t = educate_single_backticks t if do_backticks == :both
290
+ end
291
+
292
+ if do_quotes
293
+ if t == "'"
294
+ # Special case: single-character ' token
295
+ if prev_token_last_char =~ /\S/
296
+ t = "&#8217;"
297
+ else
298
+ t = "&#8216;"
299
+ end
300
+ elsif t == '"'
301
+ # Special case: single-character " token
302
+ if prev_token_last_char =~ /\S/
303
+ t = "&#8221;"
304
+ else
305
+ t = "&#8220;"
306
+ end
307
+ else
308
+ # Normal case:
309
+ t = educate_quotes t
310
+ end
311
+ end
312
+
313
+ t = stupefy_entities t if do_stupefy
314
+ end
315
+
316
+ prev_token_last_char = last_char
317
+ result << t
318
+ end
319
+ }
320
+
321
+ # Done
322
+ result
323
+ end
324
+
325
+ protected
326
+
327
+ # Return the string, with after processing the following backslash
328
+ # escape sequences. This is useful if you want to force a "dumb" quote
329
+ # or other character to appear.
330
+ #
331
+ # Escaped are:
332
+ # \\ \" \' \. \- \`
333
+ #
334
+ def process_escapes(str)
335
+ str.gsub('\\\\', '&#92;').
336
+ gsub('\"', '&#34;').
337
+ gsub("\\\'", '&#39;').
338
+ gsub('\.', '&#46;').
339
+ gsub('\-', '&#45;').
340
+ gsub('\`', '&#96;')
341
+ end
342
+
343
+ # The string, with each instance of "<tt>--</tt>" translated to an
344
+ # em-dash HTML entity.
345
+ #
346
+ def educate_dashes(str)
347
+ str.gsub(/--/, '&#8212;')
348
+ end
349
+
350
+ # The string, with each instance of "<tt>--</tt>" translated to an
351
+ # en-dash HTML entity, and each "<tt>---</tt>" translated to an
352
+ # em-dash HTML entity.
353
+ #
354
+ def educate_dashes_oldschool(str)
355
+ str.gsub(/---/, '&#8212;').gsub(/--/, '&#8211;')
356
+ end
357
+
358
+ # Return the string, with each instance of "<tt>--</tt>" translated
359
+ # to an em-dash HTML entity, and each "<tt>---</tt>" translated to
360
+ # an en-dash HTML entity. Two reasons why: First, unlike the en- and
361
+ # em-dash syntax supported by +educate_dashes_oldschool+, it's
362
+ # compatible with existing entries written before SmartyPants 1.1,
363
+ # back when "<tt>--</tt>" was only used for em-dashes. Second,
364
+ # em-dashes are more common than en-dashes, and so it sort of makes
365
+ # sense that the shortcut should be shorter to type. (Thanks to
366
+ # Aaron Swartz for the idea.)
367
+ #
368
+ def educate_dashes_inverted(str)
369
+ str.gsub(/---/, '&#8211;').gsub(/--/, '&#8212;')
370
+ end
371
+
372
+ # Return the string, with each instance of "<tt>...</tt>" translated
373
+ # to an ellipsis HTML entity. Also converts the case where there are
374
+ # spaces between the dots.
375
+ #
376
+ def educate_ellipses(str)
377
+ str.gsub('...', '&#8230;').gsub('. . .', '&#8230;')
378
+ end
379
+
380
+ # Return the string, with "<tt>``backticks''</tt>"-style single quotes
381
+ # translated into HTML curly quote entities.
382
+ #
383
+ def educate_backticks(str)
384
+ str.gsub("``", '&#8220;').gsub("''", '&#8221;')
385
+ end
386
+
387
+ # Return the string, with "<tt>`backticks'</tt>"-style single quotes
388
+ # translated into HTML curly quote entities.
389
+ #
390
+ def educate_single_backticks(str)
391
+ str.gsub("`", '&#8216;').gsub("'", '&#8217;')
392
+ end
393
+
394
+ # Return the string, with "educated" curly quote HTML entities.
395
+ #
396
+ def educate_quotes(str)
397
+ punct_class = '[!"#\$\%\'()*+,\-.\/:;<=>?\@\[\\\\\]\^_`{|}~]'
398
+
399
+ str = str.dup
400
+
401
+ # Special case if the very first character is a quote followed by
402
+ # punctuation at a non-word-break. Close the quotes by brute
403
+ # force:
404
+ str.gsub!(/^'(?=#{punct_class}\B)/, '&#8217;')
405
+ str.gsub!(/^"(?=#{punct_class}\B)/, '&#8221;')
406
+
407
+ # Special case for double sets of quotes, e.g.:
408
+ # <p>He said, "'Quoted' words in a larger quote."</p>
409
+ str.gsub!(/"'(?=\w)/, '&#8220;&#8216;')
410
+ str.gsub!(/'"(?=\w)/, '&#8216;&#8220;')
411
+
412
+ # Special case for decade abbreviations (the '80s):
413
+ str.gsub!(/'(?=\d\ds)/, '&#8217;')
414
+
415
+ close_class = %![^\ \t\r\n\\[\{\(\-]!
416
+ dec_dashes = '&#8211;|&#8212;'
417
+
418
+ # Get most opening single quotes:
419
+ str.gsub!(/(\s|&nbsp;|--|&[mn]dash;|#{dec_dashes}|&#x201[34];)'(?=\w)/,
420
+ '\1&#8216;')
421
+ # Single closing quotes:
422
+ str.gsub!(/(#{close_class})'/, '\1&#8217;')
423
+ str.gsub!(/'(\s|s\b|$)/, '&#8217;\1')
424
+ # Any remaining single quotes should be opening ones:
425
+ str.gsub!(/'/, '&#8216;')
426
+
427
+ # Get most opening double quotes:
428
+ str.gsub!(/(\s|&nbsp;|--|&[mn]dash;|#{dec_dashes}|&#x201[34];)"(?=\w)/,
429
+ '\1&#8220;')
430
+ # Double closing quotes:
431
+ str.gsub!(/(#{close_class})"/, '\1&#8221;')
432
+ str.gsub!(/"(\s|s\b|$)/, '&#8221;\1')
433
+ # Any remaining quotes should be opening ones:
434
+ str.gsub!(/"/, '&#8220;')
435
+
436
+ str
437
+ end
438
+
439
+ # Return the string, with each RubyPants HTML entity translated to
440
+ # its ASCII counterpart.
441
+ #
442
+ # Note: This is not reversible (but exactly the same as in SmartyPants)
443
+ #
444
+ def stupefy_entities(str)
445
+ str.
446
+ gsub(/&#8211;/, '-'). # en-dash
447
+ gsub(/&#8212;/, '--'). # em-dash
448
+
449
+ gsub(/&#8216;/, "'"). # open single quote
450
+ gsub(/&#8217;/, "'"). # close single quote
451
+
452
+ gsub(/&#8220;/, '"'). # open double quote
453
+ gsub(/&#8221;/, '"'). # close double quote
454
+
455
+ gsub(/&#8230;/, '...') # ellipsis
456
+ end
457
+
458
+ # Return an array of the tokens comprising the string. Each token is
459
+ # either a tag (possibly with nested, tags contained therein, such
460
+ # as <tt><a href="<MTFoo>"></tt>, or a run of text between
461
+ # tags. Each element of the array is a two-element array; the first
462
+ # is either :tag or :text; the second is the actual value.
463
+ #
464
+ # Based on the <tt>_tokenize()</tt> subroutine from Brad Choate's
465
+ # MTRegex plugin. <http://www.bradchoate.com/past/mtregex.php>
466
+ #
467
+ # This is actually the easier variant using tag_soup, as used by
468
+ # Chad Miller in the Python port of SmartyPants.
469
+ #
470
+ def tokenize
471
+ tag_soup = /([^<]*)(<[^>]*>)/
472
+
473
+ tokens = []
474
+
475
+ prev_end = 0
476
+ scan(tag_soup) {
477
+ tokens << [:text, $1] if $1 != ""
478
+ tokens << [:tag, $2]
479
+
480
+ prev_end = $~.end(0)
481
+ }
482
+
483
+ if prev_end < size
484
+ tokens << [:text, self[prev_end..-1]]
485
+ end
486
+
487
+ tokens
488
+ end
489
+ end