webby 0.9.3-x86-mswin32

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 (229) hide show
  1. data/History.txt +206 -0
  2. data/Manifest.txt +228 -0
  3. data/README.txt +92 -0
  4. data/Rakefile +49 -0
  5. data/bin/webby +41 -0
  6. data/bin/webby-gen +41 -0
  7. data/examples/blog/Sitefile +7 -0
  8. data/examples/blog/tasks/blog.rake +72 -0
  9. data/examples/blog/templates/atom_feed.erb +40 -0
  10. data/examples/blog/templates/blog/month.erb +22 -0
  11. data/examples/blog/templates/blog/post.erb +16 -0
  12. data/examples/blog/templates/blog/year.erb +22 -0
  13. data/examples/presentation/Sitefile +10 -0
  14. data/examples/presentation/content/css/uv/twilight.css +137 -0
  15. data/examples/presentation/content/presentation/_sample_code.txt +10 -0
  16. data/examples/presentation/content/presentation/index.txt +63 -0
  17. data/examples/presentation/content/presentation/s5/blank.gif +0 -0
  18. data/examples/presentation/content/presentation/s5/bodybg.gif +0 -0
  19. data/examples/presentation/content/presentation/s5/framing.css +23 -0
  20. data/examples/presentation/content/presentation/s5/iepngfix.htc +42 -0
  21. data/examples/presentation/content/presentation/s5/opera.css +7 -0
  22. data/examples/presentation/content/presentation/s5/outline.css +15 -0
  23. data/examples/presentation/content/presentation/s5/pretty.css +86 -0
  24. data/examples/presentation/content/presentation/s5/print.css +25 -0
  25. data/examples/presentation/content/presentation/s5/s5-core.css +9 -0
  26. data/examples/presentation/content/presentation/s5/slides.css +3 -0
  27. data/examples/presentation/content/presentation/s5/slides.js +553 -0
  28. data/examples/presentation/layouts/presentation.txt +43 -0
  29. data/examples/presentation/templates/_code_partial.erb +13 -0
  30. data/examples/presentation/templates/presentation.erb +40 -0
  31. data/examples/tumblog/Sitefile +9 -0
  32. data/examples/tumblog/content/css/tumblog.css +308 -0
  33. data/examples/tumblog/content/images/tumblog/permalink.gif +0 -0
  34. data/examples/tumblog/content/images/tumblog/rss.gif +0 -0
  35. data/examples/tumblog/content/tumblog/200806/the-noble-chicken/index.txt +12 -0
  36. data/examples/tumblog/content/tumblog/200807/historical-perspectives-on-the-classic-chicken-joke/index.txt +12 -0
  37. data/examples/tumblog/content/tumblog/200807/mad-city-chickens/index.txt +10 -0
  38. data/examples/tumblog/content/tumblog/200807/the-wisdom-of-the-dutch/index.txt +11 -0
  39. data/examples/tumblog/content/tumblog/200807/up-a-tree/index.txt +13 -0
  40. data/examples/tumblog/content/tumblog/index.txt +37 -0
  41. data/examples/tumblog/content/tumblog/rss.txt +37 -0
  42. data/examples/tumblog/layouts/tumblog/default.txt +44 -0
  43. data/examples/tumblog/layouts/tumblog/post.txt +15 -0
  44. data/examples/tumblog/lib/tumblog_helper.rb +32 -0
  45. data/examples/tumblog/tasks/tumblog.rake +30 -0
  46. data/examples/tumblog/templates/atom_feed.erb +40 -0
  47. data/examples/tumblog/templates/tumblog/conversation.erb +12 -0
  48. data/examples/tumblog/templates/tumblog/link.erb +10 -0
  49. data/examples/tumblog/templates/tumblog/photo.erb +13 -0
  50. data/examples/tumblog/templates/tumblog/post.erb +12 -0
  51. data/examples/tumblog/templates/tumblog/quote.erb +11 -0
  52. data/examples/webby/Sitefile +19 -0
  53. data/examples/webby/content/communicate/index.txt +28 -0
  54. data/examples/webby/content/css/background.gif +0 -0
  55. data/examples/webby/content/css/blueprint/print.css +76 -0
  56. data/examples/webby/content/css/blueprint/screen.css +696 -0
  57. data/examples/webby/content/css/coderay.css +96 -0
  58. data/examples/webby/content/css/site.css +196 -0
  59. data/examples/webby/content/css/uv/twilight.css +137 -0
  60. data/examples/webby/content/index.txt +37 -0
  61. data/examples/webby/content/learn/index.txt +28 -0
  62. data/examples/webby/content/reference/index.txt +204 -0
  63. data/examples/webby/content/release-notes/index.txt +21 -0
  64. data/examples/webby/content/release-notes/rel-0-9-0/index.txt +74 -0
  65. data/examples/webby/content/release-notes/rel-0-9-1/index.txt +93 -0
  66. data/examples/webby/content/release-notes/rel-0-9-2/index.txt +14 -0
  67. data/examples/webby/content/release-notes/rel-0-9-3/index.txt +49 -0
  68. data/examples/webby/content/robots.txt +6 -0
  69. data/examples/webby/content/script/jquery.corner.js +152 -0
  70. data/examples/webby/content/script/jquery.js +31 -0
  71. data/examples/webby/content/sitemap.txt +31 -0
  72. data/examples/webby/content/tips_and_tricks/index.txt +97 -0
  73. data/examples/webby/content/tutorial/index.txt +135 -0
  74. data/examples/webby/content/user-manual/index.txt +419 -0
  75. data/examples/webby/layouts/default.txt +49 -0
  76. data/examples/webby/templates/page.erb +10 -0
  77. data/examples/website/Sitefile +7 -0
  78. data/examples/website/content/css/blueprint/License.txt +21 -0
  79. data/examples/website/content/css/blueprint/Readme.txt +100 -0
  80. data/examples/website/content/css/blueprint/compressed/print.css +76 -0
  81. data/examples/website/content/css/blueprint/compressed/screen.css +696 -0
  82. data/examples/website/content/css/blueprint/lib/forms.css +45 -0
  83. data/examples/website/content/css/blueprint/lib/grid.css +193 -0
  84. data/examples/website/content/css/blueprint/lib/grid.png +0 -0
  85. data/examples/website/content/css/blueprint/lib/ie.css +30 -0
  86. data/examples/website/content/css/blueprint/lib/reset.css +39 -0
  87. data/examples/website/content/css/blueprint/lib/typography.css +116 -0
  88. data/examples/website/content/css/blueprint/plugins/buttons/Readme +31 -0
  89. data/examples/website/content/css/blueprint/plugins/buttons/buttons.css +97 -0
  90. data/examples/website/content/css/blueprint/plugins/buttons/icons/cross.png +0 -0
  91. data/examples/website/content/css/blueprint/plugins/buttons/icons/key.png +0 -0
  92. data/examples/website/content/css/blueprint/plugins/buttons/icons/tick.png +0 -0
  93. data/examples/website/content/css/blueprint/plugins/css-classes/Readme +14 -0
  94. data/examples/website/content/css/blueprint/plugins/css-classes/css-classes.css +24 -0
  95. data/examples/website/content/css/blueprint/plugins/fancy-type/Readme +22 -0
  96. data/examples/website/content/css/blueprint/plugins/fancy-type/fancy-type-compressed.css +5 -0
  97. data/examples/website/content/css/blueprint/plugins/fancy-type/fancy-type.css +74 -0
  98. data/examples/website/content/css/blueprint/print.css +68 -0
  99. data/examples/website/content/css/blueprint/screen.css +22 -0
  100. data/examples/website/content/css/coderay.css +111 -0
  101. data/examples/website/content/css/site.css +67 -0
  102. data/examples/website/content/index.txt +19 -0
  103. data/examples/website/layouts/default.txt +58 -0
  104. data/examples/website/lib/breadcrumbs.rb +28 -0
  105. data/examples/website/templates/_partial.erb +10 -0
  106. data/examples/website/templates/page.erb +18 -0
  107. data/lib/webby.rb +221 -0
  108. data/lib/webby/apps.rb +12 -0
  109. data/lib/webby/apps/generator.rb +276 -0
  110. data/lib/webby/apps/main.rb +255 -0
  111. data/lib/webby/auto_builder.rb +157 -0
  112. data/lib/webby/builder.rb +180 -0
  113. data/lib/webby/core_ext/enumerable.rb +11 -0
  114. data/lib/webby/core_ext/hash.rb +28 -0
  115. data/lib/webby/core_ext/kernel.rb +26 -0
  116. data/lib/webby/core_ext/string.rb +163 -0
  117. data/lib/webby/core_ext/time.rb +9 -0
  118. data/lib/webby/filters.rb +83 -0
  119. data/lib/webby/filters/basepath.rb +97 -0
  120. data/lib/webby/filters/erb.rb +9 -0
  121. data/lib/webby/filters/haml.rb +18 -0
  122. data/lib/webby/filters/markdown.rb +16 -0
  123. data/lib/webby/filters/outline.rb +309 -0
  124. data/lib/webby/filters/sass.rb +17 -0
  125. data/lib/webby/filters/slides.rb +56 -0
  126. data/lib/webby/filters/textile.rb +16 -0
  127. data/lib/webby/filters/tidy.rb +76 -0
  128. data/lib/webby/filters/wiki_words.rb +14 -0
  129. data/lib/webby/helpers.rb +30 -0
  130. data/lib/webby/helpers/capture_helper.rb +141 -0
  131. data/lib/webby/helpers/coderay_helper.rb +69 -0
  132. data/lib/webby/helpers/graphviz_helper.rb +136 -0
  133. data/lib/webby/helpers/tag_helper.rb +65 -0
  134. data/lib/webby/helpers/tex_img_helper.rb +133 -0
  135. data/lib/webby/helpers/ultraviolet_helper.rb +63 -0
  136. data/lib/webby/helpers/url_helper.rb +241 -0
  137. data/lib/webby/journal.rb +126 -0
  138. data/lib/webby/link_validator.rb +152 -0
  139. data/lib/webby/renderer.rb +386 -0
  140. data/lib/webby/resources.rb +136 -0
  141. data/lib/webby/resources/db.rb +251 -0
  142. data/lib/webby/resources/layout.rb +54 -0
  143. data/lib/webby/resources/meta_file.rb +211 -0
  144. data/lib/webby/resources/page.rb +81 -0
  145. data/lib/webby/resources/partial.rb +85 -0
  146. data/lib/webby/resources/resource.rb +201 -0
  147. data/lib/webby/resources/static.rb +36 -0
  148. data/lib/webby/stelan/mktemp.rb +135 -0
  149. data/lib/webby/stelan/paginator.rb +165 -0
  150. data/lib/webby/stelan/spawner.rb +339 -0
  151. data/lib/webby/tasks/build.rake +27 -0
  152. data/lib/webby/tasks/create.rake +22 -0
  153. data/lib/webby/tasks/deploy.rake +22 -0
  154. data/lib/webby/tasks/growl.rake +16 -0
  155. data/lib/webby/tasks/validate.rake +19 -0
  156. data/spec/core_ext/hash_spec.rb +47 -0
  157. data/spec/core_ext/string_spec.rb +110 -0
  158. data/spec/core_ext/time_spec.rb +19 -0
  159. data/spec/data/hooligans/bad_meta_data_1.txt +34 -0
  160. data/spec/data/hooligans/bad_meta_data_2.txt +34 -0
  161. data/spec/data/outline/basic.out +81 -0
  162. data/spec/data/outline/basic.txt +25 -0
  163. data/spec/data/outline/no_clobber.out +86 -0
  164. data/spec/data/outline/numbering.out +81 -0
  165. data/spec/data/outline/numbering_only.out +21 -0
  166. data/spec/data/outline/toc_range_1.out +66 -0
  167. data/spec/data/outline/toc_range_2.out +55 -0
  168. data/spec/data/outline/toc_style.out +81 -0
  169. data/spec/data/site/Sitefile +9 -0
  170. data/spec/data/site/content/_partial.txt +10 -0
  171. data/spec/data/site/content/css/coderay.css +111 -0
  172. data/spec/data/site/content/css/site.css +67 -0
  173. data/spec/data/site/content/css/tumblog.css +308 -0
  174. data/spec/data/site/content/images/tumblog/permalink.gif +0 -0
  175. data/spec/data/site/content/images/tumblog/rss.gif +0 -0
  176. data/spec/data/site/content/index.txt +19 -0
  177. data/spec/data/site/content/photos.txt +21 -0
  178. data/spec/data/site/content/tumblog/200806/the-noble-chicken/index.txt +12 -0
  179. data/spec/data/site/content/tumblog/200807/historical-perspectives-on-the-classic-chicken-joke/index.txt +12 -0
  180. data/spec/data/site/content/tumblog/200807/mad-city-chickens/index.txt +10 -0
  181. data/spec/data/site/content/tumblog/200807/the-wisdom-of-the-dutch/index.txt +11 -0
  182. data/spec/data/site/content/tumblog/200807/up-a-tree/index.txt +13 -0
  183. data/spec/data/site/content/tumblog/index.txt +37 -0
  184. data/spec/data/site/content/tumblog/rss.txt +37 -0
  185. data/spec/data/site/layouts/default.txt +58 -0
  186. data/spec/data/site/layouts/tumblog/default.txt +44 -0
  187. data/spec/data/site/layouts/tumblog/post.txt +15 -0
  188. data/spec/data/site/lib/breadcrumbs.rb +28 -0
  189. data/spec/data/site/lib/tumblog_helper.rb +32 -0
  190. data/spec/data/site/tasks/tumblog.rake +30 -0
  191. data/spec/data/site/templates/_partial.erb +10 -0
  192. data/spec/data/site/templates/atom_feed.erb +40 -0
  193. data/spec/data/site/templates/page.erb +18 -0
  194. data/spec/data/site/templates/presentation.erb +40 -0
  195. data/spec/data/site/templates/tumblog/conversation.erb +12 -0
  196. data/spec/data/site/templates/tumblog/link.erb +10 -0
  197. data/spec/data/site/templates/tumblog/photo.erb +13 -0
  198. data/spec/data/site/templates/tumblog/post.erb +12 -0
  199. data/spec/data/site/templates/tumblog/quote.erb +11 -0
  200. data/spec/spec.opts +1 -0
  201. data/spec/spec_helper.rb +51 -0
  202. data/spec/webby/apps/generator_spec.rb +116 -0
  203. data/spec/webby/apps/main_spec.rb +88 -0
  204. data/spec/webby/filters/basepath_spec.rb +167 -0
  205. data/spec/webby/filters/outline_spec.rb +92 -0
  206. data/spec/webby/filters/textile_spec.rb +20 -0
  207. data/spec/webby/helpers/capture_helper_spec.rb +56 -0
  208. data/spec/webby/renderer_spec.rb +139 -0
  209. data/spec/webby/resources/db_spec.rb +250 -0
  210. data/spec/webby/resources/layout_spec.rb +83 -0
  211. data/spec/webby/resources/meta_file_spec.rb +171 -0
  212. data/spec/webby/resources/page_spec.rb +111 -0
  213. data/spec/webby/resources/partial_spec.rb +58 -0
  214. data/spec/webby/resources/resource_spec.rb +219 -0
  215. data/spec/webby/resources/static_spec.rb +49 -0
  216. data/spec/webby/resources_spec.rb +69 -0
  217. data/tasks/ann.rake +81 -0
  218. data/tasks/bones.rake +21 -0
  219. data/tasks/gem.rake +187 -0
  220. data/tasks/git.rake +41 -0
  221. data/tasks/manifest.rake +48 -0
  222. data/tasks/notes.rake +28 -0
  223. data/tasks/post_load.rake +39 -0
  224. data/tasks/rdoc.rake +51 -0
  225. data/tasks/rubyforge.rake +55 -0
  226. data/tasks/setup.rb +268 -0
  227. data/tasks/spec.rake +55 -0
  228. data/tasks/website.rake +38 -0
  229. metadata +365 -0
