jamesgolick-webby 0.9.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (233) hide show
  1. data/History.txt +219 -0
  2. data/README.rdoc +92 -0
  3. data/Rakefile +62 -0
  4. data/bin/webby +41 -0
  5. data/bin/webby-gen +41 -0
  6. data/examples/blog/Sitefile +7 -0
  7. data/examples/blog/tasks/blog.rake +72 -0
  8. data/examples/blog/templates/atom_feed.erb +40 -0
  9. data/examples/blog/templates/blog/month.erb +22 -0
  10. data/examples/blog/templates/blog/post.erb +16 -0
  11. data/examples/blog/templates/blog/year.erb +22 -0
  12. data/examples/presentation/Sitefile +10 -0
  13. data/examples/presentation/content/css/uv/twilight.css +137 -0
  14. data/examples/presentation/content/presentation/_sample_code.txt +10 -0
  15. data/examples/presentation/content/presentation/index.txt +63 -0
  16. data/examples/presentation/content/presentation/s5/blank.gif +0 -0
  17. data/examples/presentation/content/presentation/s5/bodybg.gif +0 -0
  18. data/examples/presentation/content/presentation/s5/framing.css +23 -0
  19. data/examples/presentation/content/presentation/s5/iepngfix.htc +42 -0
  20. data/examples/presentation/content/presentation/s5/opera.css +7 -0
  21. data/examples/presentation/content/presentation/s5/outline.css +15 -0
  22. data/examples/presentation/content/presentation/s5/pretty.css +86 -0
  23. data/examples/presentation/content/presentation/s5/print.css +25 -0
  24. data/examples/presentation/content/presentation/s5/s5-core.css +9 -0
  25. data/examples/presentation/content/presentation/s5/slides.css +3 -0
  26. data/examples/presentation/content/presentation/s5/slides.js +553 -0
  27. data/examples/presentation/layouts/presentation.txt +43 -0
  28. data/examples/presentation/templates/_code_partial.erb +13 -0
  29. data/examples/presentation/templates/presentation.erb +40 -0
  30. data/examples/tumblog/Sitefile +9 -0
  31. data/examples/tumblog/content/css/tumblog.css +308 -0
  32. data/examples/tumblog/content/images/tumblog/permalink.gif +0 -0
  33. data/examples/tumblog/content/images/tumblog/rss.gif +0 -0
  34. data/examples/tumblog/content/tumblog/200806/the-noble-chicken/index.txt +12 -0
  35. data/examples/tumblog/content/tumblog/200807/historical-perspectives-on-the-classic-chicken-joke/index.txt +12 -0
  36. data/examples/tumblog/content/tumblog/200807/mad-city-chickens/index.txt +10 -0
  37. data/examples/tumblog/content/tumblog/200807/the-wisdom-of-the-dutch/index.txt +11 -0
  38. data/examples/tumblog/content/tumblog/200807/up-a-tree/index.txt +13 -0
  39. data/examples/tumblog/content/tumblog/index.txt +37 -0
  40. data/examples/tumblog/content/tumblog/rss.txt +37 -0
  41. data/examples/tumblog/layouts/tumblog/default.txt +44 -0
  42. data/examples/tumblog/layouts/tumblog/post.txt +15 -0
  43. data/examples/tumblog/lib/tumblog_helper.rb +32 -0
  44. data/examples/tumblog/tasks/tumblog.rake +30 -0
  45. data/examples/tumblog/templates/atom_feed.erb +40 -0
  46. data/examples/tumblog/templates/tumblog/conversation.erb +12 -0
  47. data/examples/tumblog/templates/tumblog/link.erb +10 -0
  48. data/examples/tumblog/templates/tumblog/photo.erb +13 -0
  49. data/examples/tumblog/templates/tumblog/post.erb +12 -0
  50. data/examples/tumblog/templates/tumblog/quote.erb +11 -0
  51. data/examples/webby/Sitefile +19 -0
  52. data/examples/webby/content/communicate/index.txt +28 -0
  53. data/examples/webby/content/css/background.gif +0 -0
  54. data/examples/webby/content/css/blueprint/print.css +76 -0
  55. data/examples/webby/content/css/blueprint/screen.css +696 -0
  56. data/examples/webby/content/css/coderay.css +96 -0
  57. data/examples/webby/content/css/site.css +196 -0
  58. data/examples/webby/content/css/uv/twilight.css +137 -0
  59. data/examples/webby/content/index.txt +37 -0
  60. data/examples/webby/content/learn/index.txt +28 -0
  61. data/examples/webby/content/reference/index.txt +204 -0
  62. data/examples/webby/content/release-notes/index.txt +21 -0
  63. data/examples/webby/content/release-notes/rel-0-9-0/index.txt +74 -0
  64. data/examples/webby/content/release-notes/rel-0-9-1/index.txt +93 -0
  65. data/examples/webby/content/release-notes/rel-0-9-2/index.txt +14 -0
  66. data/examples/webby/content/release-notes/rel-0-9-3/index.txt +47 -0
  67. data/examples/webby/content/robots.txt +6 -0
  68. data/examples/webby/content/script/jquery.corner.js +152 -0
  69. data/examples/webby/content/script/jquery.js +31 -0
  70. data/examples/webby/content/sitemap.txt +31 -0
  71. data/examples/webby/content/tips_and_tricks/index.txt +97 -0
  72. data/examples/webby/content/tutorial/index.txt +135 -0
  73. data/examples/webby/content/user-manual/index.txt +419 -0
  74. data/examples/webby/layouts/default.txt +49 -0
  75. data/examples/webby/templates/page.erb +10 -0
  76. data/examples/website/Sitefile +7 -0
  77. data/examples/website/content/css/blueprint/ie.css +26 -0
  78. data/examples/website/content/css/blueprint/plugins/buttons/icons/cross.png +0 -0
  79. data/examples/website/content/css/blueprint/plugins/buttons/icons/key.png +0 -0
  80. data/examples/website/content/css/blueprint/plugins/buttons/icons/tick.png +0 -0
  81. data/examples/website/content/css/blueprint/plugins/buttons/readme.txt +32 -0
  82. data/examples/website/content/css/blueprint/plugins/buttons/screen.css +97 -0
  83. data/examples/website/content/css/blueprint/plugins/fancy-type/readme.txt +14 -0
  84. data/examples/website/content/css/blueprint/plugins/fancy-type/screen.css +71 -0
  85. data/examples/website/content/css/blueprint/plugins/link-icons/icons/doc.png +0 -0
  86. data/examples/website/content/css/blueprint/plugins/link-icons/icons/email.png +0 -0
  87. data/examples/website/content/css/blueprint/plugins/link-icons/icons/external.png +0 -0
  88. data/examples/website/content/css/blueprint/plugins/link-icons/icons/feed.png +0 -0
  89. data/examples/website/content/css/blueprint/plugins/link-icons/icons/im.png +0 -0
  90. data/examples/website/content/css/blueprint/plugins/link-icons/icons/pdf.png +0 -0
  91. data/examples/website/content/css/blueprint/plugins/link-icons/icons/visited.png +0 -0
  92. data/examples/website/content/css/blueprint/plugins/link-icons/icons/xls.png +0 -0
  93. data/examples/website/content/css/blueprint/plugins/link-icons/readme.txt +18 -0
  94. data/examples/website/content/css/blueprint/plugins/link-icons/screen.css +40 -0
  95. data/examples/website/content/css/blueprint/plugins/rtl/readme.txt +10 -0
  96. data/examples/website/content/css/blueprint/plugins/rtl/screen.css +109 -0
  97. data/examples/website/content/css/blueprint/print.css +30 -0
  98. data/examples/website/content/css/blueprint/screen.css +251 -0
  99. data/examples/website/content/css/blueprint/src/forms.css +49 -0
  100. data/examples/website/content/css/blueprint/src/grid.css +212 -0
  101. data/examples/website/content/css/blueprint/src/grid.png +0 -0
  102. data/examples/website/content/css/blueprint/src/ie.css +59 -0
  103. data/examples/website/content/css/blueprint/src/print.css +85 -0
  104. data/examples/website/content/css/blueprint/src/reset.css +38 -0
  105. data/examples/website/content/css/blueprint/src/typography.css +105 -0
  106. data/examples/website/content/css/coderay.css +111 -0
  107. data/examples/website/content/css/site.css +67 -0
  108. data/examples/website/content/index.txt +19 -0
  109. data/examples/website/layouts/default.txt +61 -0
  110. data/examples/website/lib/breadcrumbs.rb +28 -0
  111. data/examples/website/templates/_partial.erb +10 -0
  112. data/examples/website/templates/page.erb +18 -0
  113. data/lib/webby.rb +233 -0
  114. data/lib/webby/apps.rb +12 -0
  115. data/lib/webby/apps/generator.rb +276 -0
  116. data/lib/webby/apps/main.rb +258 -0
  117. data/lib/webby/auto_builder.rb +157 -0
  118. data/lib/webby/builder.rb +172 -0
  119. data/lib/webby/core_ext/enumerable.rb +11 -0
  120. data/lib/webby/core_ext/hash.rb +28 -0
  121. data/lib/webby/core_ext/kernel.rb +26 -0
  122. data/lib/webby/core_ext/string.rb +163 -0
  123. data/lib/webby/core_ext/time.rb +9 -0
  124. data/lib/webby/filters.rb +85 -0
  125. data/lib/webby/filters/basepath.rb +97 -0
  126. data/lib/webby/filters/erb.rb +9 -0
  127. data/lib/webby/filters/haml.rb +18 -0
  128. data/lib/webby/filters/markdown.rb +16 -0
  129. data/lib/webby/filters/maruku.rb +16 -0
  130. data/lib/webby/filters/outline.rb +309 -0
  131. data/lib/webby/filters/sass.rb +17 -0
  132. data/lib/webby/filters/slides.rb +56 -0
  133. data/lib/webby/filters/textile.rb +16 -0
  134. data/lib/webby/filters/tidy.rb +76 -0
  135. data/lib/webby/filters/wiki_words.rb +14 -0
  136. data/lib/webby/helpers.rb +30 -0
  137. data/lib/webby/helpers/capture_helper.rb +141 -0
  138. data/lib/webby/helpers/coderay_helper.rb +69 -0
  139. data/lib/webby/helpers/graphviz_helper.rb +136 -0
  140. data/lib/webby/helpers/tag_helper.rb +65 -0
  141. data/lib/webby/helpers/tex_img_helper.rb +133 -0
  142. data/lib/webby/helpers/ultraviolet_helper.rb +63 -0
  143. data/lib/webby/helpers/url_helper.rb +241 -0
  144. data/lib/webby/journal.rb +126 -0
  145. data/lib/webby/link_validator.rb +160 -0
  146. data/lib/webby/renderer.rb +390 -0
  147. data/lib/webby/resources.rb +137 -0
  148. data/lib/webby/resources/db.rb +251 -0
  149. data/lib/webby/resources/layout.rb +54 -0
  150. data/lib/webby/resources/meta_file.rb +211 -0
  151. data/lib/webby/resources/page.rb +81 -0
  152. data/lib/webby/resources/partial.rb +85 -0
  153. data/lib/webby/resources/resource.rb +201 -0
  154. data/lib/webby/resources/static.rb +36 -0
  155. data/lib/webby/stelan/mktemp.rb +135 -0
  156. data/lib/webby/stelan/paginator.rb +165 -0
  157. data/lib/webby/tasks/build.rake +27 -0
  158. data/lib/webby/tasks/create.rake +25 -0
  159. data/lib/webby/tasks/deploy.rake +22 -0
  160. data/lib/webby/tasks/growl.rake +16 -0
  161. data/lib/webby/tasks/validate.rake +19 -0
  162. data/spec/core_ext/hash_spec.rb +47 -0
  163. data/spec/core_ext/string_spec.rb +110 -0
  164. data/spec/core_ext/time_spec.rb +19 -0
  165. data/spec/data/hooligans/bad_meta_data_1.txt +34 -0
  166. data/spec/data/hooligans/bad_meta_data_2.txt +34 -0
  167. data/spec/data/html/anchor.html +11 -0
  168. data/spec/data/html/external.html +10 -0
  169. data/spec/data/html/invalid-relative.html +10 -0
  170. data/spec/data/html/relative-anchor.html +10 -0
  171. data/spec/data/html/relative-invalid-anchor.html +10 -0
  172. data/spec/data/html/relative.html +10 -0
  173. data/spec/data/outline/basic.out +81 -0
  174. data/spec/data/outline/basic.txt +25 -0
  175. data/spec/data/outline/no_clobber.out +86 -0
  176. data/spec/data/outline/numbering.out +81 -0
  177. data/spec/data/outline/numbering_only.out +21 -0
  178. data/spec/data/outline/toc_range_1.out +66 -0
  179. data/spec/data/outline/toc_range_2.out +55 -0
  180. data/spec/data/outline/toc_style.out +81 -0
  181. data/spec/data/site/Sitefile +9 -0
  182. data/spec/data/site/content/_partial.txt +10 -0
  183. data/spec/data/site/content/css/coderay.css +111 -0
  184. data/spec/data/site/content/css/site.css +67 -0
  185. data/spec/data/site/content/css/tumblog.css +308 -0
  186. data/spec/data/site/content/images/tumblog/permalink.gif +0 -0
  187. data/spec/data/site/content/images/tumblog/rss.gif +0 -0
  188. data/spec/data/site/content/index.txt +19 -0
  189. data/spec/data/site/content/photos.txt +21 -0
  190. data/spec/data/site/content/tumblog/200806/the-noble-chicken/index.txt +12 -0
  191. data/spec/data/site/content/tumblog/200807/historical-perspectives-on-the-classic-chicken-joke/index.txt +12 -0
  192. data/spec/data/site/content/tumblog/200807/mad-city-chickens/index.txt +10 -0
  193. data/spec/data/site/content/tumblog/200807/the-wisdom-of-the-dutch/index.txt +11 -0
  194. data/spec/data/site/content/tumblog/200807/up-a-tree/index.txt +13 -0
  195. data/spec/data/site/content/tumblog/index.txt +37 -0
  196. data/spec/data/site/content/tumblog/rss.txt +37 -0
  197. data/spec/data/site/layouts/default.txt +58 -0
  198. data/spec/data/site/layouts/tumblog/default.txt +44 -0
  199. data/spec/data/site/layouts/tumblog/post.txt +15 -0
  200. data/spec/data/site/lib/breadcrumbs.rb +28 -0
  201. data/spec/data/site/lib/tumblog_helper.rb +32 -0
  202. data/spec/data/site/tasks/tumblog.rake +30 -0
  203. data/spec/data/site/templates/_partial.erb +10 -0
  204. data/spec/data/site/templates/atom_feed.erb +40 -0
  205. data/spec/data/site/templates/page.erb +18 -0
  206. data/spec/data/site/templates/presentation.erb +40 -0
  207. data/spec/data/site/templates/tumblog/conversation.erb +12 -0
  208. data/spec/data/site/templates/tumblog/link.erb +10 -0
  209. data/spec/data/site/templates/tumblog/photo.erb +13 -0
  210. data/spec/data/site/templates/tumblog/post.erb +12 -0
  211. data/spec/data/site/templates/tumblog/quote.erb +11 -0
  212. data/spec/spec.opts +1 -0
  213. data/spec/spec_helper.rb +58 -0
  214. data/spec/webby/apps/generator_spec.rb +117 -0
  215. data/spec/webby/apps/main_spec.rb +88 -0
  216. data/spec/webby/filters/basepath_spec.rb +167 -0
  217. data/spec/webby/filters/maruku_spec.rb +31 -0
  218. data/spec/webby/filters/outline_spec.rb +92 -0
  219. data/spec/webby/filters/textile_spec.rb +31 -0
  220. data/spec/webby/helpers/capture_helper_spec.rb +56 -0
  221. data/spec/webby/link_validator_spec.rb +154 -0
  222. data/spec/webby/renderer_spec.rb +139 -0
  223. data/spec/webby/resources/db_spec.rb +250 -0
  224. data/spec/webby/resources/layout_spec.rb +83 -0
  225. data/spec/webby/resources/meta_file_spec.rb +171 -0
  226. data/spec/webby/resources/page_spec.rb +111 -0
  227. data/spec/webby/resources/partial_spec.rb +58 -0
  228. data/spec/webby/resources/resource_spec.rb +219 -0
  229. data/spec/webby/resources/static_spec.rb +49 -0
  230. data/spec/webby/resources_spec.rb +69 -0
  231. data/tasks/mswin32.rake +38 -0
  232. data/tasks/website.rake +37 -0
  233. metadata +435 -0
