rails 4.1.0 → 5.2.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of rails might be problematic. Click here for more details.

Files changed (284) hide show
  1. checksums.yaml +5 -5
  2. data/README.md +33 -19
  3. metadata +65 -310
  4. data/guides/CHANGELOG.md +0 -13
  5. data/guides/Rakefile +0 -77
  6. data/guides/assets/images/akshaysurve.jpg +0 -0
  7. data/guides/assets/images/belongs_to.png +0 -0
  8. data/guides/assets/images/book_icon.gif +0 -0
  9. data/guides/assets/images/bullet.gif +0 -0
  10. data/guides/assets/images/chapters_icon.gif +0 -0
  11. data/guides/assets/images/check_bullet.gif +0 -0
  12. data/guides/assets/images/credits_pic_blank.gif +0 -0
  13. data/guides/assets/images/csrf.png +0 -0
  14. data/guides/assets/images/edge_badge.png +0 -0
  15. data/guides/assets/images/favicon.ico +0 -0
  16. data/guides/assets/images/feature_tile.gif +0 -0
  17. data/guides/assets/images/footer_tile.gif +0 -0
  18. data/guides/assets/images/fxn.png +0 -0
  19. data/guides/assets/images/getting_started/article_with_comments.png +0 -0
  20. data/guides/assets/images/getting_started/challenge.png +0 -0
  21. data/guides/assets/images/getting_started/confirm_dialog.png +0 -0
  22. data/guides/assets/images/getting_started/forbidden_attributes_for_new_article.png +0 -0
  23. data/guides/assets/images/getting_started/form_with_errors.png +0 -0
  24. data/guides/assets/images/getting_started/index_action_with_edit_link.png +0 -0
  25. data/guides/assets/images/getting_started/new_article.png +0 -0
  26. data/guides/assets/images/getting_started/rails_welcome.png +0 -0
  27. data/guides/assets/images/getting_started/routing_error_no_controller.png +0 -0
  28. data/guides/assets/images/getting_started/routing_error_no_route_matches.png +0 -0
  29. data/guides/assets/images/getting_started/show_action_for_articles.png +0 -0
  30. data/guides/assets/images/getting_started/template_is_missing_articles_new.png +0 -0
  31. data/guides/assets/images/getting_started/unknown_action_create_for_articles.png +0 -0
  32. data/guides/assets/images/getting_started/unknown_action_new_for_articles.png +0 -0
  33. data/guides/assets/images/grey_bullet.gif +0 -0
  34. data/guides/assets/images/habtm.png +0 -0
  35. data/guides/assets/images/has_many.png +0 -0
  36. data/guides/assets/images/has_many_through.png +0 -0
  37. data/guides/assets/images/has_one.png +0 -0
  38. data/guides/assets/images/has_one_through.png +0 -0
  39. data/guides/assets/images/header_backdrop.png +0 -0
  40. data/guides/assets/images/header_tile.gif +0 -0
  41. data/guides/assets/images/i18n/demo_html_safe.png +0 -0
  42. data/guides/assets/images/i18n/demo_localized_pirate.png +0 -0
  43. data/guides/assets/images/i18n/demo_translated_en.png +0 -0
  44. data/guides/assets/images/i18n/demo_translated_pirate.png +0 -0
  45. data/guides/assets/images/i18n/demo_translation_missing.png +0 -0
  46. data/guides/assets/images/i18n/demo_untranslated.png +0 -0
  47. data/guides/assets/images/icons/README +0 -5
  48. data/guides/assets/images/icons/callouts/1.png +0 -0
  49. data/guides/assets/images/icons/callouts/10.png +0 -0
  50. data/guides/assets/images/icons/callouts/11.png +0 -0
  51. data/guides/assets/images/icons/callouts/12.png +0 -0
  52. data/guides/assets/images/icons/callouts/13.png +0 -0
  53. data/guides/assets/images/icons/callouts/14.png +0 -0
  54. data/guides/assets/images/icons/callouts/15.png +0 -0
  55. data/guides/assets/images/icons/callouts/2.png +0 -0
  56. data/guides/assets/images/icons/callouts/3.png +0 -0
  57. data/guides/assets/images/icons/callouts/4.png +0 -0
  58. data/guides/assets/images/icons/callouts/5.png +0 -0
  59. data/guides/assets/images/icons/callouts/6.png +0 -0
  60. data/guides/assets/images/icons/callouts/7.png +0 -0
  61. data/guides/assets/images/icons/callouts/8.png +0 -0
  62. data/guides/assets/images/icons/callouts/9.png +0 -0
  63. data/guides/assets/images/icons/caution.png +0 -0
  64. data/guides/assets/images/icons/example.png +0 -0
  65. data/guides/assets/images/icons/home.png +0 -0
  66. data/guides/assets/images/icons/important.png +0 -0
  67. data/guides/assets/images/icons/next.png +0 -0
  68. data/guides/assets/images/icons/note.png +0 -0
  69. data/guides/assets/images/icons/prev.png +0 -0
  70. data/guides/assets/images/icons/tip.png +0 -0
  71. data/guides/assets/images/icons/up.png +0 -0
  72. data/guides/assets/images/icons/warning.png +0 -0
  73. data/guides/assets/images/nav_arrow.gif +0 -0
  74. data/guides/assets/images/oscardelben.jpg +0 -0
  75. data/guides/assets/images/polymorphic.png +0 -0
  76. data/guides/assets/images/radar.png +0 -0
  77. data/guides/assets/images/rails4_features.png +0 -0
  78. data/guides/assets/images/rails_guides_kindle_cover.jpg +0 -0
  79. data/guides/assets/images/rails_guides_logo.gif +0 -0
  80. data/guides/assets/images/rails_logo_remix.gif +0 -0
  81. data/guides/assets/images/session_fixation.png +0 -0
  82. data/guides/assets/images/tab_grey.gif +0 -0
  83. data/guides/assets/images/tab_info.gif +0 -0
  84. data/guides/assets/images/tab_note.gif +0 -0
  85. data/guides/assets/images/tab_red.gif +0 -0
  86. data/guides/assets/images/tab_yellow.gif +0 -0
  87. data/guides/assets/images/tab_yellow.png +0 -0
  88. data/guides/assets/images/vijaydev.jpg +0 -0
  89. data/guides/assets/javascripts/guides.js +0 -53
  90. data/guides/assets/javascripts/jquery.min.js +0 -4
  91. data/guides/assets/javascripts/responsive-tables.js +0 -43
  92. data/guides/assets/javascripts/syntaxhighlighter/shBrushAS3.js +0 -59
  93. data/guides/assets/javascripts/syntaxhighlighter/shBrushAppleScript.js +0 -75
  94. data/guides/assets/javascripts/syntaxhighlighter/shBrushBash.js +0 -59
  95. data/guides/assets/javascripts/syntaxhighlighter/shBrushCSharp.js +0 -65
  96. data/guides/assets/javascripts/syntaxhighlighter/shBrushColdFusion.js +0 -100
  97. data/guides/assets/javascripts/syntaxhighlighter/shBrushCpp.js +0 -97
  98. data/guides/assets/javascripts/syntaxhighlighter/shBrushCss.js +0 -91
  99. data/guides/assets/javascripts/syntaxhighlighter/shBrushDelphi.js +0 -55
  100. data/guides/assets/javascripts/syntaxhighlighter/shBrushDiff.js +0 -41
  101. data/guides/assets/javascripts/syntaxhighlighter/shBrushErlang.js +0 -52
  102. data/guides/assets/javascripts/syntaxhighlighter/shBrushGroovy.js +0 -67
  103. data/guides/assets/javascripts/syntaxhighlighter/shBrushJScript.js +0 -52
  104. data/guides/assets/javascripts/syntaxhighlighter/shBrushJava.js +0 -57
  105. data/guides/assets/javascripts/syntaxhighlighter/shBrushJavaFX.js +0 -58
  106. data/guides/assets/javascripts/syntaxhighlighter/shBrushPerl.js +0 -72
  107. data/guides/assets/javascripts/syntaxhighlighter/shBrushPhp.js +0 -88
  108. data/guides/assets/javascripts/syntaxhighlighter/shBrushPlain.js +0 -33
  109. data/guides/assets/javascripts/syntaxhighlighter/shBrushPowerShell.js +0 -74
  110. data/guides/assets/javascripts/syntaxhighlighter/shBrushPython.js +0 -64
  111. data/guides/assets/javascripts/syntaxhighlighter/shBrushRuby.js +0 -55
  112. data/guides/assets/javascripts/syntaxhighlighter/shBrushSass.js +0 -94
  113. data/guides/assets/javascripts/syntaxhighlighter/shBrushScala.js +0 -51
  114. data/guides/assets/javascripts/syntaxhighlighter/shBrushSql.js +0 -66
  115. data/guides/assets/javascripts/syntaxhighlighter/shBrushVb.js +0 -56
  116. data/guides/assets/javascripts/syntaxhighlighter/shBrushXml.js +0 -69
  117. data/guides/assets/javascripts/syntaxhighlighter/shCore.js +0 -17
  118. data/guides/assets/stylesheets/fixes.css +0 -16
  119. data/guides/assets/stylesheets/kindle.css +0 -11
  120. data/guides/assets/stylesheets/main.css +0 -710
  121. data/guides/assets/stylesheets/print.css +0 -52
  122. data/guides/assets/stylesheets/reset.css +0 -43
  123. data/guides/assets/stylesheets/responsive-tables.css +0 -50
  124. data/guides/assets/stylesheets/style.css +0 -13
  125. data/guides/assets/stylesheets/syntaxhighlighter/shCore.css +0 -226
  126. data/guides/assets/stylesheets/syntaxhighlighter/shCoreDefault.css +0 -328
  127. data/guides/assets/stylesheets/syntaxhighlighter/shCoreDjango.css +0 -331
  128. data/guides/assets/stylesheets/syntaxhighlighter/shCoreEclipse.css +0 -339
  129. data/guides/assets/stylesheets/syntaxhighlighter/shCoreEmacs.css +0 -324
  130. data/guides/assets/stylesheets/syntaxhighlighter/shCoreFadeToGrey.css +0 -328
  131. data/guides/assets/stylesheets/syntaxhighlighter/shCoreMDUltra.css +0 -324
  132. data/guides/assets/stylesheets/syntaxhighlighter/shCoreMidnight.css +0 -324
  133. data/guides/assets/stylesheets/syntaxhighlighter/shCoreRDark.css +0 -324
  134. data/guides/assets/stylesheets/syntaxhighlighter/shThemeDefault.css +0 -117
  135. data/guides/assets/stylesheets/syntaxhighlighter/shThemeDjango.css +0 -120
  136. data/guides/assets/stylesheets/syntaxhighlighter/shThemeEclipse.css +0 -128
  137. data/guides/assets/stylesheets/syntaxhighlighter/shThemeEmacs.css +0 -113
  138. data/guides/assets/stylesheets/syntaxhighlighter/shThemeFadeToGrey.css +0 -117
  139. data/guides/assets/stylesheets/syntaxhighlighter/shThemeMDUltra.css +0 -113
  140. data/guides/assets/stylesheets/syntaxhighlighter/shThemeMidnight.css +0 -113
  141. data/guides/assets/stylesheets/syntaxhighlighter/shThemeRDark.css +0 -113
  142. data/guides/assets/stylesheets/syntaxhighlighter/shThemeRailsGuides.css +0 -116
  143. data/guides/bug_report_templates/action_controller_gem.rb +0 -47
  144. data/guides/bug_report_templates/action_controller_master.rb +0 -53
  145. data/guides/bug_report_templates/active_record_gem.rb +0 -40
  146. data/guides/bug_report_templates/active_record_master.rb +0 -49
  147. data/guides/code/getting_started/Gemfile +0 -40
  148. data/guides/code/getting_started/Gemfile.lock +0 -126
  149. data/guides/code/getting_started/README.rdoc +0 -28
  150. data/guides/code/getting_started/Rakefile +0 -6
  151. data/guides/code/getting_started/app/assets/javascripts/application.js +0 -15
  152. data/guides/code/getting_started/app/assets/javascripts/comments.js.coffee +0 -3
  153. data/guides/code/getting_started/app/assets/javascripts/posts.js.coffee +0 -3
  154. data/guides/code/getting_started/app/assets/javascripts/welcome.js.coffee +0 -3
  155. data/guides/code/getting_started/app/assets/stylesheets/application.css +0 -13
  156. data/guides/code/getting_started/app/assets/stylesheets/comments.css.scss +0 -3
  157. data/guides/code/getting_started/app/assets/stylesheets/posts.css.scss +0 -3
  158. data/guides/code/getting_started/app/assets/stylesheets/welcome.css.scss +0 -3
  159. data/guides/code/getting_started/app/controllers/application_controller.rb +0 -5
  160. data/guides/code/getting_started/app/controllers/comments_controller.rb +0 -23
  161. data/guides/code/getting_started/app/controllers/posts_controller.rb +0 -53
  162. data/guides/code/getting_started/app/controllers/welcome_controller.rb +0 -4
  163. data/guides/code/getting_started/app/helpers/application_helper.rb +0 -2
  164. data/guides/code/getting_started/app/helpers/comments_helper.rb +0 -2
  165. data/guides/code/getting_started/app/helpers/posts_helper.rb +0 -2
  166. data/guides/code/getting_started/app/helpers/welcome_helper.rb +0 -2
  167. data/guides/code/getting_started/app/models/comment.rb +0 -3
  168. data/guides/code/getting_started/app/models/post.rb +0 -7
  169. data/guides/code/getting_started/app/views/comments/_comment.html.erb +0 -15
  170. data/guides/code/getting_started/app/views/comments/_form.html.erb +0 -13
  171. data/guides/code/getting_started/app/views/layouts/application.html.erb +0 -14
  172. data/guides/code/getting_started/app/views/posts/_form.html.erb +0 -27
  173. data/guides/code/getting_started/app/views/posts/edit.html.erb +0 -5
  174. data/guides/code/getting_started/app/views/posts/index.html.erb +0 -21
  175. data/guides/code/getting_started/app/views/posts/new.html.erb +0 -5
  176. data/guides/code/getting_started/app/views/posts/show.html.erb +0 -18
  177. data/guides/code/getting_started/app/views/welcome/index.html.erb +0 -4
  178. data/guides/code/getting_started/bin/bundle +0 -4
  179. data/guides/code/getting_started/bin/rails +0 -4
  180. data/guides/code/getting_started/bin/rake +0 -4
  181. data/guides/code/getting_started/config.ru +0 -4
  182. data/guides/code/getting_started/config/application.rb +0 -18
  183. data/guides/code/getting_started/config/boot.rb +0 -4
  184. data/guides/code/getting_started/config/database.yml +0 -25
  185. data/guides/code/getting_started/config/environment.rb +0 -5
  186. data/guides/code/getting_started/config/environments/development.rb +0 -30
  187. data/guides/code/getting_started/config/environments/production.rb +0 -80
  188. data/guides/code/getting_started/config/environments/test.rb +0 -36
  189. data/guides/code/getting_started/config/initializers/backtrace_silencers.rb +0 -7
  190. data/guides/code/getting_started/config/initializers/filter_parameter_logging.rb +0 -4
  191. data/guides/code/getting_started/config/initializers/inflections.rb +0 -16
  192. data/guides/code/getting_started/config/initializers/locale.rb +0 -9
  193. data/guides/code/getting_started/config/initializers/mime_types.rb +0 -5
  194. data/guides/code/getting_started/config/initializers/secret_token.rb +0 -12
  195. data/guides/code/getting_started/config/initializers/session_store.rb +0 -3
  196. data/guides/code/getting_started/config/initializers/wrap_parameters.rb +0 -14
  197. data/guides/code/getting_started/config/locales/en.yml +0 -23
  198. data/guides/code/getting_started/config/routes.rb +0 -7
  199. data/guides/code/getting_started/db/migrate/20130122042648_create_posts.rb +0 -10
  200. data/guides/code/getting_started/db/migrate/20130122045842_create_comments.rb +0 -11
  201. data/guides/code/getting_started/db/schema.rb +0 -33
  202. data/guides/code/getting_started/db/seeds.rb +0 -7
  203. data/guides/code/getting_started/public/404.html +0 -60
  204. data/guides/code/getting_started/public/422.html +0 -60
  205. data/guides/code/getting_started/public/500.html +0 -59
  206. data/guides/code/getting_started/public/favicon.ico +0 -0
  207. data/guides/code/getting_started/public/robots.txt +0 -5
  208. data/guides/code/getting_started/test/controllers/comments_controller_test.rb +0 -7
  209. data/guides/code/getting_started/test/controllers/posts_controller_test.rb +0 -7
  210. data/guides/code/getting_started/test/controllers/welcome_controller_test.rb +0 -9
  211. data/guides/code/getting_started/test/fixtures/comments.yml +0 -11
  212. data/guides/code/getting_started/test/fixtures/posts.yml +0 -9
  213. data/guides/code/getting_started/test/helpers/comments_helper_test.rb +0 -4
  214. data/guides/code/getting_started/test/helpers/posts_helper_test.rb +0 -4
  215. data/guides/code/getting_started/test/helpers/welcome_helper_test.rb +0 -4
  216. data/guides/code/getting_started/test/models/comment_test.rb +0 -7
  217. data/guides/code/getting_started/test/models/post_test.rb +0 -7
  218. data/guides/code/getting_started/test/test_helper.rb +0 -15
  219. data/guides/rails_guides.rb +0 -63
  220. data/guides/rails_guides/generator.rb +0 -248
  221. data/guides/rails_guides/helpers.rb +0 -53
  222. data/guides/rails_guides/indexer.rb +0 -68
  223. data/guides/rails_guides/kindle.rb +0 -119
  224. data/guides/rails_guides/levenshtein.rb +0 -31
  225. data/guides/rails_guides/markdown.rb +0 -163
  226. data/guides/rails_guides/markdown/renderer.rb +0 -82
  227. data/guides/source/2_2_release_notes.md +0 -435
  228. data/guides/source/2_3_release_notes.md +0 -621
  229. data/guides/source/3_0_release_notes.md +0 -611
  230. data/guides/source/3_1_release_notes.md +0 -556
  231. data/guides/source/3_2_release_notes.md +0 -565
  232. data/guides/source/4_0_release_notes.md +0 -276
  233. data/guides/source/4_1_release_notes.md +0 -731
  234. data/guides/source/_license.html.erb +0 -2
  235. data/guides/source/_welcome.html.erb +0 -22
  236. data/guides/source/action_controller_overview.md +0 -1175
  237. data/guides/source/action_mailer_basics.md +0 -689
  238. data/guides/source/action_view_overview.md +0 -1610
  239. data/guides/source/active_model_basics.md +0 -200
  240. data/guides/source/active_record_basics.md +0 -373
  241. data/guides/source/active_record_callbacks.md +0 -410
  242. data/guides/source/active_record_querying.md +0 -1771
  243. data/guides/source/active_record_validations.md +0 -1169
  244. data/guides/source/active_support_core_extensions.md +0 -3864
  245. data/guides/source/active_support_instrumentation.md +0 -496
  246. data/guides/source/api_documentation_guidelines.md +0 -281
  247. data/guides/source/asset_pipeline.md +0 -1163
  248. data/guides/source/association_basics.md +0 -2229
  249. data/guides/source/caching_with_rails.md +0 -354
  250. data/guides/source/command_line.md +0 -603
  251. data/guides/source/configuring.md +0 -942
  252. data/guides/source/contributing_to_ruby_on_rails.md +0 -544
  253. data/guides/source/credits.html.erb +0 -80
  254. data/guides/source/debugging_rails_applications.md +0 -707
  255. data/guides/source/development_dependencies_install.md +0 -278
  256. data/guides/source/documents.yaml +0 -194
  257. data/guides/source/engines.md +0 -1391
  258. data/guides/source/form_helpers.md +0 -1001
  259. data/guides/source/generators.md +0 -663
  260. data/guides/source/getting_started.md +0 -1947
  261. data/guides/source/i18n.md +0 -1043
  262. data/guides/source/index.html.erb +0 -27
  263. data/guides/source/initialization.md +0 -657
  264. data/guides/source/kindle/copyright.html.erb +0 -1
  265. data/guides/source/kindle/layout.html.erb +0 -27
  266. data/guides/source/kindle/rails_guides.opf.erb +0 -52
  267. data/guides/source/kindle/toc.html.erb +0 -24
  268. data/guides/source/kindle/toc.ncx.erb +0 -64
  269. data/guides/source/kindle/welcome.html.erb +0 -5
  270. data/guides/source/layout.html.erb +0 -146
  271. data/guides/source/layouts_and_rendering.md +0 -1226
  272. data/guides/source/maintenance_policy.md +0 -56
  273. data/guides/source/migrations.md +0 -1108
  274. data/guides/source/nested_model_forms.md +0 -225
  275. data/guides/source/plugins.md +0 -444
  276. data/guides/source/rails_application_templates.md +0 -248
  277. data/guides/source/rails_on_rack.md +0 -333
  278. data/guides/source/routing.md +0 -1115
  279. data/guides/source/ruby_on_rails_guides_guidelines.md +0 -128
  280. data/guides/source/security.md +0 -1018
  281. data/guides/source/testing.md +0 -1057
  282. data/guides/source/upgrading_ruby_on_rails.md +0 -890
  283. data/guides/source/working_with_javascript_in_rails.md +0 -405
  284. data/guides/w3c_validator.rb +0 -95
