check_for_kindlegen()
click to toggle source
def check_for_kindlegen
if %xwhich kindlegen`.blank?
raise "Can't create a kindle version without `kindlegen`."
end
end
check_fragment_identifiers(html, anchors)
click to toggle source
def check_fragment_identifiers(html, anchors)
html.scan(/<a\s+href="#([^"]+)/).flatten.each do |fragment_identifier|
next if fragment_identifier == 'mainCol'
unless anchors.member?(fragment_identifier)
guess = anchors.min { |a, b|
Levenshtein.distance(fragment_identifier, a) <=> Levenshtein.distance(fragment_identifier, b)
}
puts "*** BROKEN LINK: ##{fragment_identifier}, perhaps you meant ##{guess}."
end
end
end
copy_assets()
click to toggle source
def copy_assets
FileUtils.cp_r(Dir.glob("#{guides_dir}/assets/*"), output_dir)
end
create_output_dir_if_needed()
click to toggle source
def create_output_dir_if_needed
FileUtils.mkdir_p(output_dir)
end
generate?(source_file, output_file)
click to toggle source
def generate?(source_file, output_file)
fin = File.join(source_dir, source_file)
fout = output_path_for(output_file)
all || !File.exists?(fout) || File.mtime(fout) < File.mtime(fin)
end
generate_guide(guide, output_file)
click to toggle source
def generate_guide(guide, output_file)
output_path = output_path_for(output_file)
puts "Generating #{guide} as #{output_file}"
layout = kindle? ? 'kindle/layout' : 'layout'
File.open(output_path, 'w') do |f|
view = ActionView::Base.new(source_dir, :edge => @edge, :version => @version, :mobi => "kindle/#{mobi}")
view.extend(Helpers)
if guide =~ /\.(\w+)\.erb$/
result = view.render(:layout => layout, :formats => [$1], :file => $`)
else
body = File.read(File.join(source_dir, guide))
result = RailsGuides::Markdown.new(view, layout).render(body)
warn_about_broken_links(result) if @warnings
end
f.write(result)
end
end
generate_guides()
click to toggle source
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
generate_mobi()
click to toggle source
def generate_mobi
require 'rails_guides/kindle'
out = "#{output_dir}/kindlegen.out"
Kindle.generate(output_dir, mobi, out)
puts "(kindlegen log at #{out})."
end
guides_to_generate()
click to toggle source
def guides_to_generate
guides = Dir.entries(source_dir).grep(GUIDES_RE)
if kindle?
Dir.entries("#{source_dir}/kindle").grep(GUIDES_RE).map do |entry|
next if entry == 'KINDLE.md'
guides << "kindle/#{entry}"
end
end
ENV.key?('ONLY') ? select_only(guides) : guides
end
initialize_dirs(output)
click to toggle source
def initialize_dirs(output)
@guides_dir = File.join(File.dirname(__FILE__), '..')
@source_dir = "#@guides_dir/source/#@lang"
@output_dir = if output
output
elsif kindle?
"#@guides_dir/output/kindle/#@lang"
else
"#@guides_dir/output/#@lang"
end.sub(%r</$>, '')
end
kindle?()
click to toggle source
mobi()
click to toggle source
def mobi
"ruby_on_rails_guides_#@version%s.mobi" % (@lang.present? ? ".#@lang" : '')
end
output_file_for(guide)
click to toggle source
def output_file_for(guide)
if guide.end_with?('.md')
guide.sub(/md\z/, 'html')
else
guide.sub(/\.erb\z/, '')
end
end
output_path_for(output_file)
click to toggle source
def output_path_for(output_file)
File.join(output_dir, File.basename(output_file))
end
select_only(guides)
click to toggle source
def select_only(guides)
prefixes = ENV['ONLY'].split(",").map(&:strip)
guides.select do |guide|
prefixes.any? { |p| guide.start_with?(p) || guide.start_with?("kindle") }
end
end
warn_about_broken_links(html)
click to toggle source
def warn_about_broken_links(html)
anchors = extract_anchors(html)
check_fragment_identifiers(html, anchors)
end