@@ -0,0 +1,19 @@
1
+ ---
2
+ title: Home Page
3
+ created_at: 2008-08-02 14:06:40.000000 -06:00
4
+ filter:
5
+ - erb
6
+ - textile
7
+ ---
8
+ p(title). <%= @page.title %>
9
+
10
+ Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Nunc congue ipsum vestibulum libero. Aenean vitae justo. Nam eget tellus. Etiam convallis, est eu lobortis mattis, lectus tellus tempus felis, a ultricies erat ipsum at metus.
11
+
12
+ h2. Litora Sociis
13
+
14
+ Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Morbi et risus. Aliquam nisl. Nulla facilisi. Cras accumsan vestibulum ante. Vestibulum sed tortor. Praesent tempus fringilla elit. Ut elit diam, sagittis in, nonummy in, gravida non, nunc. Ut orci. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos hymenaeos. Nam egestas, orci eu imperdiet malesuada, nisl purus fringilla odio, quis commodo est orci vitae justo. Aliquam placerat odio tincidunt nulla. Cras in libero. Aenean rutrum, magna non tristique posuere, erat odio eleifend nisl, non convallis est tortor blandit ligula. Nulla id augue.
15
+
16
+ bq. Nullam mattis, odio ut tempus facilisis, metus nisl facilisis metus, auctor consectetuer felis ligula nec mauris. Vestibulum odio erat, fermentum at, commodo vitae, ultrices et, urna. Mauris vulputate, mi pulvinar sagittis condimentum, sem nulla aliquam velit, sed imperdiet mi purus eu magna. Nulla varius metus ut eros. Aenean aliquet magna eget orci. Class aptent taciti sociosqu ad litora.
17
+
18
+ Vivamus euismod. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Suspendisse vel nibh ut turpis dictum sagittis. Aliquam vel velit a elit auctor sollicitudin. Nam vel dui vel neque lacinia pretium. Quisque nunc erat, venenatis id, volutpat ut, scelerisque sed, diam. Mauris ante. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Donec mattis. Morbi dignissim sollicitudin libero. Nulla lorem.
19
+
@@ -0,0 +1,61 @@
1
+ ---
2
+ extension: html
3
+ filter: erb
4
+ ---
5
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
6
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
7
+
8
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en-us">
9
+ <head>
10
+ <meta http-equiv="content-type" content="text/html; charset=utf-8" />
11
+ <title><%= @page.title %></title>
12
+ <meta name="author" content="<%= @page.author %>" />
13
+
14
+ <!--- Blueprint CSS Framework -->
15
+ <link rel="stylesheet" href="/css/blueprint/screen.css" type="text/css" media="screen, projection">
16
+ <link rel="stylesheet" href="/css/blueprint/print.css" type="text/css" media="print">
17
+ <!--[if IE]>
18
+ <link rel="stylesheet" href="/css/blueprint/ie.css" type="text/css" media="screen, projection">
19
+ <![endif]-->
20
+
21
+ <!-- CodeRay syntax highlighting CSS -->
22
+ <link rel="stylesheet" href="/css/coderay.css" type="text/css" />
23
+
24
+ <!-- Homepage CSS -->
25
+ <link rel="stylesheet" href="/css/site.css" type="text/css" media="screen, projection" />
26
+ </head>
27
+ <body>
28
+
29
+ <div class="container">
30
+
31
+ <div class="column span-20 prepend-2 append-2 first last" id="header">
32
+ <p class="title">A New Website</p>
33
+ <hr>
34
+ </div>
35
+
36
+ <div class="column span-15 prepend-2 first">
37
+ <%= @content %>
38
+ </div>
39
+
40
+ <div class="column span-5 append-2 last">
41
+ <h4>Sidebar</h4>
42
+ <p>Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Cras ornare mattis nunc. Mauris venenatis, pede sed aliquet vehicula, lectus tellus pulvinar neque, non cursus sem nisi vel augue. </p>
43
+
44
+ <div class="box">
45
+ <p class="last">Mauris a lectus. Aliquam erat volutpat. Phasellus ultrices mi a sapien. Nunc rutrum egestas lorem. Duis ac sem sagittis elit tincidunt gravida.</p>
46
+ </div>
47
+
48
+ <p class="quiet">Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Cras ornare mattis nunc. Mauris venenatis, pede sed aliquet vehicula, lectus tellus pulvinar neque, non cursus sem nisi vel augue.</p>
49
+
50
+ <h5>Incremental leading</h5>
51
+ <p class="incr">Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Cras ornare mattis nunc. Mauris venenatis, pede sed aliquet vehicula, lectus tellus pulvinar neque, non cursus sem nisi vel augue. sed aliquet vehicula, lectus tellus.</p>
52
+ </div>
53
+
54
+ <div class="column span-20 prepend-2 append-2 first last" id="footer">
55
+ <hr />
56
+ <p>This website was created with <a href="http://webby.rubyforge.org">Webby</a></p>
57
+ </div>
58
+
59
+ </div>
60
+ </body>
61
+ </html>
@@ -0,0 +1,28 @@
1
+ # breadcrumbs.rb
2
+
3
+ module BreadcrumbsHelper
4
+ # call-seq:
5
+ # breadcrumbs( page ) => html
6
+ #
7
+ # Create breadcrumb links for the current page. This will return an HTML
8
+ # <ul></ul> object.
9
+ #
10
+ def breadcrumbs( page )
11
+ list = ["<li>#{h(page.title)}</li>"]
12
+ loop do
13
+ page = @pages.parent_of(page)
14
+ break if page.nil?
15
+ list << "<li>#{link_to_page(page)}</li>"
16
+ end
17
+ list.reverse!
18
+
19
+ html = "<ul class=\"breadcrumbs\">\n"
20
+ html << list.join("\n")
21
+ html << "\n</ul>\n"
22
+ html
23
+ end
24
+ end # module Breadcrumbs
25
+
26
+ Webby::Helpers.register(BreadcrumbsHelper)
27
+
28
+ # EOF
@@ -0,0 +1,10 @@
1
+ ---
2
+ filter: erb
3
+ ---
4
+ A partial has access to the page from which it was called. The title below will be the title of the page in which this partial is rendered.
5
+
6
+ <%%= h(@page.title) %>
7
+
8
+ A partial does not have access to it's own meta-data. The partial meta-data is used primarily for finding partials or for use in other pages. The filter(s) specified in the meta-data will be applied to the partial text when it is rendered.
9
+
10
+ A partial does not require meta-data at all. They can contain just text.
@@ -0,0 +1,18 @@
1
+ ---
2
+ title: <%= title %>
3
+ created_at: <%= Time.now.to_y %>
4
+ filter:
5
+ - erb
6
+ - textile
7
+ ---
8
+ p(title). <%%= h(@page.title) %>
9
+
10
+ Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Nunc congue ipsum vestibulum libero. Aenean vitae justo. Nam eget tellus. Etiam convallis, est eu lobortis mattis, lectus tellus tempus felis, a ultricies erat ipsum at metus.
11
+
12
+ h2. Litora Sociis
13
+
14
+ Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Morbi et risus. Aliquam nisl. Nulla facilisi. Cras accumsan vestibulum ante. Vestibulum sed tortor. Praesent tempus fringilla elit. Ut elit diam, sagittis in, nonummy in, gravida non, nunc. Ut orci. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos hymenaeos. Nam egestas, orci eu imperdiet malesuada, nisl purus fringilla odio, quis commodo est orci vitae justo. Aliquam placerat odio tincidunt nulla. Cras in libero. Aenean rutrum, magna non tristique posuere, erat odio eleifend nisl, non convallis est tortor blandit ligula. Nulla id augue.
15
+
16
+ bq. Nullam mattis, odio ut tempus facilisis, metus nisl facilisis metus, auctor consectetuer felis ligula nec mauris. Vestibulum odio erat, fermentum at, commodo vitae, ultrices et, urna. Mauris vulputate, mi pulvinar sagittis condimentum, sem nulla aliquam velit, sed imperdiet mi purus eu magna. Nulla varius metus ut eros. Aenean aliquet magna eget orci. Class aptent taciti sociosqu ad litora.
17
+
18
+ Vivamus euismod. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Suspendisse vel nibh ut turpis dictum sagittis. Aliquam vel velit a elit auctor sollicitudin. Nam vel dui vel neque lacinia pretium. Quisque nunc erat, venenatis id, volutpat ut, scelerisque sed, diam. Mauris ante. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Donec mattis. Morbi dignissim sollicitudin libero. Nulla lorem.
data/lib/webby.rb ADDED
@@ -0,0 +1,233 @@
1
+ # Equivalent to a header guard in C/C++
2
+ # Used to prevent the spec helper from being loaded more than once
3
+ unless defined? ::Webby
4
+
5
+ require 'rubygems'
6
+ require 'logging'
7
+ require 'ostruct'
8
+ require 'date'
9
+
10
+ module Webby
11
+
12
+ # :stopdoc:
13
+ VERSION = '0.9.4' # :nodoc:
14
+ LIBPATH = ::File.expand_path(::File.dirname(__FILE__)) + ::File::SEPARATOR
15
+ PATH = ::File.dirname(LIBPATH) + ::File::SEPARATOR
16
+ YAML_SEP = '---'
17
+ # :startdoc:
18
+
19
+ class Error < StandardError; end # :nodoc:
20
+
21
+ # call-seq:
22
+ # Webby.site => struct
23
+ #
24
+ # Returns a struct containing the configuration parameters for the
25
+ # Webby site. These defaults should be overridden as needed in the
26
+ # site specific Rakefile.
27
+ #
28
+ def self.site
29
+ return @site if defined? @site
30
+ @site = OpenStruct.new(
31
+ :output_dir => 'output',
32
+ :content_dir => 'content',
33
+ :layout_dir => 'layouts',
34
+ :template_dir => 'templates',
35
+ :exclude => %w(tmp$ bak$ ~$ CVS \.svn),
36
+ :page_defaults => {
37
+ 'layout' => 'default'
38
+ },
39
+ :find_by => 'title',
40
+ :base => nil,
41
+ :create_mode => 'page',
42
+ :blog_dir => 'blog',
43
+ :tumblog_dir => 'tumblog',
44
+ :default_ext => 'txt',
45
+
46
+ # Items for running the embedded webserver
47
+ :use_web_server => true,
48
+ :web_port => 4331,
49
+
50
+ # Items used to deploy the website
51
+ :user => ENV['USER'] || ENV['USERNAME'],
52
+ :host => 'example.com',
53
+ :remote_dir => '/not/a/valid/dir',
54
+ :rsync_args => %w(-av),
55
+
56
+ # Global options for HAML and SASS
57
+ :haml_options => {},
58
+ :sass_options => {},
59
+
60
+ # Options passed to the 'tidy' program when the tidy filter is used
61
+ :tidy_options => '-indent -wrap 80',
62
+
63
+ # List of valid URIs (these automatically pass validation)
64
+ :valid_uris => [],
65
+
66
+ # Options for coderay processing
67
+ :coderay => {
68
+ :lang => :ruby,
69
+ :line_numbers => nil,
70
+ :line_number_start => 1,
71
+ :bold_every => 10,
72
+ :tab_width => 8
73
+ },
74
+
75
+ # Options for graphviz processing
76
+ :graphviz => {
77
+ :path => nil,
78
+ :cmd => 'dot',
79
+ :type => 'png'
80
+ },
81
+
82
+ # Options for tex2img processing
83
+ :tex2img => {
84
+ :path => nil,
85
+ :type => 'png',
86
+ :bg => 'white',
87
+ :fg => 'black',
88
+ :resolution => '150x150'
89
+ },
90
+
91
+ # Options for ultraviolet syntax highlighting
92
+ :uv => {
93
+ :lang => 'ruby',
94
+ :line_numbers => false,
95
+ :theme => 'mac_classic'
96
+ },
97
+
98
+ # XPath identifiers used by the basepath filter
99
+ :xpaths => %w(
100
+ /html/head//base[@href]
101
+ /html/head//link[@href]
102
+ //script[@src]
103
+ /html/body[@background]
104
+ /html/body//a[@href]
105
+ /html/body//object[@data]
106
+ /html/body//img[@src]
107
+ /html/body//area[@href]
108
+ /html/body//form[@action]
109
+ /html/body//input[@src]
110
+ )
111
+ # other possible XPaths to include for base path substitution
112
+ # /html/body//object[@usemap]
113
+ # /html/body//img[@usemap]
114
+ # /html/body//input[@usemap]
115
+ )
116
+ end
117
+
118
+ # call-seq
119
+ # Webby.exclude => regexp
120
+ #
121
+ # Returns a regular expression used to exclude resources from the content
122
+ # directory from being processed by Webby. This same regular expression is
123
+ # also used to exclude layouts.
124
+ #
125
+ def self.exclude
126
+ @exclude ||= Regexp.new(site.exclude.join('|'))
127
+ end
128
+
129
+ # call-seq:
130
+ # Webby.editor => string or nil
131
+ #
132
+ # Returns the default editor to use when creating new pages. This editor
133
+ # will be spawned to allow the user to edit the newly created page.
134
+ #
135
+ def self.editor
136
+ return @editor if defined? @editor
137
+
138
+ @editor = if ENV['EDITOR'].nil? or ENV['EDITOR'].empty? then nil
139
+ else ENV['EDITOR'] end
140
+ end
141
+
142
+ # call-seq:
143
+ # cairn => filename
144
+ #
145
+ # The Webby _cairn_ file is used to mark the last time the content was
146
+ # built into the output directory. It is an empty file; only the
147
+ # modification time of the file is important.
148
+ #
149
+ def self.cairn
150
+ @cairn ||= ::File.join(site.output_dir, '.cairn')
151
+ end
152
+
153
+ # Returns the library path for Webby. If any arguments are given,
154
+ # they will be joined to the end of the libray path using
155
+ # <tt>File.join</tt>.
156
+ #
157
+ def self.libpath( *args )
158
+ args.empty? ? LIBPATH : ::File.join(LIBPATH, args.flatten)
159
+ end
160
+
161
+ # Returns the path for Webby. If any arguments are given,
162
+ # they will be joined to the end of the path using
163
+ # <tt>File.join</tt>.
164
+ #
165
+ def self.path( *args )
166
+ args.empty? ? PATH : ::File.join(PATH, args.flatten)
167
+ end
168
+
169
+ # call-seq:
170
+ # Webby.require_all_libs_relative_to( filename, directory = nil )
171
+ #
172
+ # Utility method used to rquire all files ending in .rb that lie in the
173
+ # directory below this file that has the same name as the filename passed
174
+ # in. Optionally, a specific _directory_ name can be passed in such that
175
+ # the _filename_ does not have to be equivalent to the directory.
176
+ #
177
+ def self.require_all_libs_relative_to( fname, dir = nil )
178
+ dir ||= ::File.basename(fname, '.*')
179
+ search_me = ::File.expand_path(
180
+ ::File.join(::File.dirname(fname), dir, '*.rb'))
181
+
182
+ Dir.glob(search_me).sort.each {|rb| require rb}
183
+ end
184
+
185
+ # Prints a deprecation warning using the logger. The message states that
186
+ # the given method is being deprecated. An optional message can be give to
187
+ # -- somthing nice and fuzzy about a new method or why this one has to go
188
+ # away; sniff, we'll miss you little buddy.
189
+ #
190
+ def self.deprecated( method, message = nil )
191
+ msg = "'#{method}' has been deprecated"
192
+ msg << "\n\t#{message}" unless message.nil?
193
+ Logging::Logger['Webby'].warn msg
194
+ end
195
+
196
+ # Scan the <code>layouts/</code> folder and the <code>content/</code>
197
+ # folder and create a new Resource object for each file found there.
198
+ #
199
+ def self.load_files
200
+ ::Find.find(site.layout_dir, site.content_dir) do |path|
201
+ next unless test ?f, path
202
+ next if path =~ ::Webby.exclude
203
+ Resources.new path
204
+ end
205
+ end
206
+
207
+ end # module Webby
208
+
209
+
210
+ # call-seq:
211
+ # try_require( library, gemname = nil ) => true or false
212
+ #
213
+ # Try to laod the given _library_ using the built-in require, but do not
214
+ # raise a LoadError if unsuccessful. Returns +true+ if the _library_ was
215
+ # successfully loaded; returns +false+ otherwise.
216
+ #
217
+ # If a _gemname_ is given, then the "gem gemname" command will be called
218
+ # before the library is loaded.
219
+ #
220
+ def try_require( lib, gemname = nil )
221
+ gem gemname unless gemname.nil?
222
+ require lib
223
+ true
224
+ rescue LoadError
225
+ false
226
+ end
227
+
228
+ Webby.require_all_libs_relative_to(__FILE__, ::File.join(%w[webby core_ext]))
229
+ Webby.require_all_libs_relative_to(__FILE__)
230
+
231
+ end # unless defined?
232
+
233
+ # EOF
data/lib/webby/apps.rb ADDED
@@ -0,0 +1,12 @@
1
+
2
+ module Webby::Apps
3
+
4
+ class << self
5
+ def author() 'Tim Pease'; end
6
+ end
7
+
8
+ end # module Webby::Apps
9
+
10
+ Webby.require_all_libs_relative_to(__FILE__)
11
+
12
+ # EOF
@@ -0,0 +1,276 @@
1
+ require 'fileutils'
2
+ require 'optparse'
3
+ require 'forwardable'
4
+
5
+ module Webby::Apps
6
+
7
+ # webby gen template site => creates the tmplate
8
+ # webby gen -h / --help
9
+ # webby gen => same as --help
10
+ #
11
+
12
+ class Generator
13
+ extend Forwardable
14
+
15
+ # Create a new Generator instance and run the +webby+ application given the
16
+ # command line _args_.
17
+ #
18
+ def self.run( args )
19
+ self.new.run args
20
+ end
21
+
22
+ attr_accessor :template, :site
23
+ attr_reader :options
24
+
25
+ # Initialize a new generator object.
26
+ #
27
+ def initialize( output = $stdout, input = $stdin )
28
+ @options = {}
29
+ @site = @template = nil
30
+ @output, @input = output, input
31
+ @journal = journal
32
+ end
33
+
34
+ def_delegators :@journal,
35
+ :exists, :create, :force, :skip, :identical
36
+
37
+ # Writes the given objects to the output destination. Each object is
38
+ # followed by a newline unless the object is a string with a newline
39
+ # already at the end.
40
+ #
41
+ def puts( *args )
42
+ @output.puts(*args)
43
+ end
44
+
45
+ # Writes the given objects to the output destination.
46
+ #
47
+ def print( *args )
48
+ @output.print(*args)
49
+ end
50
+
51
+ # Reads a line text frim the input source.
52
+ #
53
+ def gets
54
+ @input.gets
55
+ end
56
+
57
+ # Run the generator executing the commands specified by the user on the
58
+ # command line.
59
+ #
60
+ def run( args )
61
+ parse args
62
+ create_site
63
+ end
64
+
65
+ # Parse out the command line options found in the args array.
66
+ #
67
+ def parse( args )
68
+ opts = OptionParser.new
69
+ opts.banner = 'Usage: webby-gen [options] template site'
70
+
71
+ opts.separator ''
72
+ opts.separator 'The webby-gen command is used to generate a site from a standard template.'
73
+ opts.separator 'A new site can be created, or an existing site can be added to or updated.'
74
+
75
+ opts.separator ''
76
+ opts.on('-f', '--force',
77
+ 'overwrite files that already exist') {options[:collision] = :force}
78
+ opts.on('-s', '--skip',
79
+ 'skip files that already exist') {options[:collision] = :skip}
80
+ opts.on('-u', '--update',
81
+ 'update rake tasks for the site') {options[:update] = true}
82
+ opts.on('-p', '--pretend',
83
+ 'run but do not make any changes') {options[:pretend] = true}
84
+
85
+ opts.separator ''
86
+ opts.on('-t', '--templates', 'list available templates') {
87
+ ary = templates.map {|t| ::File.basename(t)}
88
+ ary.delete 'webby'
89
+ puts "\nAvailable Templates"
90
+ puts " #{ary.join(', ')}"
91
+ puts
92
+ exit
93
+ }
94
+
95
+ opts.separator ''
96
+ opts.separator 'common options:'
97
+
98
+ opts.on( '-h', '--help', 'show this message' ) {puts opts; exit}
99
+ opts.on( '--version', 'show version' ) do
100
+ puts "Webby #{::Webby::VERSION}"
101
+ exit
102
+ end
103
+
104
+ # parse the command line arguments
105
+ opts.parse! args
106
+ tmpl, @site = args
107
+
108
+ # if no site was given, see if there is a Sitefile in the current
109
+ # directory
110
+ if site.nil?
111
+ self.site = '.' if test(?f, 'Sitefile')
112
+ end
113
+
114
+ # exit if comand line args are missing
115
+ if site.nil? or tmpl.nil?
116
+ puts opts
117
+ exit 1
118
+ end
119
+
120
+ templates.each {|t| self.template = t if t =~ %r/\/#{tmpl}$/}
121
+ if template.nil?
122
+ puts opts
123
+ abort "Could not find template '#{tmpl}'"
124
+ end
125
+
126
+ nil
127
+ end
128
+
129
+ # Returns +true+ if we are only going to pretend to do something. All the
130
+ # output messages will be written, but no changes will be made on the
131
+ # disc.
132
+ #
133
+ def pretend?
134
+ options[:pretend] == true
135
+ end
136
+
137
+ # Returns an array of available site templates.
138
+ #
139
+ def templates
140
+ Dir.glob(::Webby.path('examples') / '*').sort
141
+ end
142
+
143
+ # Create the site from the template specified by the user.
144
+ #
145
+ def create_site
146
+ files = site_files
147
+
148
+ # in update mode we only want to update the tasks directory
149
+ if options[:update]
150
+ FileUtils.mkdir_p site unless pretend?
151
+ mkdir 'tasks'
152
+ files['tasks'].sort.each {|file| cp file}
153
+ else
154
+ dirs = files.keys.concat %w[content layouts lib tasks templates]
155
+ dirs.sort!
156
+ dirs.uniq!
157
+
158
+ # create the directories first
159
+ dirs.each do |dir|
160
+ next if dir =~ %r/^output\/.*$/
161
+ mkdir dir
162
+ end
163
+
164
+ # and the create the files under each directory
165
+ dirs.each do |dir|
166
+ next if dir =~ %r/^output(\/.*)?$/
167
+ files[dir].sort.each {|file| cp file}
168
+ end
169
+ end
170
+ end
171
+
172
+ # Make a directory in the user specified site location. A message will be
173
+ # displayed to the screen indicating tha the directory is being created.
174
+ #
175
+ def mkdir( dir )
176
+ dir = dir.empty? ? site : site / dir
177
+ if test ?d, dir
178
+ exists dir
179
+ else
180
+ create dir
181
+ FileUtils.mkdir_p dir unless pretend?
182
+ end
183
+ end
184
+
185
+ # Copy a file from the template location to the user specified site
186
+ # location. A message will be displayed to the screen indicating tha the
187
+ # file is being created.
188
+ #
189
+ def cp( file )
190
+ src = template / file
191
+ dst = site / file
192
+
193
+ if test(?e, dst)
194
+ if identical?(src, dst)
195
+ identical(dst)
196
+ return
197
+ end
198
+
199
+ choice = case options[:collision]
200
+ when :force then :force
201
+ when :skip then :skip
202
+ else force_file_collision?( dst ) end
203
+
204
+ case choice
205
+ when :force then force(dst)
206
+ when :skip then skip(dst); return
207
+ else raise "Invalid collision choice: #{choice.inspect}" end
208
+ else
209
+ create(dst)
210
+ end
211
+ return if pretend?
212
+
213
+ FileUtils.cp(src, dst)
214
+ end
215
+
216
+ # Prints an abort message to the screen and then exits the Ruby
217
+ # interpreter. A non-zero return code is used to indicate an error.
218
+ #
219
+ def abort( msg )
220
+ puts "\nAborting!"
221
+ puts " #{msg}"
222
+ puts
223
+ exit 1
224
+ end
225
+
226
+ # Iterates over all the files in the template directory and stores them in
227
+ # a hash.
228
+ #
229
+ def site_files
230
+ exclude = %r/tmp$|bak$|~$|CVS|\.svn/o
231
+
232
+ rgxp = %r/\A#{template}\/?/o
233
+ paths = Hash.new {|h,k| h[k] = []}
234
+
235
+ Find.find(template) do |p|
236
+ next if exclude =~ p
237
+
238
+ if test(?d, p)
239
+ paths[p.sub(rgxp, '')]
240
+ next
241
+ end
242
+ dir = ::File.dirname(p).sub(rgxp, '')
243
+ paths[dir] << p.sub(rgxp, '')
244
+ end
245
+
246
+ paths
247
+ end
248
+
249
+ # Returns +true+ if the source file is identical to the destination file.
250
+ # Returns +false+ if this is not the case.
251
+ #
252
+ def identical?( src, dst )
253
+ source = IO.read(src)
254
+ destination = IO.read(dst)
255
+ source == destination
256
+ end
257
+
258
+ # Ask the user what to do about the file collision.
259
+ #
260
+ def force_file_collision?( dst )
261
+ dst = dst.sub(%r/#{site}\/?/, '')
262
+ print "overwrite #{dst}? [(Y)es (n)o (q)uit] "
263
+ case gets
264
+ when %r/q/i then abort 'user asked to quit'
265
+ when %r/n/i then :skip
266
+ when %r/y/i then :force
267
+ when %r/\s*/ then :force
268
+ else force_file_collision?(dst) end
269
+ rescue
270
+ retry
271
+ end
272
+
273
+ end # class Generator
274
+ end # module Webby::Apps
275
+
276
+ # EOF