# -*- coding: utf-8 -*- ### ### ReVIEW::WEBMakerクラスを書き直す ### (でも元がひどすぎるので書き直すにも限界がある) ### require 'pathname' require 'fileutils' require 'erb' require 'review/converter' require 'review/htmlbuilder' require 'review/template' require 'review/webmaker' require_relative './review-maker' module ReVIEW remove_const :WEBMaker class WEBMaker < Maker SCRIPT_NAME = "review-webmaker" def initialize(*args) super @config['htmlext'] = 'html' @docroot = @config['docroot'] || 'webroot' end def generate() remove_old_files() FileUtils.mkdir_p(@docroot) # @book = ReVIEW::Book.load(@basedir) @book.config = @config # copy_stylesheet() copy_frontmatter() build_body() copy_backmatter() # imagedir = @config['imagedir'] destdir = "#{@docroot}/#{imagedir}" copy_images(imagedir, destdir) # copy_resources('covers', destdir) copy_resources('adv', destdir) copy_resources(@config['fontdir'], "#{@docroot}/fonts", @config['font_ext']) end def build_body() base_path = Pathname.new(@basedir) @converter = ReVIEW::Converter.new(@book, new_builder()) @book.parts.each do |part| if part.name.present? if part.file? build_chap(part, base_path, true) else htmlfile = "part_#{part.number}.#{@config['htmlext']}" build_part(part, htmlfile) # title = ReVIEW::I18n.t('part', part.number) # title += ReVIEW::I18n.t('chapter_postfix') + part.name.strip unless part.name.strip.empty? end end part.chapters.each do |chap| build_chap(chap, base_path, false) end end end def new_builder() builder = ReVIEW::WEBBuilder.new() builder.starter_config = @starter_config return builder end def new_renderer() return WEBRenderer.new(@config, @book, @basedir, @starter_config) end def build_part(part, htmlfile) new_renderer().render_part(part, File.join(@docroot, htmlfile)) end def build_chap(chap, base_path, ispart) filename = \ if ispart.present? chap.path else Pathname.new(chap.path).relative_path_from(base_path).to_s end chapter_id = filename.sub(/\.re\Z/, '') htmlfile = "#{chapter_id}.#{@config['htmlext']}" # if @config['params'].present? warn "'params:' in config.yml is obsoleted." end # begin @converter.convert(filename, File.join(@docroot, htmlfile)) rescue => ex warn "compile error in #{filename} (#{ex.class})" warn ex.message generate_errorpage(ex, filename, htmlfile) end end def remove_old_files() math_dir = "./#{@config['imagedir']}/_review_math" FileUtils.rm_rf(math_dir) if @config['imgmath'] && Dir.exist?(math_dir) FileUtils.rm_rf(@docroot) end def copy_images(srcdir, destdir) copy_resources(srcdir, destdir, nil) end def copy_resources(srcdir, destdir, allow_exts=nil) if srcdir && File.exist?(srcdir) FileUtils.mkdir_p(destdir) allow_exts ||= @config['image_ext'] ok = allow_exts && ! allow_exts.empty? ext_rexp = ok ? /\.(#{allow_exts.join('|')})\Z/i : nil _recursive_copy_files(srcdir, destdir, ext_rexp) end end def _recursive_copy_files(srcdir, destdir, ext_rexp) Dir.open(srcdir) do |dir| dir.each do |fname| next if fname.start_with?('.') srcpath = "#{srcdir}/#{fname}" if File.directory?(srcpath) destpath = "#{destdir}/#{fname}" _recursive_copy_files(srcpath, destpath, ext_rexp) elsif ext_rexp.nil? || fname =~ ext_rexp FileUtils.mkdir_p(destdir) FileUtils.cp(srcpath, destdir) end end end end def copy_stylesheet() cssdir = File.join(@docroot, "css") Dir.mkdir(cssdir) unless File.directory?(cssdir) [@config['stylesheet']].flatten.compact.each do |x| FileUtils.cp("css/#{x}", cssdir) end end def copy_frontmatter() generate_indexpage('index.html') # if @config['titlepage'] destfile = "titlepage.#{@config['htmlext']}" if @config['titlefile'] FileUtils.cp(@config['titlefile'], "#{@docroot}/#{destfile}") else generate_titlepage(destfile) end end # _copy_file(@config['creditfile']) _copy_file(@config['originaltitlefile']) end def generate_errorpage(ex, filename, htmlfile) s = new_renderer().render_exception(ex, filename) File.write(File.join(@docroot, htmlfile), s) end def generate_indexpage(htmlfile) s = new_renderer().render_indexpage() File.write(File.join(@docroot, htmlfile), s) rescue => ex generate_errorpage(ex, nil, htmlfile) end def generate_titlepage(htmlfile) s = new_renderer().render_titlepage() File.write(File.join(@docroot, htmlfile), s) end def copy_backmatter() conf = @config ext = conf['htmlext'] _copy_file(conf['profile']) _copy_file(conf['advfile']) _copy_file(conf['colophon'], "colophon.#{ext}") if conf['colophon'].is_a?(String) _copy_file(conf['backcover']) end def _copy_file(srcfile, destfile=nil) if srcfile && File.exist?(srcfile) destfile ||= File.basename(srcfile) FileUtils.cp(srcfile, File.join(@docroot, destfile)) end end end class WEBBuilder < HTMLBuilder def layoutfile "layouts/layout.html5.erb" end end class WEBRenderer < BaseRenderer def initialize(*args) super @language = @config['language'] @stylesheets = @config['stylesheet'] end def layout_template_name() #if @config['htmlversion'].to_i == 5 # 'web/html/layout-html5.html.erb' #else # 'web/html/layout-xhtml1.html.erb' #end "layout.html5.erb" end def render_exception(error, textfile) @error = error @textfile = textfile # return render() end def render_part(part) part_name = part.name.strip # sb = "" sb << "