@@ -0,0 +1,11 @@
1
+
2
+ module Enumerable
3
+
4
+ def injecting( initial )
5
+ inject(initial) do |memo, obj|
6
+ yield(memo, obj); memo
7
+ end
8
+ end
9
+ end # module Enumerable
10
+
11
+ # EOF
@@ -0,0 +1,28 @@
1
+
2
+ class Hash
3
+
4
+ def sanitize!
5
+ h = self.injecting({}) do |h, (k, v)|
6
+ h[k] = case v
7
+ when 'none', 'nil'; nil
8
+ when 'true', 'yes'; true
9
+ when 'false', 'no'; false
10
+ else v end
11
+ end
12
+ self.replace h
13
+ end
14
+
15
+ def stringify_keys
16
+ h = {}
17
+ self.each {|k,v| h[k.to_s] = v}
18
+ return h
19
+ end
20
+
21
+ def symbolize_keys
22
+ h = {}
23
+ self.each {|k,v| h[k.to_sym] = v}
24
+ return h
25
+ end
26
+ end # class Hash
27
+
28
+ # EOF
@@ -0,0 +1,26 @@
1
+
2
+ module Kernel
3
+
4
+ # :stopdoc:
5
+ WINDOWS = %r/djgpp|(cyg|ms|bcc)win|mingw/ =~ RUBY_PLATFORM
6
+ DEV_NULL = WINDOWS ? 'NUL:' : '/dev/null'
7
+ # :startdoc:
8
+
9
+ def cmd_available?( *args )
10
+ io = [STDOUT.dup, STDERR.dup]
11
+ STDOUT.reopen DEV_NULL
12
+ STDERR.reopen DEV_NULL
13
+ system(*(args.flatten))
14
+ ensure
15
+ STDOUT.reopen io.first
16
+ STDERR.reopen io.last
17
+ $stdout, $stderr = STDOUT, STDERR
18
+ end
19
+
20
+ def journal
21
+ @journal ||= ::Webby::Journal.new
22
+ end
23
+
24
+ end # module Kernel
25
+
26
+ # EOF
@@ -0,0 +1,163 @@
1
+
2
+ class String
3
+
4
+ def self.small_words
5
+ @small_words ||= %w(a an and as at but by en for if in of on or the to v[.]? via vs[.]?)
6
+ end
7
+
8
+ def /( path )
9
+ ::File.join(self, path)
10
+ end
11
+
12
+ def titlecase
13
+ swrgxp = self.class.small_words.join('|')
14
+
15
+ parts = self.split( %r/( [:.;?!][ ] | (?:[ ]|^)["“] )/x )
16
+ parts.each do |part|
17
+ part.gsub!(%r/\b[[:alpha:]][[:lower:].'’]*\b/) do |s|
18
+ s =~ %r/\w+\.\w+/ ? s : s.capitalize
19
+ end
20
+
21
+ # Lowercase the small words
22
+ part.gsub!(%r/\b(#{swrgxp})\b/i) {|w| w.downcase}
23
+
24
+ # If the first word is a small word, then capitalize it
25
+ part.gsub!(%r/\A([[:punct:]]*)(#{swrgxp})\b/) {$1 + $2.capitalize}
26
+
27
+ # If the last word is a small word, then capitalize it
28
+ part.gsub!(%r/\b(#{swrgxp})([^\w\s]*)\z/) {$1.capitalize + $2}
29
+ end
30
+
31
+ str = parts.join
32
+
33
+ # Special cases:
34
+ str.gsub!(/ V(s?)\. /, ' v\1. ') # "v." and "vs."
35
+ str.gsub!(/(['’])S\b/, '\1s') # 'S (otherwise you get "the SEC'S decision")
36
+ str.gsub!(/\b(AT&T|Q&A)\b/i) { |w| w.upcase } # "AT&T" and "Q&A", which get tripped up.
37
+
38
+ str
39
+ end
40
+
41
+ # Borrowed from the excellent StringEx library: git://github.com/rsl/stringex.git
42
+
43
+ # Create a URI-friendly representation of the string.
44
+ def to_url
45
+ remove_formatting.downcase.replace_whitespace("-").collapse("-")
46
+ end
47
+
48
+ # Performs multiple text manipulations. Essentially a shortcut for typing them all. View source
49
+ # below to see which methods are run.
50
+ def remove_formatting
51
+ strip_html_tags.convert_accented_entities.convert_misc_entities.convert_misc_characters.collapse
52
+ end
53
+
54
+ # Removes HTML tags from text. This code is simplified from Tobias Luettke's regular expression
55
+ # in Typo[http://typosphere.org].
56
+ def strip_html_tags(leave_whitespace = false)
57
+ name = /[\w:_-]+/
58
+ value = /([A-Za-z0-9]+|('[^']*?'|"[^"]*?"))/
59
+ attr = /(#{name}(\s*=\s*#{value})?)/
60
+ rx = /<[!\/?\[]?(#{name}|--)(\s+(#{attr}(\s+#{attr})*))?\s*([!\/?\]]+|--)?>/
61
+ (leave_whitespace) ? gsub(rx, "").strip : gsub(rx, "").gsub(/\s+/, " ").strip
62
+ end
63
+
64
+ # Converts HTML entities into the respective non-accented letters. Examples:
65
+ #
66
+ # "&aacute;".convert_accented_entities # => "a"
67
+ # "&ccedil;".convert_accented_entities # => "c"
68
+ # "&egrave;".convert_accented_entities # => "e"
69
+ # "&icirc;".convert_accented_entities # => "i"
70
+ # "&oslash;".convert_accented_entities # => "o"
71
+ # "&uuml;".convert_accented_entities # => "u"
72
+ #
73
+ # Note: This does not do any conversion of Unicode/Ascii accented-characters. For that
74
+ # functionality please use <tt>to_ascii</tt>.
75
+ def convert_accented_entities
76
+ gsub(/&([A-Za-z])(grave|acute|circ|tilde|uml|ring|cedil|slash);/, '\1')
77
+ end
78
+
79
+ # Converts HTML entities (taken from common Textile/RedCloth formattings) into plain text formats.
80
+ #
81
+ # Note: This isn't an attempt at complete conversion of HTML entities, just those most likely
82
+ # to be generated by Textile.
83
+ def convert_misc_entities
84
+ dummy = dup
85
+ {
86
+ "#822[01]" => "\"",
87
+ "#821[67]" => "'",
88
+ "#8230" => "...",
89
+ "#8211" => "-",
90
+ "#8212" => "--",
91
+ "#215" => "x",
92
+ "gt" => ">",
93
+ "lt" => "<",
94
+ "(#8482|trade)" => "(tm)",
95
+ "(#174|reg)" => "(r)",
96
+ "(#169|copy)" => "(c)",
97
+ "(#38|amp)" => "and",
98
+ "nbsp" => " ",
99
+ "(#162|cent)" => " cent",
100
+ "(#163|pound)" => " pound",
101
+ "(#188|frac14)" => "one fourth",
102
+ "(#189|frac12)" => "half",
103
+ "(#190|frac34)" => "three fourths",
104
+ "(#176|deg)" => " degrees"
105
+ }.each do |textiled, normal|
106
+ dummy.gsub!(/&#{textiled};/, normal)
107
+ end
108
+ dummy.gsub(/&[^;]+;/, "")
109
+ end
110
+
111
+ # Converts various common plaintext characters to a more URI-friendly representation.
112
+ # Examples:
113
+ #
114
+ # "foo & bar".convert_misc_characters # => "foo and bar"
115
+ # "Chanel #9".convert_misc_characters # => "Chanel number nine"
116
+ # "user@host".convert_misc_characters # => "user at host"
117
+ # "google.com".convert_misc_characters # => "google dot com"
118
+ # "$10".convert_misc_characters # => "10 dollars"
119
+ # "*69".convert_misc_characters # => "star 69"
120
+ # "100%".convert_misc_characters # => "100 percent"
121
+ # "windows/mac/linux".convert_misc_characters # => "windows slash mac slash linux"
122
+ #
123
+ # Note: Because this method will convert any & symbols to the string "and",
124
+ # you should run any methods which convert HTML entities (convert_html_entities and convert_misc_entities)
125
+ # before running this method.
126
+ def convert_misc_characters
127
+ dummy = dup.gsub(/\.{3,}/, " dot dot dot ") # Catch ellipses before single dot rule!
128
+ {
129
+ /\s*&\s*/ => "and",
130
+ /\s*#/ => "number",
131
+ /\s*@\s*/ => "at",
132
+ /(\S|^)\.(\S)/ => '\1 dot \2',
133
+ /(\s|^)\$(\d*)(\s|$)/ => '\2 dollars',
134
+ /\s*\*\s*/ => "star",
135
+ /\s*%\s*/ => "percent",
136
+ /\s*(\\|\/)\s*/ => "slash",
137
+ }.each do |found, replaced|
138
+ replaced = " #{replaced} " unless replaced =~ /\\1/
139
+ dummy.gsub!(found, replaced)
140
+ end
141
+ dummy = dummy.gsub(/(^|\w)'(\w|$)/, '\1\2').gsub(/[\.,:;()\[\]\/\?!\^'"_]/, " ")
142
+ end
143
+
144
+ # Replace runs of whitespace in string. Defaults to a single space but any replacement
145
+ # string may be specified as an argument. Examples:
146
+ #
147
+ # "Foo bar".replace_whitespace # => "Foo bar"
148
+ # "Foo bar".replace_whitespace("-") # => "Foo-bar"
149
+ def replace_whitespace(replace = " ")
150
+ gsub(/\s+/, replace)
151
+ end
152
+
153
+ # Removes specified character from the beginning and/or end of the string and then performs
154
+ # <tt>String#squeeze(character)</tt>, condensing runs of the character within the string.
155
+ #
156
+ # Note: This method has been superceded by ActiveSupport's squish method.
157
+ def collapse(character = " ")
158
+ sub(/^#{character}*/, "").sub(/#{character}*$/, "").squeeze(character)
159
+ end
160
+
161
+ end # class String
162
+
163
+ # EOF
@@ -0,0 +1,9 @@
1
+
2
+ class Time
3
+
4
+ def to_y
5
+ self.to_yaml.slice(4..-1).strip
6
+ end
7
+ end # class Time
8
+
9
+ # EOF
@@ -0,0 +1,83 @@
1
+ module Webby
2
+ module Filters
3
+
4
+ class << self
5
+
6
+ # Register a handler for a filter
7
+ def register( filter, &block )
8
+ _handlers[filter.to_s] = block
9
+ end
10
+
11
+ # Process input through filters
12
+ def process( renderer, page, input )
13
+ # Start a new cursor for this page
14
+ Cursor.new(renderer, page).start_for(input)
15
+ end
16
+
17
+ # Access a filter handler
18
+ def []( name )
19
+ _handlers[name]
20
+ end
21
+
22
+ # The registered filter handlers
23
+ def _handlers
24
+ @handlers ||= {}
25
+ end
26
+
27
+ # Instances of this class handle processing a set of filters
28
+ # for a given renderer and page.
29
+ # Note: The instance is passed as the second argument to filters
30
+ # that require two parameters and can be used to access
31
+ # information on the renderer, page, or filters being
32
+ # processed.
33
+ class Cursor
34
+
35
+ attr_reader :renderer, :page, :filters
36
+ def initialize(renderer, page)
37
+ @renderer, @page = renderer, page
38
+ @filters = Array(page.filter)
39
+ @log = Logging::Logger[Webby::Renderer]
40
+ @processed = 0
41
+ @prev_cursor = nil
42
+ end
43
+
44
+ def start_for(input)
45
+ @prev_cursor = @renderer.instance_variable_get(:@_cursor)
46
+ @renderer.instance_variable_set(:@_cursor, self)
47
+ filters.inject(input) do |result, filter|
48
+ handler = Filters[filter]
49
+ raise ::Webby::Error, "unknown filter: #{filter.inspect}" if handler.nil?
50
+
51
+ args = [result, self][0, handler.arity]
52
+ _handle(filter, handler, *args)
53
+ end
54
+ ensure
55
+ @renderer.instance_variable_set(:@_cursor, @prev_cursor)
56
+ end
57
+
58
+ # The list of filters yet to be processed
59
+ def remaining_filters
60
+ filters[@processed..-1]
61
+ end
62
+
63
+ # The name of the current filter
64
+ def current_filter
65
+ filters[@processed]
66
+ end
67
+
68
+ # Process arguments through a single filter
69
+ def _handle(filter, handler, *args)
70
+ result = handler.call(*args)
71
+ @processed += 1
72
+ result
73
+ end
74
+
75
+ end # class Cursor
76
+ end # class << self
77
+
78
+ end # module Filters
79
+ end # module Webby
80
+
81
+ Webby.require_all_libs_relative_to(__FILE__)
82
+
83
+ # EOF
@@ -0,0 +1,97 @@
1
+ require 'hpricot'
2
+
3
+ module Webby
4
+ module Filters
5
+
6
+ # The BasePath filter is used to rewrite URI paths in HTML documents. This
7
+ # is useful when the server location of the website is not located at the
8
+ # root of the webserver (e.g. http://my.site.com/foo/bar).
9
+ #
10
+ # The BasePath filter will adjust the URI paths in a given HTML document by
11
+ # prepending a base path to the URI. This only works for URIs that start
12
+ # with a leading slash "/". Any other character will exclude the URI from
13
+ # being modified.
14
+ #
15
+ # Assume the user specifies a new URI base in the <tt>Webby.site.base</tt>
16
+ # property:
17
+ #
18
+ # Webby.site.base = '/foo/bar'
19
+ #
20
+ # Here is a snippet from some HTML document.
21
+ #
22
+ # <a href="/some/other/page.html">Page</a>
23
+ # <img src="fractal.jpg" alt="a fractal" />
24
+ #
25
+ # When run through the BasePath filter, the resulting snippet would look
26
+ # like this.
27
+ #
28
+ # <a href="/foo/bar/some/other/page.html">Page</a>
29
+ # <img src="fractal.jpg" alt="a fractal" />
30
+ #
31
+ # The +href+ attribute of the anchor tag is modified because it started
32
+ # with a leading slash. The +src+ attribute of the image tag is not
33
+ # modified because it lacks the leading slash.
34
+ #
35
+ class BasePath
36
+
37
+ # call-seq:
38
+ # BasePath.new( html, mode )
39
+ #
40
+ # Creates a new BasePath filter that will operate on the given _html_
41
+ # string. The _mode_ is either 'xml' or 'html' and determines how Hpricot
42
+ # will handle the parsing of the input string.
43
+ #
44
+ def initialize( str, mode )
45
+ @str = str
46
+ @mode = mode.downcase.to_sym
47
+ end
48
+
49
+ # call-seq:
50
+ # filter => html
51
+ #
52
+ # Process the original html document passed to the filter when it was
53
+ # created. The document will be scanned and the basepath for certain
54
+ # elements will be modified.
55
+ #
56
+ # For example, if a document contains the following line:
57
+ #
58
+ # <a href="/link/to/another/page.html">Page</a>
59
+ #
60
+ # and the user has requested for the base path to be some other directory
61
+ # on the webserver -- <tt>/some/other/directory</tt>. The result of the
62
+ # BasePath filter would be:
63
+ #
64
+ # <a href="/some/other/directory/link/to/another/page.html">Page</a>
65
+ #
66
+ def filter
67
+ doc = @mode == :xml ? Hpricot.XML(@str) : Hpricot(@str)
68
+ base_path = ::Webby.site.base
69
+ attr_rgxp = %r/\[@(\w+)\]$/o
70
+ sub_rgxp = %r/\A(?=\/)/o
71
+
72
+ ::Webby.site.xpaths.each do |xpath|
73
+ @attr_name = nil
74
+
75
+ doc.search(xpath).each do |element|
76
+ @attr_name ||= attr_rgxp.match(xpath)[1]
77
+ a = element.get_attribute(@attr_name)
78
+ element.set_attribute(@attr_name, a) if a.sub!(sub_rgxp, base_path)
79
+ end
80
+ end
81
+
82
+ doc.to_html
83
+ end
84
+
85
+ end # class BasePath
86
+
87
+ # Rewrite base URIs in the input HTML text.
88
+ #
89
+ register :basepath do |input, cursor|
90
+ if ::Webby.site.base then BasePath.new(input, cursor.page.extension).filter
91
+ else input end
92
+ end
93
+
94
+ end # module Filters
95
+ end # module Webby
96
+
97
+ # EOF
@@ -0,0 +1,9 @@
1
+ require 'erb'
2
+
3
+ # Render text via ERB using the built in ERB library.
4
+ Webby::Filters.register :erb do |input, cursor|
5
+ b = cursor.renderer.get_binding
6
+ ERB.new(input, nil, '-').result(b)
7
+ end
8
+
9
+ # EOF
@@ -0,0 +1,18 @@
1
+
2
+ # Render text via the Haml library
3
+ if try_require('haml', 'haml')
4
+
5
+ Webby::Filters.register :haml do |input, cursor|
6
+ opts = ::Webby.site.haml_options.merge(cursor.page.haml_options || {})
7
+ b = cursor.renderer.get_binding
8
+ Haml::Engine.new(input, opts).to_html(b)
9
+ end
10
+
11
+ # Otherwise raise an error if the user tries to use haml
12
+ else
13
+ Webby::Filters.register :haml do |input, cursor|
14
+ raise Webby::Error, "'haml' must be installed to use the haml filter"
15
+ end
16
+ end
17
+
18
+ # EOF