typo 3.99.0

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 (742) hide show
  1. data/.DS_Store +0 -0
  2. data/CHANGELOG +718 -0
  3. data/MAINTAINERS +30 -0
  4. data/MIT-LICENSE +21 -0
  5. data/README +92 -0
  6. data/Rakefile +10 -0
  7. data/app/apis/blogger_service.rb +94 -0
  8. data/app/apis/meta_weblog_service.rb +197 -0
  9. data/app/apis/movable_type_service.rb +150 -0
  10. data/app/apis/typo_web_service.rb +26 -0
  11. data/app/controllers/accounts_controller.rb +52 -0
  12. data/app/controllers/admin/base_controller.rb +21 -0
  13. data/app/controllers/admin/blacklist_controller.rb +50 -0
  14. data/app/controllers/admin/cache_controller.rb +31 -0
  15. data/app/controllers/admin/categories_controller.rb +64 -0
  16. data/app/controllers/admin/comments_controller.rb +57 -0
  17. data/app/controllers/admin/content_controller.rb +147 -0
  18. data/app/controllers/admin/general_controller.rb +42 -0
  19. data/app/controllers/admin/pages_controller.rb +50 -0
  20. data/app/controllers/admin/resources_controller.rb +98 -0
  21. data/app/controllers/admin/sidebar_controller.rb +74 -0
  22. data/app/controllers/admin/textfilters_controller.rb +104 -0
  23. data/app/controllers/admin/themes_controller.rb +20 -0
  24. data/app/controllers/admin/trackbacks_controller.rb +54 -0
  25. data/app/controllers/admin/users_controller.rb +41 -0
  26. data/app/controllers/application.rb +66 -0
  27. data/app/controllers/articles_controller.rb +218 -0
  28. data/app/controllers/backend_controller.rb +11 -0
  29. data/app/controllers/content_controller.rb +98 -0
  30. data/app/controllers/live_controller.rb +10 -0
  31. data/app/controllers/redirect_controller.rb +16 -0
  32. data/app/controllers/sidebar_controller.rb +50 -0
  33. data/app/controllers/textfilter_controller.rb +22 -0
  34. data/app/controllers/theme_controller.rb +52 -0
  35. data/app/controllers/xml_controller.rb +111 -0
  36. data/app/helpers/accounts_helper.rb +2 -0
  37. data/app/helpers/admin/base_helper.rb +124 -0
  38. data/app/helpers/admin/blacklist_helper.rb +2 -0
  39. data/app/helpers/admin/cache_helper.rb +2 -0
  40. data/app/helpers/admin/comments_helper.rb +2 -0
  41. data/app/helpers/admin/content_helper.rb +2 -0
  42. data/app/helpers/admin/general_helper.rb +2 -0
  43. data/app/helpers/admin/pages_helper.rb +2 -0
  44. data/app/helpers/admin/resources_helper.rb +2 -0
  45. data/app/helpers/admin/sidebar_helper.rb +2 -0
  46. data/app/helpers/admin/textfilters_helper.rb +2 -0
  47. data/app/helpers/admin/themes_helper.rb +2 -0
  48. data/app/helpers/admin/trackbacks_helper.rb +2 -0
  49. data/app/helpers/admin/users_helper.rb +2 -0
  50. data/app/helpers/application_helper.rb +92 -0
  51. data/app/helpers/articles_helper.rb +163 -0
  52. data/app/helpers/backend_helper.rb +2 -0
  53. data/app/helpers/content_helper.rb +3 -0
  54. data/app/helpers/mail_helper.rb +6 -0
  55. data/app/helpers/redirect_helper.rb +2 -0
  56. data/app/helpers/sidebar_helper.rb +22 -0
  57. data/app/helpers/sidebars/plugin_helper.rb +2 -0
  58. data/app/helpers/text_filter_plugin_helper.rb +2 -0
  59. data/app/helpers/textfilter_helper.rb +2 -0
  60. data/app/helpers/theme_helper.rb +23 -0
  61. data/app/helpers/xml_helper.rb +21 -0
  62. data/app/models/aggregations/audioscrobbler.rb +54 -0
  63. data/app/models/aggregations/backpack.rb +57 -0
  64. data/app/models/aggregations/delicious.rb +57 -0
  65. data/app/models/aggregations/flickr.rb +89 -0
  66. data/app/models/aggregations/fortythree.rb +62 -0
  67. data/app/models/aggregations/magnolia.rb +81 -0
  68. data/app/models/aggregations/tada.rb +75 -0
  69. data/app/models/aggregations/technorati.rb +51 -0
  70. data/app/models/aggregations/upcoming.rb +74 -0
  71. data/app/models/article.rb +211 -0
  72. data/app/models/blacklist_pattern.rb +22 -0
  73. data/app/models/blog.rb +162 -0
  74. data/app/models/blog_sweeper.rb +23 -0
  75. data/app/models/category.rb +62 -0
  76. data/app/models/comment.rb +76 -0
  77. data/app/models/config_manager.rb +80 -0
  78. data/app/models/content.rb +222 -0
  79. data/app/models/content_observer.rb +5 -0
  80. data/app/models/content_state/base.rb +51 -0
  81. data/app/models/content_state/draft.rb +40 -0
  82. data/app/models/content_state/factory.rb +16 -0
  83. data/app/models/content_state/just_published.rb +47 -0
  84. data/app/models/content_state/new.rb +45 -0
  85. data/app/models/content_state/publication_pending.rb +43 -0
  86. data/app/models/content_state/published.rb +35 -0
  87. data/app/models/email_notifier.rb +9 -0
  88. data/app/models/notification_mailer.rb +34 -0
  89. data/app/models/page.rb +20 -0
  90. data/app/models/page_cache.rb +29 -0
  91. data/app/models/ping.rb +129 -0
  92. data/app/models/redirect.rb +3 -0
  93. data/app/models/resource.rb +76 -0
  94. data/app/models/sidebar.rb +32 -0
  95. data/app/models/simple_cache.rb +37 -0
  96. data/app/models/tag.rb +63 -0
  97. data/app/models/text_filter.rb +111 -0
  98. data/app/models/theme.rb +44 -0
  99. data/app/models/trackback.rb +51 -0
  100. data/app/models/trigger.rb +31 -0
  101. data/app/models/user.rb +113 -0
  102. data/app/models/web_notifier.rb +7 -0
  103. data/app/views/accounts/login.rhtml +24 -0
  104. data/app/views/accounts/logout.rhtml +12 -0
  105. data/app/views/accounts/signup.rhtml +26 -0
  106. data/app/views/accounts/welcome.rhtml +13 -0
  107. data/app/views/admin/base/_recent_comments.rhtml +10 -0
  108. data/app/views/admin/base/_recent_trackbacks.rhtml +10 -0
  109. data/app/views/admin/blacklist/_blacklist_patterns.rhtml +16 -0
  110. data/app/views/admin/blacklist/_form.rhtml +15 -0
  111. data/app/views/admin/blacklist/_quick_post.rhtml +16 -0
  112. data/app/views/admin/blacklist/destroy.rhtml +10 -0
  113. data/app/views/admin/blacklist/edit.rhtml +14 -0
  114. data/app/views/admin/blacklist/list.rhtml +13 -0
  115. data/app/views/admin/cache/list.rhtml +8 -0
  116. data/app/views/admin/categories/_categories.rhtml +14 -0
  117. data/app/views/admin/categories/_form.rhtml +7 -0
  118. data/app/views/admin/categories/_quick_post.rhtml +11 -0
  119. data/app/views/admin/categories/destroy.rhtml +10 -0
  120. data/app/views/admin/categories/edit.rhtml +13 -0
  121. data/app/views/admin/categories/list.rhtml +15 -0
  122. data/app/views/admin/categories/reorder.rhtml +9 -0
  123. data/app/views/admin/categories/show.rhtml +18 -0
  124. data/app/views/admin/comments/_form.rhtml +19 -0
  125. data/app/views/admin/comments/comments.rhtml +4 -0
  126. data/app/views/admin/comments/destroy.rhtml +11 -0
  127. data/app/views/admin/comments/edit.rhtml +18 -0
  128. data/app/views/admin/comments/list.rhtml +31 -0
  129. data/app/views/admin/comments/new.rhtml +15 -0
  130. data/app/views/admin/comments/show.rhtml +10 -0
  131. data/app/views/admin/content/_articles.rhtml +20 -0
  132. data/app/views/admin/content/_attachment.rhtml +17 -0
  133. data/app/views/admin/content/_form.rhtml +51 -0
  134. data/app/views/admin/content/_pages.rhtml +3 -0
  135. data/app/views/admin/content/_quick_post.rhtml +20 -0
  136. data/app/views/admin/content/_show_categories.rhtml +9 -0
  137. data/app/views/admin/content/_show_resources.rhtml +9 -0
  138. data/app/views/admin/content/destroy.rhtml +11 -0
  139. data/app/views/admin/content/edit.rhtml +28 -0
  140. data/app/views/admin/content/list.rhtml +20 -0
  141. data/app/views/admin/content/new.rhtml +27 -0
  142. data/app/views/admin/content/preview.rhtml +3 -0
  143. data/app/views/admin/content/show.rhtml +25 -0
  144. data/app/views/admin/general/index.rhtml +216 -0
  145. data/app/views/admin/general/update_database.rhtml +44 -0
  146. data/app/views/admin/pages/_form.rhtml +19 -0
  147. data/app/views/admin/pages/_pages.rhtml +18 -0
  148. data/app/views/admin/pages/_quick_post.rhtml +21 -0
  149. data/app/views/admin/pages/destroy.rhtml +11 -0
  150. data/app/views/admin/pages/edit.rhtml +28 -0
  151. data/app/views/admin/pages/list.rhtml +13 -0
  152. data/app/views/admin/pages/new.rhtml +24 -0
  153. data/app/views/admin/pages/preview.rhtml +1 -0
  154. data/app/views/admin/pages/show.rhtml +14 -0
  155. data/app/views/admin/resources/_itunes_category_add.rhtml +11 -0
  156. data/app/views/admin/resources/_itunes_category_edit.rhtml +32 -0
  157. data/app/views/admin/resources/_metadata_add.rhtml +22 -0
  158. data/app/views/admin/resources/_metadata_edit.rhtml +22 -0
  159. data/app/views/admin/resources/_mime_edit.rhtml +8 -0
  160. data/app/views/admin/resources/_pages.rhtml +3 -0
  161. data/app/views/admin/resources/_resources.rhtml +40 -0
  162. data/app/views/admin/resources/destroy.rhtml +11 -0
  163. data/app/views/admin/resources/list.rhtml +9 -0
  164. data/app/views/admin/resources/new.rhtml +12 -0
  165. data/app/views/admin/sidebar/_active.rhtml +14 -0
  166. data/app/views/admin/sidebar/_actives.rhtml +9 -0
  167. data/app/views/admin/sidebar/_available.rhtml +5 -0
  168. data/app/views/admin/sidebar/_availables.rhtml +5 -0
  169. data/app/views/admin/sidebar/_publish.rhtml +2 -0
  170. data/app/views/admin/sidebar/_target.rhtml +1 -0
  171. data/app/views/admin/sidebar/index.rhtml +34 -0
  172. data/app/views/admin/sidebar/publish.rjs +6 -0
  173. data/app/views/admin/sidebar/remove.rjs +5 -0
  174. data/app/views/admin/sidebar/set_active.rjs +10 -0
  175. data/app/views/admin/textfilters/_form.rhtml +45 -0
  176. data/app/views/admin/textfilters/_macros.rhtml +16 -0
  177. data/app/views/admin/textfilters/_textfilters.rhtml +20 -0
  178. data/app/views/admin/textfilters/destroy.rhtml +10 -0
  179. data/app/views/admin/textfilters/edit.rhtml +17 -0
  180. data/app/views/admin/textfilters/list.rhtml +15 -0
  181. data/app/views/admin/textfilters/macro_help.rhtml +3 -0
  182. data/app/views/admin/textfilters/new.rhtml +15 -0
  183. data/app/views/admin/textfilters/preview.rhtml +3 -0
  184. data/app/views/admin/textfilters/show.rhtml +34 -0
  185. data/app/views/admin/textfilters/show_help.rhtml +8 -0
  186. data/app/views/admin/themes/index.rhtml +12 -0
  187. data/app/views/admin/trackbacks/_form.rhtml +19 -0
  188. data/app/views/admin/trackbacks/destroy.rhtml +6 -0
  189. data/app/views/admin/trackbacks/edit.rhtml +14 -0
  190. data/app/views/admin/trackbacks/list.rhtml +31 -0
  191. data/app/views/admin/trackbacks/new.rhtml +15 -0
  192. data/app/views/admin/trackbacks/show.rhtml +14 -0
  193. data/app/views/admin/users/_form.rhtml +48 -0
  194. data/app/views/admin/users/_user.rhtml +9 -0
  195. data/app/views/admin/users/destroy.rhtml +14 -0
  196. data/app/views/admin/users/edit.rhtml +14 -0
  197. data/app/views/admin/users/list.rhtml +9 -0
  198. data/app/views/admin/users/new.rhtml +15 -0
  199. data/app/views/admin/users/show.rhtml +18 -0
  200. data/app/views/articles/_article.rhtml +4 -0
  201. data/app/views/articles/_comment.rhtml +7 -0
  202. data/app/views/articles/_comment_box.rhtml +43 -0
  203. data/app/views/articles/_comment_error.rhtml +1 -0
  204. data/app/views/articles/_trackback.rhtml +7 -0
  205. data/app/views/articles/archives.rhtml +22 -0
  206. data/app/views/articles/comment_preview.rhtml +3 -0
  207. data/app/views/articles/error.rhtml +3 -0
  208. data/app/views/articles/groupings.rhtml +14 -0
  209. data/app/views/articles/index.rhtml +11 -0
  210. data/app/views/articles/read.rhtml +70 -0
  211. data/app/views/articles/trackback.rxml +5 -0
  212. data/app/views/articles/view_page.rhtml +3 -0
  213. data/app/views/layouts/accounts.rhtml +22 -0
  214. data/app/views/layouts/administration.rhtml +75 -0
  215. data/app/views/layouts/sidebar.rhtml +40 -0
  216. data/app/views/live/search.rhtml +10 -0
  217. data/app/views/notification_mailer/_mail_footer.rhtml +7 -0
  218. data/app/views/notification_mailer/_mail_header.rhtml +1 -0
  219. data/app/views/notification_mailer/article.rhtml +6 -0
  220. data/app/views/notification_mailer/comment.rhtml +11 -0
  221. data/app/views/notification_mailer/trackback.rhtml +3 -0
  222. data/app/views/settings/done.rhtml +2 -0
  223. data/app/views/settings/install.rhtml +12 -0
  224. data/app/views/shared/_search.rhtml +10 -0
  225. data/app/views/sidebar/_row.rhtml +1 -0
  226. data/app/views/sidebar/_sidebar.rhtml +5 -0
  227. data/app/views/sidebar/display_plugins.rhtml +5 -0
  228. data/app/views/sidebar/show.rhtml +1 -0
  229. data/app/views/theme/static_view_test.rhtml +1 -0
  230. data/app/views/xml/_atom10_item_article.rxml +39 -0
  231. data/app/views/xml/_atom10_item_comment.rxml +13 -0
  232. data/app/views/xml/_atom10_item_trackback.rxml +16 -0
  233. data/app/views/xml/_itunes_item_resource.rxml +30 -0
  234. data/app/views/xml/_rss20_item_article.rxml +35 -0
  235. data/app/views/xml/_rss20_item_comment.rxml +7 -0
  236. data/app/views/xml/_rss20_item_trackback.rxml +7 -0
  237. data/app/views/xml/atom10_feed.rxml +18 -0
  238. data/app/views/xml/itunes_feed.rxml +29 -0
  239. data/app/views/xml/rsd.rxml +19 -0
  240. data/app/views/xml/rss20_feed.rxml +18 -0
  241. data/bin/typo +12 -0
  242. data/cache/META/DATA/ACTION_PARAM/localhost.3000/articles/index/.cache +540 -0
  243. data/cache/META/DATA/ACTION_PARAM/localhost.3000/articles/permalink/day=09&month=09&title=i-need-a-new-keyboard-and-mouse&year=2005.cache +414 -0
  244. data/cache/META/META/ACTION_PARAM/localhost.3000/articles/index/.cache +3 -0
  245. data/cache/META/META/ACTION_PARAM/localhost.3000/articles/permalink/day=09&month=09&title=i-need-a-new-keyboard-and-mouse&year=2005.cache +3 -0
  246. data/components/plugins/sidebars/aimpresence/content.rhtml +4 -0
  247. data/components/plugins/sidebars/aimpresence_controller.rb +10 -0
  248. data/components/plugins/sidebars/amazon/content.rhtml +4 -0
  249. data/components/plugins/sidebars/amazon_controller.rb +17 -0
  250. data/components/plugins/sidebars/archives/content.rhtml +11 -0
  251. data/components/plugins/sidebars/archives_controller.rb +24 -0
  252. data/components/plugins/sidebars/audioscrobbler/content.rhtml +10 -0
  253. data/components/plugins/sidebars/audioscrobbler_controller.rb +10 -0
  254. data/components/plugins/sidebars/backpack/content.rhtml +12 -0
  255. data/components/plugins/sidebars/backpack_controller.rb +17 -0
  256. data/components/plugins/sidebars/category/content.rhtml +10 -0
  257. data/components/plugins/sidebars/category_controller.rb +13 -0
  258. data/components/plugins/sidebars/delicious/content.rhtml +20 -0
  259. data/components/plugins/sidebars/delicious_controller.rb +29 -0
  260. data/components/plugins/sidebars/flickr/content.rhtml +15 -0
  261. data/components/plugins/sidebars/flickr_controller.rb +16 -0
  262. data/components/plugins/sidebars/fortythree/content.rhtml +8 -0
  263. data/components/plugins/sidebars/fortythree_controller.rb +12 -0
  264. data/components/plugins/sidebars/fortythreeplaces/content.rhtml +8 -0
  265. data/components/plugins/sidebars/fortythreeplaces_controller.rb +12 -0
  266. data/components/plugins/sidebars/magnolia/content.rhtml +12 -0
  267. data/components/plugins/sidebars/magnolia_controller.rb +17 -0
  268. data/components/plugins/sidebars/recent_comments/content.rhtml +12 -0
  269. data/components/plugins/sidebars/recent_comments_controller.rb +23 -0
  270. data/components/plugins/sidebars/static/content.rhtml +2 -0
  271. data/components/plugins/sidebars/static_controller.rb +23 -0
  272. data/components/plugins/sidebars/tada/content.rhtml +12 -0
  273. data/components/plugins/sidebars/tada_controller.rb +12 -0
  274. data/components/plugins/sidebars/tag/content.rhtml +8 -0
  275. data/components/plugins/sidebars/tag_controller.rb +18 -0
  276. data/components/plugins/sidebars/technorati/content.rhtml +8 -0
  277. data/components/plugins/sidebars/technorati_controller.rb +12 -0
  278. data/components/plugins/sidebars/upcoming/content.rhtml +8 -0
  279. data/components/plugins/sidebars/upcoming_controller.rb +11 -0
  280. data/components/plugins/sidebars/xbox/content.rhtml +2 -0
  281. data/components/plugins/sidebars/xbox_controller.rb +6 -0
  282. data/components/plugins/sidebars/xml/content.rhtml +12 -0
  283. data/components/plugins/sidebars/xml_controller.rb +11 -0
  284. data/components/plugins/textfilters/amazon_controller.rb +39 -0
  285. data/components/plugins/textfilters/code_controller.rb +59 -0
  286. data/components/plugins/textfilters/flickr_controller.rb +75 -0
  287. data/components/plugins/textfilters/htmlfilter_controller.rb +8 -0
  288. data/components/plugins/textfilters/lightbox_controller.rb +122 -0
  289. data/components/plugins/textfilters/macropost_controller.rb +14 -0
  290. data/components/plugins/textfilters/macropre_controller.rb +14 -0
  291. data/components/plugins/textfilters/markdown_controller.rb +32 -0
  292. data/components/plugins/textfilters/none_controller.rb +8 -0
  293. data/components/plugins/textfilters/smartypants_controller.rb +8 -0
  294. data/components/plugins/textfilters/sparkline_controller.rb +87 -0
  295. data/components/plugins/textfilters/textile_controller.rb +8 -0
  296. data/components/sidebars/README +36 -0
  297. data/config/boot.rb +44 -0
  298. data/config/database.yml +17 -0
  299. data/config/database.yml-pgsql +17 -0
  300. data/config/database.yml.example +18 -0
  301. data/config/environment.rb +145 -0
  302. data/config/environments/development.rb +17 -0
  303. data/config/environments/production.rb +19 -0
  304. data/config/environments/test.rb +26 -0
  305. data/config/iTunes.yml +72 -0
  306. data/config/lighttpd.conf +46 -0
  307. data/config/mail.yml +8 -0
  308. data/config/mail.yml.example +8 -0
  309. data/config/routes.rb +92 -0
  310. data/db/DB +0 -0
  311. data/db/DB.test +0 -0
  312. data/db/converters/README +14 -0
  313. data/db/converters/feed.rb +68 -0
  314. data/db/converters/mt-import.rb +72 -0
  315. data/db/converters/mt3.rb +172 -0
  316. data/db/converters/rss.rb +67 -0
  317. data/db/converters/s9y.rb +182 -0
  318. data/db/converters/textpattern.rb +137 -0
  319. data/db/converters/wordpress.rb +187 -0
  320. data/db/development_structure.sql +691 -0
  321. data/db/migrate/001_initial_schema.rb +127 -0
  322. data/db/migrate/002_add_user_email.rb +17 -0
  323. data/db/migrate/003_add_article_user_id.rb +20 -0
  324. data/db/migrate/004_add_sidebars.rb +31 -0
  325. data/db/migrate/005_add_cache_table.rb +20 -0
  326. data/db/migrate/006_add_pages.rb +17 -0
  327. data/db/migrate/007_add_permalink.rb +36 -0
  328. data/db/migrate/008_add_page_title.rb +9 -0
  329. data/db/migrate/009_add_article_guid.rb +10 -0
  330. data/db/migrate/010_add_tags.rb +19 -0
  331. data/db/migrate/011_add_article_id.rb +17 -0
  332. data/db/migrate/012_enlarge_settings.rb +11 -0
  333. data/db/migrate/013_add_textfilters.rb +33 -0
  334. data/db/migrate/014_move_text_filter_to_text_filter_id.rb +43 -0
  335. data/db/migrate/015_convert_mysql_to_innodb.rb +19 -0
  336. data/db/migrate/016_fix_is_primary_postgres.rb +19 -0
  337. data/db/migrate/017_add_comment_user_id.rb +23 -0
  338. data/db/migrate/018_add_guids.rb +13 -0
  339. data/db/migrate/019_add_whiteboards_to_content.rb +15 -0
  340. data/db/migrate/020_superclass_articles.rb +167 -0
  341. data/db/migrate/021_superclass_comments.rb +94 -0
  342. data/db/migrate/022_superclass_trackbacks.rb +71 -0
  343. data/db/migrate/023_superclass_pages.rb +64 -0
  344. data/db/migrate/024_cleanup_contents.rb +54 -0
  345. data/db/migrate/025_add_itunes_metadata.rb +29 -0
  346. data/db/migrate/026_add_redirect_table.rb +13 -0
  347. data/db/migrate/027_set_comment_published_flag.rb +19 -0
  348. data/db/migrate/028_rename_redirect_to.rb +12 -0
  349. data/db/migrate/029_add_user_notification.rb +29 -0
  350. data/db/migrate/030_index_sessions.rb +9 -0
  351. data/db/migrate/031_add_notifications_table.rb +14 -0
  352. data/db/migrate/032_add_jabber_notification.rb +11 -0
  353. data/db/migrate/033_add_count_caching.rb +34 -0
  354. data/db/migrate/034_boolify_published.rb +36 -0
  355. data/db/migrate/035_boolify_content_allow_foo.rb +36 -0
  356. data/db/migrate/036_add_tag_display_name.rb +53 -0
  357. data/db/migrate/037_enlarge_ip_field.rb +9 -0
  358. data/db/migrate/038_add_blog_object.rb +52 -0
  359. data/db/migrate/039_serialize_blog_attributes.rb +160 -0
  360. data/db/migrate/040_attach_content_to_blog.rb +28 -0
  361. data/db/migrate/041_fixup_default_sidebars.rb +18 -0
  362. data/db/migrate/042_remove_sidebar_staged_config.rb +22 -0
  363. data/db/migrate/043_create_triggers.rb +14 -0
  364. data/db/migrate/044_add_published_at_to_content.rb +18 -0
  365. data/db/migrate/045_fix_contents_published_default.rb +9 -0
  366. data/db/migrate/046_fixup_forthcoming_publications.rb +40 -0
  367. data/db/schema.mysql-v3.sql +218 -0
  368. data/db/schema.mysql.sql +218 -0
  369. data/db/schema.postgresql.sql +218 -0
  370. data/db/schema.rb +169 -0
  371. data/db/schema.sqlite.sql +218 -0
  372. data/db/schema.sqlserver.sql +232 -0
  373. data/db/schema_version +1 -0
  374. data/db/scripts/fix_permalinks.rb +5 -0
  375. data/db/updates/update.168.to.200.mysql.sql +33 -0
  376. data/db/updates/update.168.to.200.psql.sql +30 -0
  377. data/doc/Installer.txt +55 -0
  378. data/doc/README_FOR_APP +2 -0
  379. data/installer/rails-installer.rb +488 -0
  380. data/installer/rails_installer_defaults.yml +4 -0
  381. data/installer/typo-installer.rb +35 -0
  382. data/lib/backpack_api.rb +202 -0
  383. data/lib/bare_migration.rb +142 -0
  384. data/lib/email_notify.rb +32 -0
  385. data/lib/format.rb +19 -0
  386. data/lib/generators/sidebar/sidebar_generator.rb +13 -0
  387. data/lib/generators/sidebar/templates/components/plugins/sidebars/controller_template.rb +20 -0
  388. data/lib/generators/sidebar/templates/components/plugins/sidebars/views/content_template.rhtml +4 -0
  389. data/lib/jabber_notify.rb +32 -0
  390. data/lib/login_system.rb +85 -0
  391. data/lib/migrator.rb +28 -0
  392. data/lib/rails_patch/active_record.rb +36 -0
  393. data/lib/rails_patch/components.rb +14 -0
  394. data/lib/sidebars/component_plugin.rb +5 -0
  395. data/lib/sidebars/plugin.rb +241 -0
  396. data/lib/spam_protection.rb +126 -0
  397. data/lib/tasks/release.rake +171 -0
  398. data/lib/tasks/schemas.rake +6 -0
  399. data/lib/tasks/sweep_cache.rake +6 -0
  400. data/lib/text_filter_plugin.rb +97 -0
  401. data/lib/transforms.rb +26 -0
  402. data/lib/typo_guid.rb +10 -0
  403. data/lib/typo_plugins.rb +19 -0
  404. data/lib/typo_version.rb +1 -0
  405. data/lib/xmlrpc_fix.rb +13 -0
  406. data/public/.htaccess +34 -0
  407. data/public/404.html +8 -0
  408. data/public/500.html +8 -0
  409. data/public/dispatch.cgi +10 -0
  410. data/public/dispatch.fcgi +24 -0
  411. data/public/dispatch.rb +10 -0
  412. data/public/favicon.ico +0 -0
  413. data/public/images/admin/dot-vertical.gif +0 -0
  414. data/public/images/admin/h-tile.gif +0 -0
  415. data/public/images/admin/hdr-tile.gif +0 -0
  416. data/public/images/admin/toggle.gif +0 -0
  417. data/public/images/bg.jpg +0 -0
  418. data/public/images/bgcolor.jpg +0 -0
  419. data/public/images/body_bg.png +0 -0
  420. data/public/images/branding_bg.png +0 -0
  421. data/public/images/branding_logo.png +0 -0
  422. data/public/images/checked.gif +0 -0
  423. data/public/images/content_bg.png +0 -0
  424. data/public/images/delete.png +0 -0
  425. data/public/images/footer.jpg +0 -0
  426. data/public/images/footer.png +0 -0
  427. data/public/images/global_bg.png +0 -0
  428. data/public/images/global_logo.png +0 -0
  429. data/public/images/go.png +0 -0
  430. data/public/images/header.jpg +0 -0
  431. data/public/images/loading.gif +0 -0
  432. data/public/images/not-checked copy.gif +0 -0
  433. data/public/images/not-checked.gif +0 -0
  434. data/public/images/overlay.png +0 -0
  435. data/public/images/powered.gif +0 -0
  436. data/public/images/section_bg.png +0 -0
  437. data/public/images/sections_bg.png +0 -0
  438. data/public/images/sections_hilite.png +0 -0
  439. data/public/images/sections_hover.png +0 -0
  440. data/public/images/spinner-blue.gif +0 -0
  441. data/public/images/spinner.gif +0 -0
  442. data/public/images/spot-header.gif +0 -0
  443. data/public/images/spot-title.gif +0 -0
  444. data/public/images/x-ed.gif +0 -0
  445. data/public/javascripts/application.js +2 -0
  446. data/public/javascripts/controls.js +815 -0
  447. data/public/javascripts/cookies.js +60 -0
  448. data/public/javascripts/dragdrop.js +724 -0
  449. data/public/javascripts/effects.js +953 -0
  450. data/public/javascripts/lightbox.js +348 -0
  451. data/public/javascripts/prototype.js +1985 -0
  452. data/public/javascripts/scriptaculous.js +47 -0
  453. data/public/javascripts/slider.js +258 -0
  454. data/public/javascripts/typo.js +85 -0
  455. data/public/robots.txt +2 -0
  456. data/public/stylesheets/administration.css +585 -0
  457. data/public/stylesheets/lightbox.css +22 -0
  458. data/public/stylesheets/rss.css +54 -0
  459. data/public/stylesheets/user-styles.css +0 -0
  460. data/script/about +3 -0
  461. data/script/benchmarker +19 -0
  462. data/script/breakpointer +3 -0
  463. data/script/console +3 -0
  464. data/script/destroy +3 -0
  465. data/script/generate +3 -0
  466. data/script/lighttpd +2 -0
  467. data/script/logreport +79 -0
  468. data/script/migrate +31 -0
  469. data/script/performance/benchmarker +3 -0
  470. data/script/performance/profiler +3 -0
  471. data/script/plugin +3 -0
  472. data/script/process/reaper +3 -0
  473. data/script/process/spawner +3 -0
  474. data/script/process/spinner +3 -0
  475. data/script/profiler +34 -0
  476. data/script/runner +3 -0
  477. data/script/server +3 -0
  478. data/script/spacecheck +40 -0
  479. data/test/fixtures/articles_categories.yml +31 -0
  480. data/test/fixtures/articles_tags.yml +19 -0
  481. data/test/fixtures/blacklist_patterns.yml +10 -0
  482. data/test/fixtures/blogs.yml +74 -0
  483. data/test/fixtures/categories.yml +35 -0
  484. data/test/fixtures/contents.yml +297 -0
  485. data/test/fixtures/notification_mailer/article +3 -0
  486. data/test/fixtures/notification_mailer/comment +3 -0
  487. data/test/fixtures/notification_mailer/trackback +3 -0
  488. data/test/fixtures/notifications.yml +0 -0
  489. data/test/fixtures/page_caches.yml +7 -0
  490. data/test/fixtures/redirects.yml +13 -0
  491. data/test/fixtures/resources.yml +24 -0
  492. data/test/fixtures/sidebars.yml +5 -0
  493. data/test/fixtures/tags.yml +13 -0
  494. data/test/fixtures/text_filters.yml +42 -0
  495. data/test/fixtures/triggers.yml +1 -0
  496. data/test/fixtures/users.yml +56 -0
  497. data/test/functional/accounts_controller_test.rb +82 -0
  498. data/test/functional/admin/article_preview_test.rb +67 -0
  499. data/test/functional/admin/blacklist_controller_test.rb +63 -0
  500. data/test/functional/admin/categories_controller_test.rb +112 -0
  501. data/test/functional/admin/comments_controller_test.rb +78 -0
  502. data/test/functional/admin/content_controller_test.rb +234 -0
  503. data/test/functional/admin/general_controller_test.rb +26 -0
  504. data/test/functional/admin/pages_controller_test.rb +103 -0
  505. data/test/functional/admin/resources_controller_test.rb +49 -0
  506. data/test/functional/admin/textfilters_controller_test.rb +29 -0
  507. data/test/functional/admin/themes_controller_test.rb +34 -0
  508. data/test/functional/admin/trackbacks_controller_test.rb +76 -0
  509. data/test/functional/admin/users_controller_test.rb +72 -0
  510. data/test/functional/articles_controller_test.rb +525 -0
  511. data/test/functional/backend_controller_test.rb +273 -0
  512. data/test/functional/redirect_controller_test.rb +40 -0
  513. data/test/functional/textfilter_controller_test.rb +275 -0
  514. data/test/functional/theme_controller_test.rb +45 -0
  515. data/test/functional/xml_controller_test.rb +353 -0
  516. data/test/mocks/test/dns_mock.rb +13 -0
  517. data/test/mocks/test/flickr_mock.rb +30 -0
  518. data/test/mocks/test/http_mock.rb +38 -0
  519. data/test/mocks/test/theme_mock.rb +5 -0
  520. data/test/mocks/test/xmlrpc_mock.rb +27 -0
  521. data/test/mocks/themes/123-numbers-in-path/about.markdown +0 -0
  522. data/test/mocks/themes/CamelCaseDirectory/about.markdown +0 -0
  523. data/test/mocks/themes/azure/about.markdown +5 -0
  524. data/test/mocks/themes/azure/layouts/default.rhtml +50 -0
  525. data/test/mocks/themes/azure/preview.png +0 -0
  526. data/test/mocks/themes/azure/views/theme/static_view_test.rhtml +1 -0
  527. data/test/mocks/themes/i-have-special-chars/about.markdown +0 -0
  528. data/test/test_helper.rb +95 -0
  529. data/test/unit/article_test.rb +245 -0
  530. data/test/unit/assumptions_tests.rb +54 -0
  531. data/test/unit/audioscrobbler_test.rb +132 -0
  532. data/test/unit/blacklist_pattern_test.rb +14 -0
  533. data/test/unit/blog_test.rb +83 -0
  534. data/test/unit/category_test.rb +37 -0
  535. data/test/unit/comment_test.rb +117 -0
  536. data/test/unit/configuration_test.rb +21 -0
  537. data/test/unit/content_state/factory_test.rb +84 -0
  538. data/test/unit/delicious_test.rb +96 -0
  539. data/test/unit/flickr_test.rb +134 -0
  540. data/test/unit/fortythree_test.rb +66 -0
  541. data/test/unit/magnolia_test.rb +87 -0
  542. data/test/unit/metafragment_test.rb +63 -0
  543. data/test/unit/notification_mailer_test.rb +55 -0
  544. data/test/unit/observer_test.rb +40 -0
  545. data/test/unit/page_cache_test.rb +34 -0
  546. data/test/unit/page_test.rb +25 -0
  547. data/test/unit/ping_test.rb +111 -0
  548. data/test/unit/redirect_test.rb +19 -0
  549. data/test/unit/resource_test.rb +71 -0
  550. data/test/unit/sidebar_test.rb +14 -0
  551. data/test/unit/tag_test.rb +66 -0
  552. data/test/unit/text_filter_test.rb +126 -0
  553. data/test/unit/theme_test.rb +44 -0
  554. data/test/unit/trackback_test.rb +45 -0
  555. data/test/unit/trigger_test.rb +40 -0
  556. data/test/unit/user_test.rb +111 -0
  557. data/themes/azure/about.markdown +5 -0
  558. data/themes/azure/images/bg-tile.gif +0 -0
  559. data/themes/azure/images/bracket.gif +0 -0
  560. data/themes/azure/images/bullet.gif +0 -0
  561. data/themes/azure/images/hdr.gif +0 -0
  562. data/themes/azure/images/q-close.gif +0 -0
  563. data/themes/azure/images/q-open.gif +0 -0
  564. data/themes/azure/images/sbar-tile.gif +0 -0
  565. data/themes/azure/images/spinner.gif +0 -0
  566. data/themes/azure/images/xlink.gif +0 -0
  567. data/themes/azure/layouts/default.rhtml +50 -0
  568. data/themes/azure/preview.png +0 -0
  569. data/themes/azure/stylesheets/azure.css +436 -0
  570. data/themes/azure/stylesheets/print.css +30 -0
  571. data/themes/azure/views/theme/static_view_test.rhtml +1 -0
  572. data/vendor/akismet/Akismet.rb +140 -0
  573. data/vendor/bluecloth/CHANGES +366 -0
  574. data/vendor/bluecloth/LICENSE +340 -0
  575. data/vendor/bluecloth/README +99 -0
  576. data/vendor/bluecloth/bin/bluecloth +83 -0
  577. data/vendor/bluecloth/install.rb +150 -0
  578. data/vendor/bluecloth/lib/bluecloth.rb +1144 -0
  579. data/vendor/bluecloth/test.rb +117 -0
  580. data/vendor/bluecloth/tests/00_Class.tests.rb +71 -0
  581. data/vendor/bluecloth/tests/05_Markdown.tests.rb +1527 -0
  582. data/vendor/bluecloth/tests/10_Bug.tests.rb +57 -0
  583. data/vendor/bluecloth/tests/15_Contrib.tests.rb +132 -0
  584. data/vendor/bluecloth/tests/bctestcase.rb +274 -0
  585. data/vendor/bluecloth/tests/data/antsugar.txt +34 -0
  586. data/vendor/bluecloth/tests/data/ml-announce.txt +17 -0
  587. data/vendor/bluecloth/tests/data/re-overflow.txt +67 -0
  588. data/vendor/bluecloth/tests/data/re-overflow2.txt +281 -0
  589. data/vendor/bluecloth/utils.rb +553 -0
  590. data/vendor/flickr/Rakefile +36 -0
  591. data/vendor/flickr/flickr.rb +490 -0
  592. data/vendor/flickr/index.html +129 -0
  593. data/vendor/flickr/test_flickr.rb +173 -0
  594. data/vendor/jabber4r/CHANGES +8 -0
  595. data/vendor/jabber4r/LICENSE.txt +12 -0
  596. data/vendor/jabber4r/README +180 -0
  597. data/vendor/jabber4r/Rakefile.rb +143 -0
  598. data/vendor/jabber4r/lib/jabber4r/jabber4r.rb +22 -0
  599. data/vendor/jabber4r/lib/jabber4r/jid.rb +93 -0
  600. data/vendor/jabber4r/lib/jabber4r/protocol.rb +1384 -0
  601. data/vendor/jabber4r/lib/jabber4r/rexml_1.8_patch.rb +16 -0
  602. data/vendor/jabber4r/lib/jabber4r/roster.rb +322 -0
  603. data/vendor/jabber4r/lib/jabber4r/session.rb +615 -0
  604. data/vendor/jabber4r/lib/jabber4r/vcard.rb +42 -0
  605. data/vendor/plugins/expiring_action_cache/init.rb +2 -0
  606. data/vendor/plugins/expiring_action_cache/lib/actionparamcache.rb +113 -0
  607. data/vendor/plugins/expiring_action_cache/lib/metafragment.rb +46 -0
  608. data/vendor/plugins/upload_progress/CHANGELOG +3 -0
  609. data/vendor/plugins/upload_progress/MIT-LICENSE +20 -0
  610. data/vendor/plugins/upload_progress/README +45 -0
  611. data/vendor/plugins/upload_progress/Rakefile +23 -0
  612. data/vendor/plugins/upload_progress/init.rb +7 -0
  613. data/vendor/plugins/upload_progress/lib/multipart_progress.rb +169 -0
  614. data/vendor/plugins/upload_progress/lib/progress.rb +145 -0
  615. data/vendor/plugins/upload_progress/lib/upload_progress.rb +303 -0
  616. data/vendor/plugins/upload_progress/lib/upload_progress_helper.rb +424 -0
  617. data/vendor/plugins/upload_progress/public/stylesheets/upload_progress.css +21 -0
  618. data/vendor/plugins/upload_progress/test/multipart_progress_testx.rb +364 -0
  619. data/vendor/plugins/upload_progress/test/upload_progress_helper_testx.rb +134 -0
  620. data/vendor/plugins/upload_progress/test/upload_progress_testx.rb +88 -0
  621. data/vendor/redcloth/RedCloth.gemspec +52 -0
  622. data/vendor/redcloth/bin/redcloth +3 -0
  623. data/vendor/redcloth/doc/CHANGELOG +160 -0
  624. data/vendor/redcloth/doc/COPYING +25 -0
  625. data/vendor/redcloth/doc/README +106 -0
  626. data/vendor/redcloth/doc/REFERENCE +216 -0
  627. data/vendor/redcloth/doc/make.rb +359 -0
  628. data/vendor/redcloth/install.rb +1032 -0
  629. data/vendor/redcloth/lib/redcloth.rb +1130 -0
  630. data/vendor/redcloth/run-tests.rb +28 -0
  631. data/vendor/redcloth/setup.rb +1376 -0
  632. data/vendor/redcloth/tests/code.yml +105 -0
  633. data/vendor/redcloth/tests/hard_breaks.yml +26 -0
  634. data/vendor/redcloth/tests/images.yml +171 -0
  635. data/vendor/redcloth/tests/instiki.yml +39 -0
  636. data/vendor/redcloth/tests/links.yml +155 -0
  637. data/vendor/redcloth/tests/lists.yml +77 -0
  638. data/vendor/redcloth/tests/markdown.yml +218 -0
  639. data/vendor/redcloth/tests/poignant.yml +64 -0
  640. data/vendor/redcloth/tests/table.yml +198 -0
  641. data/vendor/redcloth/tests/textism.yml +406 -0
  642. data/vendor/ruby-mp3info/lib/mp3info.rb +720 -0
  643. data/vendor/rubypants/README +114 -0
  644. data/vendor/rubypants/Rakefile +55 -0
  645. data/vendor/rubypants/html/classes/RubyPants.html +924 -0
  646. data/vendor/rubypants/html/created.rid +1 -0
  647. data/vendor/rubypants/html/files/README.html +248 -0
  648. data/vendor/rubypants/html/files/rubypants_rb.html +125 -0
  649. data/vendor/rubypants/html/fr_class_index.html +27 -0
  650. data/vendor/rubypants/html/fr_file_index.html +28 -0
  651. data/vendor/rubypants/html/fr_method_index.html +38 -0
  652. data/vendor/rubypants/html/index.html +24 -0
  653. data/vendor/rubypants/html/rdoc-style.css +172 -0
  654. data/vendor/rubypants/install.rb +9 -0
  655. data/vendor/rubypants/rubypants.rb +490 -0
  656. data/vendor/rubypants/test_rubypants.rb +162 -0
  657. data/vendor/sparklines/README.txt +47 -0
  658. data/vendor/sparklines/USAGE +14 -0
  659. data/vendor/sparklines/lib/sparklines.rb +435 -0
  660. data/vendor/sparklines/samples/sparklinestest.rb +26 -0
  661. data/vendor/sparklines/sparklines_generator.rb +9 -0
  662. data/vendor/sparklines/templates/sparklines_controller.rb +30 -0
  663. data/vendor/sparklines/templates/sparklines_helper.rb +30 -0
  664. data/vendor/syntax/LICENSE +27 -0
  665. data/vendor/syntax/NEWS +16 -0
  666. data/vendor/syntax/README +38 -0
  667. data/vendor/syntax/Rakefile +194 -0
  668. data/vendor/syntax/api/classes/Syntax.html +173 -0
  669. data/vendor/syntax/api/classes/Syntax/Convertors.html +91 -0
  670. data/vendor/syntax/api/classes/Syntax/Convertors/Abstract.html +159 -0
  671. data/vendor/syntax/api/classes/Syntax/Convertors/HTML.html +149 -0
  672. data/vendor/syntax/api/classes/Syntax/Default.html +123 -0
  673. data/vendor/syntax/api/classes/Syntax/Ruby.html +319 -0
  674. data/vendor/syntax/api/classes/Syntax/Token.html +151 -0
  675. data/vendor/syntax/api/classes/Syntax/Tokenizer.html +324 -0
  676. data/vendor/syntax/api/classes/Syntax/Version.html +109 -0
  677. data/vendor/syntax/api/classes/Syntax/XML.html +205 -0
  678. data/vendor/syntax/api/classes/Syntax/YAML.html +189 -0
  679. data/vendor/syntax/api/created.rid +1 -0
  680. data/vendor/syntax/api/files/README.html +155 -0
  681. data/vendor/syntax/api/files/lib/syntax/common_rb.html +96 -0
  682. data/vendor/syntax/api/files/lib/syntax/convertors/abstract_rb.html +96 -0
  683. data/vendor/syntax/api/files/lib/syntax/convertors/html_rb.html +96 -0
  684. data/vendor/syntax/api/files/lib/syntax/lang/ruby_rb.html +96 -0
  685. data/vendor/syntax/api/files/lib/syntax/lang/xml_rb.html +96 -0
  686. data/vendor/syntax/api/files/lib/syntax/lang/yaml_rb.html +96 -0
  687. data/vendor/syntax/api/files/lib/syntax/version_rb.html +92 -0
  688. data/vendor/syntax/api/files/lib/syntax_rb.html +96 -0
  689. data/vendor/syntax/api/fr_class_index.html +56 -0
  690. data/vendor/syntax/api/fr_file_index.html +54 -0
  691. data/vendor/syntax/api/fr_method_index.html +65 -0
  692. data/vendor/syntax/api/index.html +26 -0
  693. data/vendor/syntax/api/rdoc-style.css +175 -0
  694. data/vendor/syntax/doc/manual-html/chapter-1.html +198 -0
  695. data/vendor/syntax/doc/manual-html/chapter-2.html +262 -0
  696. data/vendor/syntax/doc/manual-html/chapter-3.html +266 -0
  697. data/vendor/syntax/doc/manual-html/chapter-4.html +267 -0
  698. data/vendor/syntax/doc/manual-html/index.html +152 -0
  699. data/vendor/syntax/doc/manual-html/stylesheets/manual.css +270 -0
  700. data/vendor/syntax/doc/manual-html/stylesheets/ruby.css +17 -0
  701. data/vendor/syntax/doc/manual/chapter.erb +38 -0
  702. data/vendor/syntax/doc/manual/example.erb +18 -0
  703. data/vendor/syntax/doc/manual/index.erb +29 -0
  704. data/vendor/syntax/doc/manual/manual.rb +311 -0
  705. data/vendor/syntax/doc/manual/manual.yml +43 -0
  706. data/vendor/syntax/doc/manual/page.erb +87 -0
  707. data/vendor/syntax/doc/manual/parts/0000.txt +5 -0
  708. data/vendor/syntax/doc/manual/parts/0001.txt +16 -0
  709. data/vendor/syntax/doc/manual/parts/0002.txt +24 -0
  710. data/vendor/syntax/doc/manual/parts/0003.txt +6 -0
  711. data/vendor/syntax/doc/manual/parts/0004.txt +32 -0
  712. data/vendor/syntax/doc/manual/parts/0005.txt +18 -0
  713. data/vendor/syntax/doc/manual/parts/0006.txt +62 -0
  714. data/vendor/syntax/doc/manual/parts/0007.txt +3 -0
  715. data/vendor/syntax/doc/manual/parts/0008.txt +5 -0
  716. data/vendor/syntax/doc/manual/parts/0009.txt +29 -0
  717. data/vendor/syntax/doc/manual/parts/0010.txt +21 -0
  718. data/vendor/syntax/doc/manual/stylesheets/manual.css +270 -0
  719. data/vendor/syntax/doc/manual/stylesheets/ruby.css +17 -0
  720. data/vendor/syntax/doc/manual/tutorial.erb +30 -0
  721. data/vendor/syntax/lib/syntax.rb +38 -0
  722. data/vendor/syntax/lib/syntax/common.rb +163 -0
  723. data/vendor/syntax/lib/syntax/convertors/abstract.rb +27 -0
  724. data/vendor/syntax/lib/syntax/convertors/html.rb +51 -0
  725. data/vendor/syntax/lib/syntax/lang/ruby.rb +317 -0
  726. data/vendor/syntax/lib/syntax/lang/xml.rb +108 -0
  727. data/vendor/syntax/lib/syntax/lang/yaml.rb +105 -0
  728. data/vendor/syntax/lib/syntax/version.rb +9 -0
  729. data/vendor/syntax/setup.rb +1331 -0
  730. data/vendor/syntax/syntax.gemspec +24 -0
  731. data/vendor/syntax/test/ALL-TESTS.rb +5 -0
  732. data/vendor/syntax/test/syntax/tc_ruby.rb +871 -0
  733. data/vendor/syntax/test/syntax/tc_xml.rb +202 -0
  734. data/vendor/syntax/test/syntax/tc_yaml.rb +228 -0
  735. data/vendor/syntax/test/syntax/tokenizer_testcase.rb +40 -0
  736. data/vendor/syntax/test/tc_syntax.rb +22 -0
  737. data/vendor/uuidtools/CHANGELOG +4 -0
  738. data/vendor/uuidtools/README +13 -0
  739. data/vendor/uuidtools/install.rb +30 -0
  740. data/vendor/uuidtools/lib/uuidtools.rb +555 -0
  741. data/vendor/uuidtools/rakefile +112 -0
  742. metadata +1022 -0