@@ -1,53 +0,0 @@
1
- require 'yaml'
2
-
3
- module RailsGuides
4
- module Helpers
5
- def guide(name, url, options = {}, &block)
6
- link = content_tag(:a, :href => url) { name }
7
- result = content_tag(:dt, link)
8
-
9
- if options[:work_in_progress]
10
- result << content_tag(:dd, 'Work in progress', :class => 'work-in-progress')
11
- end
12
-
13
- result << content_tag(:dd, capture(&block))
14
- result
15
- end
16
-
17
- def documents_by_section
18
- @documents_by_section ||= YAML.load_file(File.expand_path('../../source/documents.yaml', __FILE__))
19
- end
20
-
21
- def documents_flat
22
- documents_by_section.flat_map {|section| section['documents']}
23
- end
24
-
25
- def finished_documents(documents)
26
- documents.reject { |document| document['work_in_progress'] }
27
- end
28
-
29
- def docs_for_menu(position=nil)
30
- if position.nil?
31
- documents_by_section
32
- elsif position == 'L'
33
- documents_by_section.to(3)
34
- else
35
- documents_by_section.from(4)
36
- end
37
- end
38
-
39
- def author(name, nick, image = 'credits_pic_blank.gif', &block)
40
- image = "images/#{image}"
41
-
42
- result = content_tag(:img, nil, :src => image, :class => 'left pic', :alt => name, :width => 91, :height => 91)
43
- result << content_tag(:h3, name)
44
- result << content_tag(:p, capture(&block))
45
- content_tag(:div, result, :class => 'clearfix', :id => nick)
46
- end
47
-
48
- def code(&block)
49
- c = capture(&block)
50
- content_tag(:code, c)
51
- end
52
- end
53
- end
@@ -1,68 +0,0 @@
1
- require 'active_support/core_ext/object/blank'
2
- require 'active_support/core_ext/string/inflections'
3
-
4
- module RailsGuides
5
- class Indexer
6
- attr_reader :body, :result, :warnings, :level_hash
7
-
8
- def initialize(body, warnings)
9
- @body = body
10
- @result = @body.dup
11
- @warnings = warnings
12
- end
13
-
14
- def index
15
- @level_hash = process(body)
16
- end
17
-
18
- private
19
-
20
- def process(string, current_level=3, counters=[1])
21
- s = StringScanner.new(string)
22
-
23
- level_hash = {}
24
-
25
- while !s.eos?
26
- re = %r{^h(\d)(?:\((#.*?)\))?\s*\.\s*(.*)$}
27
- s.match?(re)
28
- if matched = s.matched
29
- matched =~ re
30
- level, idx, title = $1.to_i, $2, $3.strip
31
-
32
- if level < current_level
33
- # This is needed. Go figure.
34
- return level_hash
35
- elsif level == current_level
36
- index = counters.join(".")
37
- idx ||= '#' + title_to_idx(title)
38
-
39
- raise "Parsing Fail" unless @result.sub!(matched, "h#{level}(#{idx}). #{index} #{title}")
40
-
41
- key = {
42
- :title => title,
43
- :id => idx
44
- }
45
- # Recurse
46
- counters << 1
47
- level_hash[key] = process(s.post_match, current_level + 1, counters)
48
- counters.pop
49
-
50
- # Increment the current level
51
- last = counters.pop
52
- counters << last + 1
53
- end
54
- end
55
- s.getch
56
- end
57
- level_hash
58
- end
59
-
60
- def title_to_idx(title)
61
- idx = title.strip.parameterize.sub(/^\d+/, '')
62
- if warnings && idx.blank?
63
- puts "BLANK ID: please put an explicit ID for section #{title}, as in h5(#my-id)"
64
- end
65
- idx
66
- end
67
- end
68
- end
@@ -1,119 +0,0 @@
1
- #!/usr/bin/env ruby
2
-
3
- unless `which kindlerb`
4
- abort "Please gem install kindlerb"
5
- end
6
-
7
- require 'nokogiri'
8
- require 'fileutils'
9
- require 'yaml'
10
- require 'date'
11
-
12
- module Kindle
13
- extend self
14
-
15
- def generate(output_dir, mobi_outfile, logfile)
16
- output_dir = File.absolute_path(output_dir)
17
- Dir.chdir output_dir do
18
- puts "=> Using output dir: #{output_dir}"
19
- puts "=> Arranging html pages in document order"
20
- toc = File.read("toc.ncx")
21
- doc = Nokogiri::XML(toc).xpath("//ncx:content", 'ncx' => "http://www.daisy.org/z3986/2005/ncx/")
22
- html_pages = doc.select {|c| c[:src]}.map {|c| c[:src]}.uniq
23
-
24
- generate_front_matter(html_pages)
25
-
26
- generate_sections(html_pages)
27
-
28
- generate_document_metadata(mobi_outfile)
29
-
30
- puts "Creating MOBI document with kindlegen. This make take a while."
31
- cmd = "kindlerb . > #{File.absolute_path logfile} 2>&1"
32
- puts cmd
33
- system(cmd)
34
- puts "MOBI document generated at #{File.expand_path(mobi_outfile, output_dir)}"
35
- end
36
- end
37
-
38
- def generate_front_matter(html_pages)
39
- frontmatter = []
40
- html_pages.delete_if {|x|
41
- if x =~ /(toc|welcome|credits|copyright).html/
42
- frontmatter << x unless x =~ /toc/
43
- true
44
- end
45
- }
46
- html = frontmatter.map {|x|
47
- Nokogiri::HTML(File.open(x)).at("body").inner_html
48
- }.join("\n")
49
-
50
- fdoc = Nokogiri::HTML(html)
51
- fdoc.search("h3").each do |h3|
52
- h3.name = 'h4'
53
- end
54
- fdoc.search("h2").each do |h2|
55
- h2.name = 'h3'
56
- h2['id'] = h2.inner_text.gsub(/\s/, '-')
57
- end
58
- add_head_section fdoc, "Front Matter"
59
- File.open("frontmatter.html",'w') {|f| f.puts fdoc.to_html}
60
- html_pages.unshift "frontmatter.html"
61
- end
62
-
63
- def generate_sections(html_pages)
64
- FileUtils::rm_rf("sections/")
65
- html_pages.each_with_index do |page, section_idx|
66
- FileUtils::mkdir_p("sections/%03d" % section_idx)
67
- doc = Nokogiri::HTML(File.open(page))
68
- title = doc.at("title").inner_text.gsub("Ruby on Rails Guides: ", '')
69
- title = page.capitalize.gsub('.html', '') if title.strip == ''
70
- File.open("sections/%03d/_section.txt" % section_idx, 'w') {|f| f.puts title}
71
- doc.xpath("//h3[@id]").each_with_index do |h3,item_idx|
72
- subsection = h3.inner_text
73
- content = h3.xpath("./following-sibling::*").take_while {|x| x.name != "h3"}.map {|x| x.to_html}
74
- item = Nokogiri::HTML(h3.to_html + content.join("\n"))
75
- item_path = "sections/%03d/%03d.html" % [section_idx, item_idx]
76
- add_head_section(item, subsection)
77
- item.search("img").each do |img|
78
- img['src'] = "#{Dir.pwd}/#{img['src']}"
79
- end
80
- item.xpath("//li/p").each {|p| p.swap(p.children); p.remove}
81
- File.open(item_path, 'w') {|f| f.puts item.to_html}
82
- end
83
- end
84
- end
85
-
86
- def generate_document_metadata(mobi_outfile)
87
- puts "=> Generating _document.yml"
88
- x = Nokogiri::XML(File.open("rails_guides.opf")).remove_namespaces!
89
- cover_jpg = "#{Dir.pwd}/images/rails_guides_kindle_cover.jpg"
90
- cover_gif = cover_jpg.sub(/jpg$/, 'gif')
91
- puts `convert #{cover_jpg} #{cover_gif}`
92
- document = {
93
- 'doc_uuid' => x.at("package")['unique-identifier'],
94
- 'title' => x.at("title").inner_text.gsub(/\(.*$/, " v2"),
95
- 'publisher' => x.at("publisher").inner_text,
96
- 'author' => x.at("creator").inner_text,
97
- 'subject' => x.at("subject").inner_text,
98
- 'date' => x.at("date").inner_text,
99
- 'cover' => cover_gif,
100
- 'masthead' => nil,
101
- 'mobi_outfile' => mobi_outfile
102
- }
103
- puts document.to_yaml
104
- File.open("_document.yml", 'w'){|f| f.puts document.to_yaml}
105
- end
106
-
107
- def add_head_section(doc, title)
108
- head = Nokogiri::XML::Node.new "head", doc
109
- title_node = Nokogiri::XML::Node.new "title", doc
110
- title_node.content = title
111
- title_node.parent = head
112
- css = Nokogiri::XML::Node.new "link", doc
113
- css['rel'] = 'stylesheet'
114
- css['type'] = 'text/css'
115
- css['href'] = "#{Dir.pwd}/stylesheets/kindle.css"
116
- css.parent = head
117
- doc.at("body").before head
118
- end
119
- end
@@ -1,31 +0,0 @@
1
- module RailsGuides
2
- module Levenshtein
3
- # Based on the pseudocode in http://en.wikipedia.org/wiki/Levenshtein_distance
4
- def self.distance(s1, s2)
5
- s = s1.unpack('U*')
6
- t = s2.unpack('U*')
7
- m = s.length
8
- n = t.length
9
-
10
- # matrix initialization
11
- d = []
12
- 0.upto(m) { |i| d << [i] }
13
- 0.upto(n) { |j| d[0][j] = j }
14
-
15
- # distance computation
16
- 1.upto(m) do |i|
17
- 1.upto(n) do |j|
18
- cost = s[i] == t[j] ? 0 : 1
19
- d[i][j] = [
20
- d[i-1][j] + 1, # deletion
21
- d[i][j-1] + 1, # insertion
22
- d[i-1][j-1] + cost, # substitution
23
- ].min
24
- end
25
- end
26
-
27
- # all done
28
- return d[m][n]
29
- end
30
- end
31
- end
@@ -1,163 +0,0 @@
1
- # encoding: utf-8
2
-
3
- require 'redcarpet'
4
- require 'nokogiri'
5
- require 'rails_guides/markdown/renderer'
6
-
7
- module RailsGuides
8
- class Markdown
9
- def initialize(view, layout)
10
- @view = view
11
- @layout = layout
12
- @index_counter = Hash.new(0)
13
- @raw_header = ''
14
- @node_ids = {}
15
- end
16
-
17
- def render(body)
18
- @raw_body = body
19
- extract_raw_header_and_body
20
- generate_header
21
- generate_title
22
- generate_body
23
- generate_structure
24
- generate_index
25
- render_page
26
- end
27
-
28
- private
29
-
30
- def dom_id(nodes)
31
- dom_id = dom_id_text(nodes.last.text)
32
-
33
- # Fix duplicate node by prefix with its parent node
34
- if @node_ids[dom_id]
35
- if @node_ids[dom_id].size > 1
36
- duplicate_nodes = @node_ids.delete(dom_id)
37
- new_node_id = "#{duplicate_nodes[-2][:id]}-#{duplicate_nodes.last[:id]}"
38
- duplicate_nodes.last[:id] = new_node_id
39
- @node_ids[new_node_id] = duplicate_nodes
40
- end
41
-
42
- dom_id = "#{nodes[-2][:id]}-#{dom_id}"
43
- end
44
-
45
- @node_ids[dom_id] = nodes
46
- dom_id
47
- end
48
-
49
- def dom_id_text(text)
50
- text.downcase.gsub(/\?/, '-questionmark').gsub(/!/, '-bang').gsub(/[^a-z0-9]+/, ' ')
51
- .strip.gsub(/\s+/, '-')
52
- end
53
-
54
- def engine
55
- @engine ||= Redcarpet::Markdown.new(Renderer, {
56
- no_intra_emphasis: true,
57
- fenced_code_blocks: true,
58
- autolink: true,
59
- strikethrough: true,
60
- superscript: true,
61
- tables: true
62
- })
63
- end
64
-
65
- def extract_raw_header_and_body
66
- if @raw_body =~ /^\-{40,}$/
67
- @raw_header, _, @raw_body = @raw_body.partition(/^\-{40,}$/).map(&:strip)
68
- end
69
- end
70
-
71
- def generate_body
72
- @body = engine.render(@raw_body)
73
- end
74
-
75
- def generate_header
76
- @header = engine.render(@raw_header).html_safe
77
- end
78
-
79
- def generate_structure
80
- @headings_for_index = []
81
- if @body.present?
82
- @body = Nokogiri::HTML(@body).tap do |doc|
83
- hierarchy = []
84
-
85
- doc.at('body').children.each do |node|
86
- if node.name =~ /^h[3-6]$/
87
- case node.name
88
- when 'h3'
89
- hierarchy = [node]
90
- @headings_for_index << [1, node, node.inner_html]
91
- when 'h4'
92
- hierarchy = hierarchy[0, 1] + [node]
93
- @headings_for_index << [2, node, node.inner_html]
94
- when 'h5'
95
- hierarchy = hierarchy[0, 2] + [node]
96
- when 'h6'
97
- hierarchy = hierarchy[0, 3] + [node]
98
- end
99
-
100
- node[:id] = dom_id(hierarchy)
101
- node.inner_html = "#{node_index(hierarchy)} #{node.inner_html}"
102
- end
103
- end
104
- end.to_html
105
- end
106
- end
107
-
108
- def generate_index
109
- if @headings_for_index.present?
110
- raw_index = ''
111
- @headings_for_index.each do |level, node, label|
112
- if level == 1
113
- raw_index += "1. [#{label}](##{node[:id]})\n"
114
- elsif level == 2
115
- raw_index += " * [#{label}](##{node[:id]})\n"
116
- end
117
- end
118
-
119
- @index = Nokogiri::HTML(engine.render(raw_index)).tap do |doc|
120
- doc.at('ol')[:class] = 'chapters'
121
- end.to_html
122
-
123
- @index = <<-INDEX.html_safe
124
- <div id="subCol">
125
- <h3 class="chapter"><img src="images/chapters_icon.gif" alt="" />Chapters</h3>
126
- #{@index}
127
- </div>
128
- INDEX
129
- end
130
- end
131
-
132
- def generate_title
133
- if heading = Nokogiri::HTML(@header).at(:h2)
134
- @title = "#{heading.text} — Ruby on Rails Guides".html_safe
135
- else
136
- @title = "Ruby on Rails Guides"
137
- end
138
- end
139
-
140
- def node_index(hierarchy)
141
- case hierarchy.size
142
- when 1
143
- @index_counter[2] = @index_counter[3] = @index_counter[4] = 0
144
- "#{@index_counter[1] += 1}"
145
- when 2
146
- @index_counter[3] = @index_counter[4] = 0
147
- "#{@index_counter[1]}.#{@index_counter[2] += 1}"
148
- when 3
149
- @index_counter[4] = 0
150
- "#{@index_counter[1]}.#{@index_counter[2]}.#{@index_counter[3] += 1}"
151
- when 4
152
- "#{@index_counter[1]}.#{@index_counter[2]}.#{@index_counter[3]}.#{@index_counter[4] += 1}"
153
- end
154
- end
155
-
156
- def render_page
157
- @view.content_for(:header_section) { @header }
158
- @view.content_for(:page_title) { @title }
159
- @view.content_for(:index_section) { @index }
160
- @view.render(:layout => @layout, :text => @body)
161
- end
162
- end
163
- end
@@ -1,82 +0,0 @@
1
- module RailsGuides
2
- class Markdown
3
- class Renderer < Redcarpet::Render::HTML
4
- def initialize(options={})
5
- super
6
- end
7
-
8
- def block_code(code, language)
9
- <<-HTML
10
- <div class="code_container">
11
- <pre class="brush: #{brush_for(language)}; gutter: false; toolbar: false">
12
- #{ERB::Util.h(code)}
13
- </pre>
14
- </div>
15
- HTML
16
- end
17
-
18
- def header(text, header_level)
19
- # Always increase the heading level by, so we can use h1, h2 heading in the document
20
- header_level += 1
21
-
22
- %(<h#{header_level}>#{text}</h#{header_level}>)
23
- end
24
-
25
- def paragraph(text)
26
- if text =~ /^(TIP|IMPORTANT|CAUTION|WARNING|NOTE|INFO|TODO)[.:](.*?)/
27
- convert_notes(text)
28
- elsif text =~ /^\[<sup>(\d+)\]:<\/sup> (.+)$/
29
- linkback = %(<a href="#footnote-#{$1}-ref"><sup>#{$1}</sup></a>)
30
- %(<p class="footnote" id="footnote-#{$1}">#{linkback} #{$2}</p>)
31
- else
32
- text = convert_footnotes(text)
33
- "<p>#{text}</p>"
34
- end
35
- end
36
-
37
- private
38
-
39
- def convert_footnotes(text)
40
- text.gsub(/\[<sup>(\d+)\]<\/sup>/i) do
41
- %(<sup class="footnote" id="footnote-#{$1}-ref">) +
42
- %(<a href="#footnote-#{$1}">#{$1}</a></sup>)
43
- end
44
- end
45
-
46
- def brush_for(code_type)
47
- case code_type
48
- when 'ruby', 'sql', 'plain'
49
- code_type
50
- when 'erb'
51
- 'ruby; html-script: true'
52
- when 'html'
53
- 'xml' # html is understood, but there are .xml rules in the CSS
54
- else
55
- 'plain'
56
- end
57
- end
58
-
59
- def convert_notes(body)
60
- # The following regexp detects special labels followed by a
61
- # paragraph, perhaps at the end of the document.
62
- #
63
- # It is important that we do not eat more than one newline
64
- # because formatting may be wrong otherwise. For example,
65
- # if a bulleted list follows the first item is not rendered
66
- # as a list item, but as a paragraph starting with a plain
67
- # asterisk.
68
- body.gsub(/^(TIP|IMPORTANT|CAUTION|WARNING|NOTE|INFO|TODO)[.:](.*?)(\n(?=\n)|\Z)/m) do
69
- css_class = case $1
70
- when 'CAUTION', 'IMPORTANT'
71
- 'warning'
72
- when 'TIP'
73
- 'info'
74
- else
75
- $1.downcase
76
- end
77
- %(<div class="#{css_class}"><p>#{$2.strip}</p></div>)
78
- end
79
- end
80
- end
81
- end
82
- end