diff options
Diffstat (limited to 'railties/guides/rails_guides')
-rw-r--r-- | railties/guides/rails_guides/generator.rb | 129 | ||||
-rw-r--r-- | railties/guides/rails_guides/textile_extensions.rb | 6 |
2 files changed, 82 insertions, 53 deletions
diff --git a/railties/guides/rails_guides/generator.rb b/railties/guides/rails_guides/generator.rb index bd25111405..670d2bc4db 100644 --- a/railties/guides/rails_guides/generator.rb +++ b/railties/guides/rails_guides/generator.rb @@ -1,70 +1,95 @@ require 'set' +require 'fileutils' -class String - def html_safe! - self - end unless "post 9415935902f120a9bac0bfce7129725a0db38ed3".respond_to?(:html_safe!) -end +require 'active_support/core_ext/string/output_safety' +require 'action_controller' +require 'action_view' + +require 'rails_guides/indexer' +require 'rails_guides/helpers' +require 'rails_guides/levenshtein' module RailsGuides class Generator - attr_reader :output, :view_path, :view, :guides_dir - - def initialize(output = nil) - @guides_dir = File.join(File.dirname(__FILE__), '..') - - @output = output || File.join(@guides_dir, "output") + attr_reader :guides_dir, :source_dir, :output_dir - unless ENV["ONLY"] - FileUtils.rm_r(@output) if File.directory?(@output) - FileUtils.mkdir(@output) - end - - @view_path = File.join(@guides_dir, "source") + def initialize(output=nil) + initialize_dirs(output) + create_output_dir_if_needed end def generate - guides = Dir.entries(view_path).find_all {|g| g =~ /\.textile(?:\.erb)?$/ } + generate_guides + copy_assets + end - if ENV["ONLY"] - only = ENV["ONLY"].split(",").map{|x| x.strip }.map {|o| "#{o}.textile" } - guides = guides.find_all {|g| only.include?(g) } - puts "GENERATING ONLY #{guides.inspect}" - end + private + def initialize_dirs(output) + @guides_dir = File.join(File.dirname(__FILE__), '..') + @source_dir = File.join(@guides_dir, "source") + @output_dir = output || File.join(@guides_dir, "output") + end - guides.each do |guide| - generate_guide(guide) + def create_output_dir_if_needed + FileUtils.mkdir_p(output_dir) + end + + def generate_guides + guides_to_generate.each do |guide| + output_file = output_file_for(guide) + generate_guide(guide, output_file) if generate?(guide, output_file) end + end - # Copy images and css files to html directory - FileUtils.cp_r File.join(guides_dir, 'images'), File.join(output, 'images') - FileUtils.cp_r File.join(guides_dir, 'files'), File.join(output, 'files') + def guides_to_generate + guides = Dir.entries(source_dir).grep(/\.textile(?:\.erb)?$/) + ENV.key?("ONLY") ? select_only(guides) : guides end - def generate_guide(guide) - guide =~ /(.*?)\.textile(?:\.erb)?$/ - name = $1 + def select_only(guides) + prefixes = ENV["ONLY"].split(",").map(&:strip) + guides.select do |guide| + prefixes.any? {|p| guide.start_with?(p)} + end + end - puts "Generating #{name}" + def copy_assets + FileUtils.cp_r(File.join(guides_dir, 'images'), File.join(output_dir, 'images')) + FileUtils.cp_r(File.join(guides_dir, 'files'), File.join(output_dir, 'files')) + end - file = File.join(output, "#{name}.html") - File.open(file, 'w') do |f| - @view = ActionView::Base.new(view_path) - @view.extend(Helpers) + def output_file_for(guide) + guide.sub(/\.textile(?:\.erb)?$/, '.html') + end + + def generate?(source_file, output_file) + fin = File.join(source_dir, source_file) + fout = File.join(output_dir, output_file) + ENV['ALL'] == '1' || !File.exists?(fout) || File.mtime(fout) < File.mtime(fin) + end + def generate_guide(guide, output_file) + puts "Generating #{output_file}" + File.open(File.join(output_dir, output_file), 'w') do |f| + view = ActionView::Base.new(source_dir) + view.extend(Helpers) + if guide =~ /\.textile\.erb$/ # Generate the erb pages with textile formatting - e.g. index/authors result = view.render(:layout => 'layout', :file => guide) - f.write textile(result) + result = textile(result) else - body = File.read(File.join(view_path, guide)) - body = set_header_section(body, @view) - body = set_index(body, @view) + body = File.read(File.join(source_dir, guide)) + body = set_header_section(body, view) + body = set_index(body, view) + + result = view.render(:layout => 'layout', :text => textile(body)) - result = view.render(:layout => 'layout', :text => textile(body).html_safe!) - f.write result warn_about_broken_links(result) if ENV.key?("WARN_BROKEN_LINKS") end + + result = insert_edge_badge(result) if ENV.key?('INSERT_EDGE_BADGE') + f.write result end end @@ -77,8 +102,8 @@ module RailsGuides header = textile(header) - view.content_for(:page_title) { page_title.html_safe! } - view.content_for(:header_section) { header.html_safe! } + view.content_for(:page_title) { page_title.html_safe } + view.content_for(:header_section) { header.html_safe } new_body end @@ -94,22 +119,22 @@ module RailsGuides # Set index for 2 levels i.level_hash.each do |key, value| - link = view.content_tag(:a, :href => key[:id]) { textile(key[:title]) } + link = view.content_tag(:a, :href => key[:id]) { textile(key[:title]).html_safe } children = value.keys.map do |k| - l = view.content_tag(:a, :href => k[:id]) { textile(k[:title]) } - view.content_tag(:li, l) + l = view.content_tag(:a, :href => k[:id]) { textile(k[:title]).html_safe } + view.content_tag(:li, l.html_safe) end - children_ul = view.content_tag(:ul, children.join(" ")) + children_ul = view.content_tag(:ul, children.join(" ").html_safe) - index << view.content_tag(:li, link + children_ul) + index << view.content_tag(:li, link.html_safe + children_ul.html_safe) end index << '</ol>' index << '</div>' - view.content_for(:index_section) { index.html_safe! } + view.content_for(:index_section) { index.html_safe } i.result end @@ -174,5 +199,9 @@ module RailsGuides end end end + + def insert_edge_badge(html) + html.sub(/<body[^>]*>/, '\&<img src="images/edge_badge.png" style="position:fixed; right:0px; top:0px; border:none; z-index:100"/>') + end end end diff --git a/railties/guides/rails_guides/textile_extensions.rb b/railties/guides/rails_guides/textile_extensions.rb index b22be5752d..affef1ccb0 100644 --- a/railties/guides/rails_guides/textile_extensions.rb +++ b/railties/guides/rails_guides/textile_extensions.rb @@ -1,7 +1,7 @@ module RailsGuides module TextileExtensions def notestuff(body) - body.gsub!(/^(IMPORTANT|CAUTION|WARNING|NOTE|INFO)(?:\.|\:)(.*)$/) do |m| + body.gsub!(/^(IMPORTANT|CAUTION|WARNING|NOTE|INFO)[.:](.*)$/) do |m| css_class = $1.downcase css_class = 'warning' if ['caution', 'important'].include?(css_class) @@ -13,9 +13,9 @@ module RailsGuides end def tip(body) - body.gsub!(/^(TIP)\:(.*)$/) do |m| + body.gsub!(/^TIP[.:](.*)$/) do |m| result = "<div class='info'><p>" - result << $2.strip + result << $1.strip result << '</p></div>' result end |