@@ -0,0 +1,359 @@
1
+ $:.unshift '../lib'
2
+ require 'yaml'
3
+ require 'redcloth'
4
+
5
+ class String
6
+ #
7
+ # Flexible HTML escaping
8
+ #
9
+ def htmlesc!( mode )
10
+ gsub!( '&', '&' )
11
+ gsub!( '"', '"' ) if mode != :NoQuotes
12
+ gsub!( "'", ''' ) if mode == :Quotes
13
+ gsub!('<', '&lt;')
14
+ gsub!('>', '&gt;')
15
+ end
16
+ end
17
+
18
+ def a_name( phrase )
19
+ phrase.downcase.
20
+ gsub( /\W+/, '-' )
21
+ end
22
+
23
+ file_name = ARGV.shift
24
+ case file_name
25
+ when 'README'
26
+ puts <<-HTML
27
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
28
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
29
+ <html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
30
+ <head>
31
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
32
+ <title>RedCloth [Textile Humane Web Text for Ruby]</title>
33
+ <style type="text/css">
34
+ BODY {
35
+ margin: 10px 60px 40px 60px;
36
+ font-family: georgia, serif;
37
+ font-size: 12pt;
38
+ }
39
+ TABLE {
40
+ padding: 15px;
41
+ width: 250px;
42
+ }
43
+ TH {
44
+ text-align: left;
45
+ }
46
+ TD {
47
+ border-top: solid 1px #eee;
48
+ }
49
+ H4 {
50
+ border: solid 1px #caa;
51
+ margin: 10px 15px 5px 10px;
52
+ padding: 5px;
53
+ color: white;
54
+ background-color: #333;
55
+ font-weight: bold;
56
+ font-size: 12pt;
57
+ }
58
+ P {
59
+ margin: 10px 15px 5px 15px;
60
+ }
61
+ P.example1 {
62
+ background-color: #FEE;
63
+ font-weight: bold;
64
+ font-size: 9pt;
65
+ padding: 5px;
66
+ }
67
+ P.example2 {
68
+ border: solid 1px #DDD;
69
+ background-color: #EEE;
70
+ font-size: 9pt;
71
+ padding: 5px;
72
+ }
73
+ .big {
74
+ font-size: 15pt;
75
+ }
76
+ #big-red {
77
+ font-size: 15pt;
78
+ color: red;
79
+ }
80
+ #big-red2 {
81
+ font-size: 15pt;
82
+ color: red;
83
+ }
84
+ #sidebar {
85
+ float: right;
86
+ font-family: verdana, arial, sans-serif;
87
+ font-size: 10pt;
88
+ border-left: solid 1px #999;
89
+ margin-left: 10px;
90
+ width: 200px;
91
+ }
92
+ /* VARIATION BUTTON STYLING (v2.0) - SIZABLE SIZE */
93
+ #css-buttons ul{list-style: none;margin: 0 0 10px 0;padding: 0;}
94
+ #css-buttons li{border: 1px solid #999; margin: 5px 0 0 20px; width:9.0em;}
95
+ head:first-child+body #css-buttons li{padding-right:2px;}
96
+ #css-buttons li a{color: #333; text-decoration: none;}
97
+
98
+ .css-button {
99
+ display:block;
100
+ font: 0.8em verdana, arial, sans-serif;
101
+ padding: 2px 0 2px 0px; border: 1px solid white;
102
+ text-decoration: none; width:100%;
103
+ background: #ddd;color: #333;
104
+ }
105
+
106
+ .css-button span {
107
+ font: bold 1.0em verdana, arial, sans-serif;
108
+ padding: 2px 3px 2px 3px; color: #fff;
109
+ }
110
+
111
+ /* BUTTON LOGO STYLING */
112
+ .rss span{background:#f60;}
113
+ .w3c span {background: #fff; color: #069; font: bold 1.1em helvetica, arial, Sans-Serif;}
114
+ .w3c2{background: #fc6;color: black !important;}
115
+ </style>
116
+ </head>
117
+ <body>
118
+ HTML
119
+ puts RedCloth.new( File.open( file_name ).read ).to_html
120
+ puts "</body>"
121
+ puts "</html>"
122
+ when 'QUICK-REFERENCE'
123
+ YAML::add_private_type( "example" ) do |type, val|
124
+ esc = val.dup
125
+ esc.htmlesc!( :NoQuotes )
126
+ [ :example, esc.gsub( /\n/, '<br />' ),
127
+ RedCloth.new( val ).to_html ]
128
+ end
129
+
130
+ content = YAML::load( File.open( 'REFERENCE' ) )
131
+
132
+ sections = content.collect { |c| c.keys.first }
133
+ sections.shift
134
+
135
+ puts <<-HTML
136
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
137
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
138
+ <html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
139
+ <head>
140
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
141
+ <title>Textile Quick Reference</title>
142
+ <style type="text/css">
143
+ BODY {
144
+ margin: 5px;
145
+ }
146
+ TABLE {
147
+ font-family: georgia, serif;
148
+ font-size: 10pt;
149
+ padding: 5px;
150
+ width: 200px;
151
+ }
152
+ TH {
153
+ padding-top: 10px;
154
+ }
155
+ TD {
156
+ border-top: solid 1px #eee;
157
+ }
158
+ H1 {
159
+ font-size: 18pt;
160
+ }
161
+ H4 {
162
+ color: #999;
163
+ background-color: #fee;
164
+ border: solid 1px #caa;
165
+ margin: 10px 15px 5px 10px;
166
+ padding: 5px;
167
+ }
168
+ P {
169
+ margin: 2px 5px 2px 5px;
170
+ }
171
+ TD.example1 PRE {
172
+ background-color: #FEE;
173
+ font-family: georgia, serif;
174
+ font-size: 8pt;
175
+ padding: 5px;
176
+ padding: 5px;
177
+ }
178
+ TD.example3 {
179
+ border: solid 1px #DDD;
180
+ background-color: #EEE;
181
+ font-size: 8pt;
182
+ padding: 5px;
183
+ }
184
+ .big {
185
+ font-size: 12pt;
186
+ }
187
+ #big-red {
188
+ font-size: 12pt;
189
+ color: red;
190
+ }
191
+ #big-red2 {
192
+ font-size: 15pt;
193
+ color: red;
194
+ }
195
+ </style>
196
+ </head>
197
+ <body>
198
+ <table>
199
+ <tr><th colspan='3'><h1>Textile Quick Reference</h1></th></tr>
200
+ <tr><th colspan='3'>Sections: #{ sections.collect { |s| "<a href='##{ a_name( s ) }'>#{ s.gsub( /\s/, '&nbsp;' ) }</a>" }.join( ' | ' ) }</th></tr>
201
+ HTML
202
+
203
+ ct = 0
204
+ content.each do |section|
205
+ section.each do |header, parags|
206
+ puts "<tr><th colspan='5'><a name='#{ a_name( header ) }'>#{ header }</a></th></tr>" if ct.nonzero?
207
+ parags.each do |p|
208
+ if p.is_a?( Array ) and p[0] == :example
209
+ puts "<tr><td class='example1'><pre>#{ p[1] }</pre></td><td>&rarr;</td>" +
210
+ "<td class='example2'>#{ p[2] }</td></tr>"
211
+ end
212
+ end
213
+ end
214
+ ct += 1
215
+ end
216
+ puts "</table>"
217
+ puts "</body>"
218
+ puts "</html>"
219
+
220
+ when 'REFERENCE'
221
+ YAML::add_private_type( "example" ) do |type, val|
222
+ esc = val.dup
223
+ esc.htmlesc!( :NoQuotes )
224
+ [ esc.gsub( /\n/, '<br />' ),
225
+ RedCloth.new( val ).to_html.
226
+ gsub( /;(\w)/, '; \1' ).
227
+ htmlesc!( :NoQuotes ).
228
+ gsub( /\n/, '<br />' ),
229
+ RedCloth.new( val ).to_html ]
230
+ end
231
+
232
+ content = YAML::load( File.open( file_name ) )
233
+
234
+ sections = content.collect { |c| c.keys.first }
235
+ sections.shift
236
+
237
+ puts <<-HTML
238
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
239
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
240
+ <html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
241
+ <head>
242
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
243
+ <title>Textile Reference</title>
244
+ <style type="text/css">
245
+ BODY {
246
+ margin: 10px 30px;
247
+ }
248
+ TABLE {
249
+ font-family: georgia, serif;
250
+ font-size: 11pt;
251
+ padding: 15px;
252
+ }
253
+ TH {
254
+ border-bottom: solid 1px black;
255
+ font-size: 24pt;
256
+ font-weight: bold;
257
+ padding-top: 30px;
258
+ }
259
+ H1 {
260
+ font-size: 42pt;
261
+ }
262
+ H4 {
263
+ color: #666;
264
+ background-color: #fee;
265
+ border: solid 1px #caa;
266
+ margin: 10px 0px 5px 0px;
267
+ padding: 5px;
268
+ }
269
+ P {
270
+ margin: 10px 15px 5px 15px;
271
+ }
272
+ TD.sections {
273
+ background: black;
274
+ color: white;
275
+ font-family: georgia, serif;
276
+ font-weight: bold;
277
+ font-size: 9pt;
278
+ padding: 5px;
279
+ }
280
+ TD.sections A { color: #CCEEFF; }
281
+ TD.sections A:link { color: #CCEEFF; }
282
+ TD.sections A:visited { color: #CCEEFF; }
283
+ TD.sections A:active { color: #EEEEEE; }
284
+ TD.sections A:hover { color: #EEEEEE; }
285
+
286
+ TD.example1 PRE {
287
+ background-color: #B30;
288
+ color: white;
289
+ font-family: georgia, serif;
290
+ font-weight: bold;
291
+ font-size: 9pt;
292
+ padding: 5px;
293
+ }
294
+ TD.example2 P {
295
+ border: solid 1px #DDD;
296
+ background-color: #EEE;
297
+ font-family: georgia, serif;
298
+ font-size: 9pt;
299
+ padding: 5px;
300
+ }
301
+ TD.example3 {
302
+ border: solid 1px #EED;
303
+ background-color: #FFE;
304
+ padding: 5px;
305
+ }
306
+ .big {
307
+ font-size: 15pt;
308
+ }
309
+ #big-red {
310
+ font-size: 15pt;
311
+ color: red
312
+ }
313
+ </style>
314
+ <script type="text/javascript">
315
+ function quickRedReference() {
316
+ window.open(
317
+ "quick.html",
318
+ "redRef",
319
+ "height=600,width=550,channelmode=0,dependent=0," +
320
+ "directories=0,fullscreen=0,location=0,menubar=0," +
321
+ "resizable=0,scrollbars=1,status=1,toolbar=0"
322
+ );
323
+ }
324
+ </script>
325
+ </head>
326
+ <body>
327
+ <table>
328
+ HTML
329
+
330
+ ct = 0
331
+ content.each do |section|
332
+ section.each do |header, parags|
333
+ if ct.zero?
334
+ puts "<tr><th colspan='3'><h1>#{ header }</h1></th></tr>"
335
+ puts "<tr><td class='sections' colspan='3'>Sections: #{ sections.collect { |s| "<a href='##{ a_name( s ) }'>#{ s.gsub( /\s/, '&nbsp;' ) }</a>" }.join( ' | ' ) }</td></tr>"
336
+ else
337
+ puts "<tr><th colspan='3'><a name='#{ a_name( header ) }'><small>#{ ct }.</small></a><br />#{ header }</th></tr>"
338
+ end
339
+ parags.each do |p|
340
+ if p.is_a? Array
341
+ puts "<tr><td class='example1' valign='top'><pre>#{ p[0] }</pre></td><td>&rarr;</td>" +
342
+ "<td class='example2'><p>#{ p[1] }</p></td></tr><tr><td colspan='2'></td>" +
343
+ "<td class='example3'>#{ p[2] }</td></tr>"
344
+ else
345
+ puts "<tr><td class='explain' colspan='3'>"
346
+ puts RedCloth.new( p ).to_html
347
+ puts "</td></tr>"
348
+ end
349
+ end
350
+ unless ct.zero?
351
+ puts "<tr><td colspan='5' style='border-bottom: solid 1px #eee;'></td></tr>"
352
+ end
353
+ end
354
+ ct += 1
355
+ end
356
+ puts "</table>"
357
+ puts "</body>"
358
+ puts "</html>"
359
+ end
@@ -0,0 +1,1032 @@
1
+ #!/usr/local/bin/ruby
2
+ #
3
+ # This file is automatically generated. DO NOT MODIFY!
4
+ #
5
+ # install.rb
6
+ #
7
+ # Copyright (c) 2000-2002 Minero Aoki <aamine@loveruby.net>
8
+ #
9
+ # This program is free software.
10
+ # You can distribute/modify this program under the terms of
11
+ # the GNU Lesser General Public License version 2.
12
+ #
13
+
14
+ ### begin compat.rb
15
+
16
+ unless Enumerable.instance_methods.include? 'inject' then
17
+ module Enumerable
18
+ def inject( result )
19
+ each do |i|
20
+ result = yield(result, i)
21
+ end
22
+ result
23
+ end
24
+ end
25
+ end
26
+
27
+ def File.read_all( fname )
28
+ File.open(fname, 'rb') {|f| return f.read }
29
+ end
30
+
31
+ def File.write( fname, str )
32
+ File.open(fname, 'wb') {|f| f.write str }
33
+ end
34
+
35
+ ### end compat.rb
36
+ ### begin config.rb
37
+
38
+ if i = ARGV.index(/\A--rbconfig=/) then
39
+ file = $'
40
+ ARGV.delete_at(i)
41
+ require file
42
+ else
43
+ require 'rbconfig'
44
+ end
45
+
46
+
47
+ class ConfigTable
48
+
49
+ c = ::Config::CONFIG
50
+
51
+ rubypath = c['bindir'] + '/' + c['ruby_install_name']
52
+
53
+ major = c['MAJOR'].to_i
54
+ minor = c['MINOR'].to_i
55
+ teeny = c['TEENY'].to_i
56
+ version = "#{major}.#{minor}"
57
+
58
+ # ruby ver. >= 1.4.4?
59
+ newpath_p = ((major >= 2) or
60
+ ((major == 1) and
61
+ ((minor >= 5) or
62
+ ((minor == 4) and (teeny >= 4)))))
63
+
64
+ re = Regexp.new('\A' + Regexp.quote(c['prefix']))
65
+ subprefix = lambda {|path|
66
+ re === path and path.sub(re, '$prefix')
67
+ }
68
+
69
+ if c['rubylibdir'] then
70
+ # 1.6.3 < V
71
+ stdruby = subprefix.call(c['rubylibdir'])
72
+ siteruby = subprefix.call(c['sitedir'])
73
+ versite = subprefix.call(c['sitelibdir'])
74
+ sodir = subprefix.call(c['sitearchdir'])
75
+ elsif newpath_p then
76
+ # 1.4.4 <= V <= 1.6.3
77
+ stdruby = "$prefix/lib/ruby/#{version}"
78
+ siteruby = subprefix.call(c['sitedir'])
79
+ versite = siteruby + '/' + version
80
+ sodir = "$site-ruby/#{c['arch']}"
81
+ else
82
+ # V < 1.4.4
83
+ stdruby = "$prefix/lib/ruby/#{version}"
84
+ siteruby = "$prefix/lib/ruby/#{version}/site_ruby"
85
+ versite = siteruby
86
+ sodir = "$site-ruby/#{c['arch']}"
87
+ end
88
+
89
+ DESCRIPTER = [
90
+ [ 'prefix', [ c['prefix'],
91
+ 'path',
92
+ 'path prefix of target environment' ] ],
93
+ [ 'std-ruby', [ stdruby,
94
+ 'path',
95
+ 'the directory for standard ruby libraries' ] ],
96
+ [ 'site-ruby-common', [ siteruby,
97
+ 'path',
98
+ 'the directory for version-independent non-standard ruby libraries' ] ],
99
+ [ 'site-ruby', [ versite,
100
+ 'path',
101
+ 'the directory for non-standard ruby libraries' ] ],
102
+ [ 'bin-dir', [ '$prefix/bin',
103
+ 'path',
104
+ 'the directory for commands' ] ],
105
+ [ 'rb-dir', [ '$site-ruby',
106
+ 'path',
107
+ 'the directory for ruby scripts' ] ],
108
+ [ 'so-dir', [ sodir,
109
+ 'path',
110
+ 'the directory for ruby extentions' ] ],
111
+ [ 'data-dir', [ '$prefix/share',
112
+ 'path',
113
+ 'the directory for shared data' ] ],
114
+ [ 'ruby-path', [ rubypath,
115
+ 'path',
116
+ 'path to set to #! line' ] ],
117
+ [ 'ruby-prog', [ rubypath,
118
+ 'name',
119
+ 'the ruby program using for installation' ] ],
120
+ [ 'make-prog', [ 'make',
121
+ 'name',
122
+ 'the make program to compile ruby extentions' ] ],
123
+ [ 'without-ext', [ 'no',
124
+ 'yes/no',
125
+ 'does not compile/install ruby extentions' ] ]
126
+ ]
127
+
128
+ SAVE_FILE = 'config.save'
129
+
130
+ def ConfigTable.each_name( &block )
131
+ keys().each( &block )
132
+ end
133
+
134
+ def ConfigTable.keys
135
+ DESCRIPTER.collect {|k,*dummy| k }
136
+ end
137
+
138
+ def ConfigTable.each_definition( &block )
139
+ DESCRIPTER.each( &block )
140
+ end
141
+
142
+ def ConfigTable.get_entry( name )
143
+ name, ent = DESCRIPTER.assoc(name)
144
+ ent
145
+ end
146
+
147
+ def ConfigTable.get_entry!( name )
148
+ get_entry(name) or raise ArgumentError, "no such config: #{name}"
149
+ end
150
+
151
+ def ConfigTable.add_entry( name, vals )
152
+ ConfigTable::DESCRIPTER.push [name,vals]
153
+ end
154
+
155
+ def ConfigTable.remove_entry( name )
156
+ get_entry name or raise ArgumentError, "no such config: #{name}"
157
+ DESCRIPTER.delete_if {|n,arr| n == name }
158
+ end
159
+
160
+ def ConfigTable.config_key?( name )
161
+ get_entry(name) ? true : false
162
+ end
163
+
164
+ def ConfigTable.bool_config?( name )
165
+ ent = get_entry(name) or return false
166
+ ent[1] == 'yes/no'
167
+ end
168
+
169
+ def ConfigTable.value_config?( name )
170
+ ent = get_entry(name) or return false
171
+ ent[1] != 'yes/no'
172
+ end
173
+
174
+ def ConfigTable.path_config?( name )
175
+ ent = get_entry(name) or return false
176
+ ent[1] == 'path'
177
+ end
178
+
179
+
180
+ class << self
181
+
182
+ alias newobj new
183
+
184
+ def new
185
+ c = newobj()
186
+ c.__send__ :init
187
+ c
188
+ end
189
+
190
+ def load
191
+ c = newobj()
192
+ File.file? SAVE_FILE or
193
+ raise InstallError, "#{File.basename $0} config first"
194
+ File.foreach( SAVE_FILE ) do |line|
195
+ k, v = line.split( '=', 2 )
196
+ c.instance_eval {
197
+ @table[k] = v.strip
198
+ }
199
+ end
200
+ c
201
+ end
202
+
203
+ end
204
+
205
+ def initialize
206
+ @table = {}
207
+ end
208
+
209
+ def init
210
+ DESCRIPTER.each do |k, (default, vname, desc, default2)|
211
+ @table[k] = default
212
+ end
213
+ end
214
+ private :init
215
+
216
+ def save
217
+ File.open( SAVE_FILE, 'w' ) {|f|
218
+ @table.each do |k, v|
219
+ f.printf "%s=%s\n", k, v if v
220
+ end
221
+ }
222
+ end
223
+
224
+ def []=( k, v )
225
+ ConfigTable.config_key? k or raise InstallError, "unknown config option #{k}"
226
+ if ConfigTable.path_config? k then
227
+ @table[k] = (v[0,1] != '$') ? File.expand_path(v) : v
228
+ else
229
+ @table[k] = v
230
+ end
231
+ end
232
+
233
+ def []( key )
234
+ @table[key] or return nil
235
+ @table[key].gsub( %r<\$([^/]+)> ) { self[$1] }
236
+ end
237
+
238
+ def set_raw( key, val )
239
+ @table[key] = val
240
+ end
241
+
242
+ def get_raw( key )
243
+ @table[key]
244
+ end
245
+
246
+ end
247
+
248
+
249
+ class MetaConfigEnvironment
250
+
251
+ def self.eval_file( file )
252
+ return unless File.file? file
253
+ new.instance_eval File.read_all(file), file, 1
254
+ end
255
+
256
+ private
257
+
258
+ def config_names
259
+ ConfigTable.keys
260
+ end
261
+
262
+ def config?( name )
263
+ ConfigTable.config_key? name
264
+ end
265
+
266
+ def bool_config?( name )
267
+ ConfigTable.bool_config? name
268
+ end
269
+
270
+ def value_config?( name )
271
+ ConfigTable.value_config? name
272
+ end
273
+
274
+ def path_config?( name )
275
+ ConfigTable.path_config? name
276
+ end
277
+
278
+ def add_config( name, argname, default, desc )
279
+ ConfigTable.add_entry name,[default,argname,desc]
280
+ end
281
+
282
+ def add_path_config( name, default, desc )
283
+ add_config name, 'path', default, desc
284
+ end
285
+
286
+ def add_bool_config( name, default, desc )
287
+ add_config name, 'yes/no', default ? 'yes' : 'no', desc
288
+ end
289
+
290
+ def set_config_default( name, default )
291
+ if bool_config? name then
292
+ ConfigTable.get_entry!(name)[0] = default ? 'yes' : 'no'
293
+ else
294
+ ConfigTable.get_entry!(name)[0] = default
295
+ end
296
+ end
297
+
298
+ def remove_config( name )
299
+ ent = ConfigTable.get_entry(name)
300
+ ConfigTable.remove_entry name
301
+ ent
302
+ end
303
+
304
+ end
305
+
306
+ ### end config.rb
307
+ ### begin fileop.rb
308
+
309
+ module FileOperations
310
+
311
+ def mkdir_p( dname, prefix = nil )
312
+ dname = prefix + dname if prefix
313
+ $stderr.puts "mkdir -p #{dname}" if verbose?
314
+ return if no_harm?
315
+
316
+ # does not check '/'... it's too abnormal case
317
+ dirs = dname.split(%r_(?=/)_)
318
+ if /\A[a-z]:\z/i === dirs[0] then
319
+ disk = dirs.shift
320
+ dirs[0] = disk + dirs[0]
321
+ end
322
+ dirs.each_index do |idx|
323
+ path = dirs[0..idx].join('')
324
+ Dir.mkdir path unless dir? path
325
+ end
326
+ end
327
+
328
+ def rm_f( fname )
329
+ $stderr.puts "rm -f #{fname}" if verbose?
330
+ return if no_harm?
331
+
332
+ if File.exist? fname or File.symlink? fname then
333
+ File.chmod 0777, fname
334
+ File.unlink fname
335
+ end
336
+ end
337
+
338
+ def rm_rf( dn )
339
+ $stderr.puts "rm -rf #{dn}" if verbose?
340
+ return if no_harm?
341
+
342
+ Dir.chdir dn
343
+ Dir.foreach('.') do |fn|
344
+ next if fn == '.'
345
+ next if fn == '..'
346
+ if dir? fn then
347
+ verbose_off {
348
+ rm_rf fn
349
+ }
350
+ else
351
+ verbose_off {
352
+ rm_f fn
353
+ }
354
+ end
355
+ end
356
+ Dir.chdir '..'
357
+ Dir.rmdir dn
358
+ end
359
+
360
+ def mv( src, dest )
361
+ rm_f dest
362
+ begin
363
+ File.link src, dest
364
+ rescue
365
+ File.write dest, File.read_all(src)
366
+ File.chmod File.stat(src).mode, dest
367
+ end
368
+ rm_f src
369
+ end
370
+
371
+ def install( from, dest, mode, prefix = nil )
372
+ $stderr.puts "install #{from} #{dest}" if verbose?
373
+ return if no_harm?
374
+
375
+ realdest = prefix + dest if prefix
376
+ if dir? realdest then
377
+ realdest += '/' + File.basename(from)
378
+ end
379
+ str = File.read_all(from)
380
+ if diff? str, realdest then
381
+ verbose_off {
382
+ rm_f realdest if File.exist? realdest
383
+ }
384
+ File.write realdest, str
385
+ File.chmod mode, realdest
386
+
387
+ File.open( objdir + '/InstalledFiles', 'a' ) {|f| f.puts realdest }
388
+ end
389
+ end
390
+
391
+ def diff?( orig, targ )
392
+ return true unless File.exist? targ
393
+ orig != File.read_all(targ)
394
+ end
395
+
396
+ def command( str )
397
+ $stderr.puts str if verbose?
398
+ system str or raise RuntimeError, "'system #{str}' failed"
399
+ end
400
+
401
+ def ruby( str )
402
+ command config('ruby-prog') + ' ' + str
403
+ end
404
+
405
+ def dir?( dname )
406
+ # for corrupted windows stat()
407
+ File.directory?( (dname[-1,1] == '/') ? dname : dname + '/' )
408
+ end
409
+
410
+ def all_files( dname )
411
+ Dir.open( dname ) {|d|
412
+ return d.find_all {|n| File.file? "#{dname}/#{n}" }
413
+ }
414
+ end
415
+
416
+ def all_dirs( dname )
417
+ Dir.open( dname ) {|d|
418
+ return d.find_all {|n| dir? "#{dname}/#{n}" } - %w(. ..)
419
+ }
420
+ end
421
+
422
+ end
423
+
424
+ ### end fileop.rb
425
+ ### begin base.rb
426
+
427
+ class InstallError < StandardError; end
428
+
429
+
430
+ class Installer
431
+
432
+ Version = '3.1.2'
433
+ Copyright = 'Copyright (c) 2000-2002 Minero Aoki'
434
+
435
+
436
+ @toplevel = nil
437
+
438
+ def self.declear_toplevel_installer( inst )
439
+ @toplevel and
440
+ raise ArgumentError, 'more than one toplevel installer decleared'
441
+ @toplevel = inst
442
+ end
443
+
444
+ def self.toplevel_installer
445
+ @toplevel
446
+ end
447
+
448
+
449
+ FILETYPES = %w( bin lib ext data )
450
+
451
+ include FileOperations
452
+
453
+ def initialize( config, opt, srcroot, objroot )
454
+ @config = config
455
+ @options = opt
456
+ @srcdir = File.expand_path(srcroot)
457
+ @objdir = File.expand_path(objroot)
458
+ @currdir = '.'
459
+ end
460
+
461
+ def inspect
462
+ "#<#{type} #{__id__}>"
463
+ end
464
+
465
+ #
466
+ # configs/options
467
+ #
468
+
469
+ def get_config( key )
470
+ @config[key]
471
+ end
472
+
473
+ alias config get_config
474
+
475
+ def set_config( key, val )
476
+ @config[key] = val
477
+ end
478
+
479
+ def no_harm?
480
+ @options['no-harm']
481
+ end
482
+
483
+ def verbose?
484
+ @options['verbose']
485
+ end
486
+
487
+ def verbose_off
488
+ save, @options['verbose'] = @options['verbose'], false
489
+ yield
490
+ @options['verbose'] = save
491
+ end
492
+
493
+ #
494
+ # srcdir/objdir
495
+ #
496
+
497
+ attr_reader :srcdir
498
+ alias srcdir_root srcdir
499
+ alias package_root srcdir
500
+
501
+ def curr_srcdir
502
+ "#{@srcdir}/#{@currdir}"
503
+ end
504
+
505
+ attr_reader :objdir
506
+ alias objdir_root objdir
507
+
508
+ def curr_objdir
509
+ "#{@objdir}/#{@currdir}"
510
+ end
511
+
512
+ def srcfile( path )
513
+ curr_srcdir + '/' + path
514
+ end
515
+
516
+ def srcexist?( path )
517
+ File.exist? srcfile(path)
518
+ end
519
+
520
+ def srcdirectory?( path )
521
+ dir? srcfile(path)
522
+ end
523
+
524
+ def srcfile?( path )
525
+ File.file? srcfile(path)
526
+ end
527
+
528
+ def srcentries( path = '.' )
529
+ Dir.open( curr_srcdir + '/' + path ) {|d|
530
+ return d.to_a - %w(. ..) - hookfilenames
531
+ }
532
+ end
533
+
534
+ def srcfiles( path = '.' )
535
+ srcentries(path).find_all {|fname|
536
+ File.file? File.join(curr_srcdir, path, fname)
537
+ }
538
+ end
539
+
540
+ def srcdirectories( path = '.' )
541
+ srcentries(path).find_all {|fname|
542
+ dir? File.join(curr_srcdir, path, fname)
543
+ }
544
+ end
545
+
546
+ def dive_into( rel )
547
+ return unless dir? "#{@srcdir}/#{rel}"
548
+
549
+ dir = File.basename(rel)
550
+ Dir.mkdir dir unless dir? dir
551
+ save = Dir.pwd
552
+ Dir.chdir dir
553
+ $stderr.puts '---> ' + rel if verbose?
554
+ @currdir = rel
555
+ yield
556
+ Dir.chdir save
557
+ $stderr.puts '<--- ' + rel if verbose?
558
+ @currdir = File.dirname(rel)
559
+ end
560
+
561
+ #
562
+ # config
563
+ #
564
+
565
+ def exec_config
566
+ exec_task_traverse 'config'
567
+ end
568
+
569
+ def config_dir_bin( rel )
570
+ end
571
+
572
+ def config_dir_lib( rel )
573
+ end
574
+
575
+ def config_dir_ext( rel )
576
+ extconf if extdir? curr_srcdir
577
+ end
578
+
579
+ def extconf
580
+ opt = @options['config-opt'].join(' ')
581
+ command "#{config('ruby-prog')} #{curr_srcdir}/extconf.rb #{opt}"
582
+ end
583
+
584
+ def config_dir_data( rel )
585
+ end
586
+
587
+ #
588
+ # setup
589
+ #
590
+
591
+ def exec_setup
592
+ exec_task_traverse 'setup'
593
+ end
594
+
595
+ def setup_dir_bin( relpath )
596
+ all_files( curr_srcdir ).each do |fname|
597
+ add_rubypath "#{curr_srcdir}/#{fname}"
598
+ end
599
+ end
600
+
601
+ SHEBANG_RE = /\A\#!\s*\S*ruby\S*/
602
+
603
+ def add_rubypath( path )
604
+ $stderr.puts %Q<set #! line to "\#!#{config('ruby-path')}" for #{path} ...> if verbose?
605
+ return if no_harm?
606
+
607
+ tmpfile = File.basename(path) + '.tmp'
608
+ begin
609
+ File.open( path ) {|r|
610
+ File.open( tmpfile, 'w' ) {|w|
611
+ first = r.gets
612
+ return unless SHEBANG_RE === first # reject '/usr/bin/env ruby'
613
+
614
+ w.print first.sub( SHEBANG_RE, '#!' + config('ruby-path') )
615
+ w.write r.read
616
+ } }
617
+ mv tmpfile, File.basename(path)
618
+ ensure
619
+ rm_f tmpfile if File.exist? tmpfile
620
+ end
621
+ end
622
+
623
+ def setup_dir_lib( relpath )
624
+ end
625
+
626
+ def setup_dir_ext( relpath )
627
+ if extdir? curr_srcdir then
628
+ make
629
+ end
630
+ end
631
+
632
+ def make
633
+ command config('make-prog')
634
+ end
635
+
636
+ def setup_dir_data( relpath )
637
+ end
638
+
639
+ #
640
+ # install
641
+ #
642
+
643
+ def exec_install
644
+ exec_task_traverse 'install'
645
+ end
646
+
647
+ def install_dir_bin( rel )
648
+ install_files targfiles, config('bin-dir') + '/' + rel, 0755
649
+ end
650
+
651
+ def install_dir_lib( rel )
652
+ install_files targfiles, config('rb-dir') + '/' + rel, 0644
653
+ begin
654
+ require 'rdoc/rdoc'
655
+ ri_site = true
656
+ if RDOC_VERSION =~ /^0\./
657
+ require 'rdoc/options'
658
+ unless Options::OptionList::OPTION_LIST.assoc('--ri-site')
659
+ ri_site = false
660
+ end
661
+ end
662
+ if ri_site
663
+ r = RDoc::RDoc.new
664
+ r.document(%w{--ri-site})
665
+ end
666
+ rescue
667
+ puts "** Unable to install Ri documentation for RedCloth **"
668
+ end
669
+ end
670
+
671
+ def install_dir_ext( rel )
672
+ if extdir? curr_srcdir then
673
+ install_dir_ext_main File.dirname(rel)
674
+ end
675
+ end
676
+
677
+ def install_dir_ext_main( rel )
678
+ install_files allext('.'), config('so-dir') + '/' + rel, 0555
679
+ end
680
+
681
+ def install_dir_data( rel )
682
+ install_files targfiles, config('data-dir') + '/' + rel, 0644
683
+ end
684
+
685
+ def install_files( list, dest, mode )
686
+ mkdir_p dest, @options['install-prefix']
687
+ list.each do |fname|
688
+ install fname, dest, mode, @options['install-prefix']
689
+ end
690
+ end
691
+
692
+ def targfiles
693
+ (targfilenames() - hookfilenames()).collect {|fname|
694
+ File.exist?(fname) ? fname : File.join(curr_srcdir(), fname)
695
+ }
696
+ end
697
+
698
+ def targfilenames
699
+ [ curr_srcdir(), '.' ].inject([]) {|ret, dir|
700
+ ret | all_files(dir)
701
+ }
702
+ end
703
+
704
+ def hookfilenames
705
+ %w( pre-%s post-%s pre-%s.rb post-%s.rb ).collect {|fmt|
706
+ %w( config setup install clean ).collect {|t| sprintf fmt, t }
707
+ }.flatten
708
+ end
709
+
710
+ def allext( dir )
711
+ _allext(dir) or raise InstallError,
712
+ "no extention exists: Have you done 'ruby #{$0} setup' ?"
713
+ end
714
+
715
+ DLEXT = /\.#{ ::Config::CONFIG['DLEXT'] }\z/
716
+
717
+ def _allext( dir )
718
+ Dir.open( dir ) {|d|
719
+ return d.find_all {|fname| DLEXT === fname }
720
+ }
721
+ end
722
+
723
+ #
724
+ # clean
725
+ #
726
+
727
+ def exec_clean
728
+ exec_task_traverse 'clean'
729
+ rm_f 'config.save'
730
+ rm_f 'InstalledFiles'
731
+ end
732
+
733
+ def clean_dir_bin( rel )
734
+ end
735
+
736
+ def clean_dir_lib( rel )
737
+ end
738
+
739
+ def clean_dir_ext( rel )
740
+ clean
741
+ end
742
+
743
+ def clean
744
+ command config('make-prog') + ' clean' if File.file? 'Makefile'
745
+ end
746
+
747
+ def clean_dir_data( rel )
748
+ end
749
+
750
+ #
751
+ # lib
752
+ #
753
+
754
+ def exec_task_traverse( task )
755
+ run_hook 'pre-' + task
756
+ FILETYPES.each do |type|
757
+ if config('without-ext') == 'yes' and type == 'ext' then
758
+ $stderr.puts 'skipping ext/* by user option' if verbose?
759
+ next
760
+ end
761
+ traverse task, type, task + '_dir_' + type
762
+ end
763
+ run_hook 'post-' + task
764
+ end
765
+
766
+ def traverse( task, rel, mid )
767
+ dive_into( rel ) {
768
+ run_hook 'pre-' + task
769
+ __send__ mid, rel.sub( %r_\A.*?(?:/|\z)_, '' )
770
+ all_dirs( curr_srcdir ).each do |d|
771
+ traverse task, rel + '/' + d, mid
772
+ end
773
+ run_hook 'post-' + task
774
+ }
775
+ end
776
+
777
+ def run_hook( name )
778
+ try_run_hook curr_srcdir + '/' + name or
779
+ try_run_hook curr_srcdir + '/' + name + '.rb'
780
+ end
781
+
782
+ def try_run_hook( fname )
783
+ return false unless File.file? fname
784
+
785
+ env = self.dup
786
+ begin
787
+ env.instance_eval File.read_all(fname), fname, 1
788
+ rescue
789
+ raise InstallError, "hook #{fname} failed:\n" + $!.message
790
+ end
791
+ true
792
+ end
793
+
794
+ def extdir?( dir )
795
+ File.exist? dir + '/MANIFEST'
796
+ end
797
+
798
+ end
799
+
800
+ ### end base.rb
801
+ ### begin toplevel.rb
802
+
803
+ class ToplevelInstaller < Installer
804
+
805
+ TASKS = [
806
+ [ 'config', 'saves your configurations' ],
807
+ [ 'show', 'shows current configuration' ],
808
+ [ 'setup', 'compiles extention or else' ],
809
+ [ 'install', 'installs files' ],
810
+ [ 'clean', "does `make clean' for each extention" ]
811
+ ]
812
+
813
+
814
+ def initialize( root )
815
+ super nil, {'verbose' => true}, root, '.'
816
+ Installer.declear_toplevel_installer self
817
+ end
818
+
819
+
820
+ def execute
821
+ run_metaconfigs
822
+
823
+ case task = parsearg_global()
824
+ when 'config'
825
+ @config = ConfigTable.new
826
+ else
827
+ @config = ConfigTable.load
828
+ end
829
+ parsearg_TASK task
830
+
831
+ exectask task
832
+ end
833
+
834
+
835
+ def run_metaconfigs
836
+ MetaConfigEnvironment.eval_file "#{srcdir_root}/#{metaconfig}"
837
+ end
838
+
839
+ def metaconfig
840
+ 'metaconfig'
841
+ end
842
+
843
+
844
+ def exectask( task )
845
+ if task == 'show' then
846
+ exec_show
847
+ else
848
+ try task
849
+ end
850
+ end
851
+
852
+ def try( task )
853
+ $stderr.printf "#{File.basename $0}: entering %s phase...\n", task if verbose?
854
+ begin
855
+ __send__ 'exec_' + task
856
+ rescue
857
+ $stderr.printf "%s failed\n", task
858
+ raise
859
+ end
860
+ $stderr.printf "#{File.basename $0}: %s done.\n", task if verbose?
861
+ end
862
+
863
+ #
864
+ # processing arguments
865
+ #
866
+
867
+ def parsearg_global
868
+ task_re = /\A(?:#{TASKS.collect {|i| i[0] }.join '|'})\z/
869
+
870
+ while arg = ARGV.shift do
871
+ case arg
872
+ when /\A\w+\z/
873
+ task_re === arg or raise InstallError, "wrong task: #{arg}"
874
+ return arg
875
+
876
+ when '-q', '--quiet'
877
+ @options['verbose'] = false
878
+
879
+ when '--verbose'
880
+ @options['verbose'] = true
881
+
882
+ when '-h', '--help'
883
+ print_usage $stdout
884
+ exit 0
885
+
886
+ when '-v', '--version'
887
+ puts "#{File.basename $0} version #{Version}"
888
+ exit 0
889
+
890
+ when '--copyright'
891
+ puts Copyright
892
+ exit 0
893
+
894
+ else
895
+ raise InstallError, "unknown global option '#{arg}'"
896
+ end
897
+ end
898
+
899
+ raise InstallError, 'no task or global option given'
900
+ end
901
+
902
+
903
+ def parsearg_TASK( task )
904
+ mid = "parsearg_#{task}"
905
+ if respond_to? mid, true then
906
+ __send__ mid
907
+ else
908
+ ARGV.empty? or
909
+ raise InstallError, "#{task}: unknown options: #{ARGV.join ' '}"
910
+ end
911
+ end
912
+
913
+ def parsearg_config
914
+ re = /\A--(#{ConfigTable.keys.join '|'})(?:=(.*))?\z/
915
+ @options['config-opt'] = []
916
+
917
+ while i = ARGV.shift do
918
+ if /\A--?\z/ === i then
919
+ @options['config-opt'] = ARGV.dup
920
+ break
921
+ end
922
+ m = re.match(i) or raise InstallError, "config: unknown option #{i}"
923
+ name, value = m.to_a[1,2]
924
+ if value then
925
+ if ConfigTable.bool_config?(name) then
926
+ /\A(y(es)?|n(o)?|t(rue)?|f(alse))\z/i === value or raise InstallError, "config: --#{name} allows only yes/no for argument"
927
+ value = (/\Ay(es)?|\At(rue)/i === value) ? 'yes' : 'no'
928
+ end
929
+ else
930
+ ConfigTable.bool_config?(name) or raise InstallError, "config: --#{name} requires argument"
931
+ value = 'yes'
932
+ end
933
+ @config[name] = value
934
+ end
935
+ end
936
+
937
+ def parsearg_install
938
+ @options['no-harm'] = false
939
+ @options['install-prefix'] = ''
940
+ while a = ARGV.shift do
941
+ case a
942
+ when /\A--no-harm\z/
943
+ @options['no-harm'] = true
944
+ when /\A--prefix=(.*)\z/
945
+ path = $1
946
+ path = File.expand_path(path) unless path[0,1] == '/'
947
+ @options['install-prefix'] = path
948
+ else
949
+ raise InstallError, "install: unknown option #{a}"
950
+ end
951
+ end
952
+ end
953
+
954
+
955
+ def print_usage( out )
956
+ out.puts
957
+ out.puts 'Usage:'
958
+ out.puts " ruby #{File.basename $0} <global option>"
959
+ out.puts " ruby #{File.basename $0} [<global options>] <task> [<task options>]"
960
+
961
+ fmt = " %-20s %s\n"
962
+ out.puts
963
+ out.puts 'Global options:'
964
+ out.printf fmt, '-q,--quiet', 'suppress message outputs'
965
+ out.printf fmt, ' --verbose', 'output messages verbosely'
966
+ out.printf fmt, '-h,--help', 'print this message'
967
+ out.printf fmt, '-v,--version', 'print version and quit'
968
+ out.printf fmt, '--copyright', 'print copyright and quit'
969
+
970
+ out.puts
971
+ out.puts 'Tasks:'
972
+ TASKS.each do |name, desc|
973
+ out.printf " %-10s %s\n", name, desc
974
+ end
975
+
976
+ out.puts
977
+ out.puts 'Options for config:'
978
+ ConfigTable.each_definition do |name, (default, arg, desc, default2)|
979
+ out.printf " %-20s %s [%s]\n",
980
+ '--'+ name + (ConfigTable.bool_config?(name) ? '' : '='+arg),
981
+ desc,
982
+ default2 || default
983
+ end
984
+ out.printf " %-20s %s [%s]\n",
985
+ '--rbconfig=path', 'your rbconfig.rb to load', "running ruby's"
986
+
987
+ out.puts
988
+ out.puts 'Options for install:'
989
+ out.printf " %-20s %s [%s]\n",
990
+ '--no-harm', 'only display what to do if given', 'off'
991
+
992
+ out.puts
993
+ end
994
+
995
+ #
996
+ # config
997
+ #
998
+
999
+ def exec_config
1000
+ super
1001
+ @config.save
1002
+ end
1003
+
1004
+ #
1005
+ # show
1006
+ #
1007
+
1008
+ def exec_show
1009
+ ConfigTable.each_name do |k|
1010
+ v = @config.get_raw(k)
1011
+ if not v or v.empty? then
1012
+ v = '(not specified)'
1013
+ end
1014
+ printf "%-10s %s\n", k, v
1015
+ end
1016
+ end
1017
+
1018
+ end
1019
+
1020
+ ### end toplevel.rb
1021
+
1022
+ if $0 == __FILE__ then
1023
+ begin
1024
+ installer = ToplevelInstaller.new( Dir.pwd )
1025
+ installer.execute
1026
+ rescue
1027
+ raise if $DEBUG
1028
+ $stderr.puts $!.message
1029
+ $stderr.puts "try 'ruby #{$0} --help' for usage"
1030
+ exit 1
1031
+ end
1032
+ end