class ReVIEW::EPUBMaker::EPUBCommon
EPUBCommon
is the common class for EPUB producer. Some methods of this class are overridden by subclasses
Attributes
config[R]
contents[R]
Public Class Methods
new(producer)
click to toggle source
Construct object with parameter hash config
and message resource hash res
.
# File lib/review/epubmaker/epubcommon.rb, line 25 def initialize(producer) @config = producer.config @contents = producer.contents @body_ext = nil @logger = ReVIEW.logger end
Public Instance Methods
call_hook(filename, *params)
click to toggle source
# File lib/review/epubmaker/epubcommon.rb, line 349 def call_hook(filename, *params) return if !filename.present? || !File.exist?(filename) || !FileTest.executable?(filename) if ENV['REVIEW_SAFE_MODE'].to_i & 1 > 0 warn 'hook is prohibited in safe mode. ignored.' else system(filename, *params) end end
colophon()
click to toggle source
Return colophon content.
# File lib/review/epubmaker/epubcommon.rb, line 154 def colophon @title = h(ReVIEW::I18n.t('colophontitle')) @isbn_hyphen = isbn_hyphen @body = ReVIEW::Template.generate(path: './html/_colophon.html.erb', binding: binding) @language = config['language'] @stylesheets = config['stylesheet'] template_path = if config['htmlversion'].to_i == 5 './html/layout-html5.html.erb' else './html/layout-xhtml1.html.erb' end ReVIEW::Template.generate(path: template_path, binding: binding) end
colophon_history()
click to toggle source
# File lib/review/epubmaker/epubcommon.rb, line 180 def colophon_history @col_history = [] if config['history'] config['history'].each_with_index do |items, edit| items.each_with_index do |item, rev| editstr = edit == 0 ? ReVIEW::I18n.t('first_edition') : ReVIEW::I18n.t('nth_edition', (edit + 1).to_s) revstr = ReVIEW::I18n.t('nth_impression', (rev + 1).to_s) if item =~ /\A\d+-\d+-\d+\Z/ @col_history << ReVIEW::I18n.t('published_by1', [date_to_s(item), editstr + revstr]) elsif item =~ /\A(\d+-\d+-\d+)[\s ](.+)/ # custom date with string item.match(/\A(\d+-\d+-\d+)[\s ](.+)/) do |m| @col_history << ReVIEW::I18n.t('published_by3', [date_to_s(m[1]), m[2]]) end else # free format @col_history << item end end end end ReVIEW::Template.generate(path: './html/_colophon_history.html.erb', binding: binding) end
container()
click to toggle source
Return container content.
# File lib/review/epubmaker/epubcommon.rb, line 87 def container @opf_path = opf_path ReVIEW::Template.generate(path: './xml/container.xml.erb', binding: binding) end
cover()
click to toggle source
Return cover content. If Producer#config["coverimage"]
is defined, it will be used for the cover image.
# File lib/review/epubmaker/epubcommon.rb, line 105 def cover @body_ext = config['epubversion'] >= 3 ? %Q( epub:type="cover") : '' if config['coverimage'] @coverimage_src = coverimage raise ApplicationError, "coverimage #{config['coverimage']} not found. Abort." unless @coverimage_src end @body = ReVIEW::Template.generate(path: './html/_cover.html.erb', binding: binding) @title = h(config.name_of('title')) @language = config['language'] @stylesheets = config['stylesheet'] template_path = if config['htmlversion'].to_i == 5 './html/layout-html5.html.erb' else './html/layout-xhtml1.html.erb' end ReVIEW::Template.generate(path: template_path, binding: binding) end
coverimage()
click to toggle source
# File lib/review/epubmaker/epubcommon.rb, line 92 def coverimage return nil unless config['coverimage'] item = contents.find { |content| content.coverimage?(config['coverimage']) } if item item.file end end
date_to_s(date)
click to toggle source
# File lib/review/epubmaker/epubcommon.rb, line 205 def date_to_s(date) require 'date' d = Date.parse(date) d.strftime(ReVIEW::I18n.t('date_format')) end
flat_ncx(type, indent = nil)
click to toggle source
# File lib/review/epubmaker/epubcommon.rb, line 303 def flat_ncx(type, indent = nil) s = %Q(<#{type} class="toc-h1">\n) contents.each do |item| next if !item.notoc.nil? || item.level.nil? || item.file.nil? || item.title.nil? || item.level > config['toclevel'].to_i is = indent == true ? ' ' * item.level : '' s << %Q(<li><a href="#{item.file}">#{is}#{h(item.title)}</a></li>\n) end s << %Q(</#{type}>\n) s end
h(str)
click to toggle source
# File lib/review/epubmaker/epubcommon.rb, line 35 def h(str) CGI.escapeHTML(str) end
hierarchy_ncx(type)
click to toggle source
# File lib/review/epubmaker/epubcommon.rb, line 232 def hierarchy_ncx(type) require 'rexml/document' level = 1 find_jump = nil has_part = nil toclevel = config['toclevel'].to_i # check part existance contents.each do |item| next if item.notoc || item.chaptype != 'part' has_part = true break end if has_part contents.each do |item| if item.chaptype == 'part' && item.level > 0 # sections in part item.level -= 1 end # down level for part and chaps. pre, appendix, post are preserved if item.chaptype == 'part' || item.chaptype == 'body' item.level += 1 end end toclevel += 1 end doc = REXML::Document.new(%Q(<#{type} class="toc-h#{level}"><li /></#{type}>)) doc.context[:attribute_quote] = :quote e = doc.root.elements[1] # first <li/> contents.each do |item| next if !item.notoc.nil? || item.level.nil? || item.file.nil? || item.title.nil? || item.level > toclevel if item.level == level e2 = e.parent.add_element('li') e = e2 elsif item.level > level find_jump = true if (item.level - level) > 1 # deeper (level + 1).upto(item.level) do |n| if e.size == 0 # empty span for epubcheck e.attributes['style'] = 'list-style-type: none;' es = e.add_element('span', 'style' => 'display:none;') es.add_text(REXML::Text.new(' ', false, nil, true)) end e2 = e.add_element(type, 'class' => "toc-h#{n}") e3 = e2.add_element('li') e = e3 end level = item.level elsif item.level < level # shallower (level - 1).downto(item.level) { e = e.parent.parent } e2 = e.parent.add_element('li') e = e2 level = item.level end e2 = e.add_element('a', 'href' => item.file) e2.add_text(REXML::Text.new(item.title, true)) end warn %Q(found level jumping in table of contents. consider to use 'epubmaker:flattoc: true' for strict ePUB validator.) unless find_jump.nil? doc.to_s.gsub('<li/>', '').gsub('</li>', "</li>\n").gsub("<#{type} ", "\n" + '\&') # ugly end
isbn_hyphen()
click to toggle source
# File lib/review/epubmaker/epubcommon.rb, line 170 def isbn_hyphen str = config['isbn'].to_s if str =~ /\A\d{10}\Z/ "#{str[0..0]}-#{str[1..5]}-#{str[6..8]}-#{str[9..9]}" elsif str =~ /\A\d{13}\Z/ "#{str[0..2]}-#{str[3..3]}-#{str[4..8]}-#{str[9..11]}-#{str[12..12]}" end end
join_with_separator(value, sep)
click to toggle source
# File lib/review/epubmaker/epubcommon.rb, line 363 def join_with_separator(value, sep) if value.is_a?(Array) value.join(sep) else value end end
legacy_cover_and_title_file(loadfile, writefile)
click to toggle source
# File lib/review/epubmaker/epubcommon.rb, line 359 def legacy_cover_and_title_file(loadfile, writefile) FileUtils.cp(loadfile, writefile) end
mimetype()
click to toggle source
Return mimetype content.
# File lib/review/epubmaker/epubcommon.rb, line 44 def mimetype 'application/epub+zip' end
mytoc()
click to toggle source
Return own toc content.
# File lib/review/epubmaker/epubcommon.rb, line 212 def mytoc @title = h(ReVIEW::I18n.t('toctitle')) @body = %Q( <h1 class="toc-title">#{h(ReVIEW::I18n.t('toctitle'))}</h1>\n) if config['epubmaker']['flattoc'].nil? @body << hierarchy_ncx('ul') else @body << flat_ncx('ul', config['epubmaker']['flattocindent']) end @language = config['language'] @stylesheets = config['stylesheet'] template_path = if config['htmlversion'].to_i == 5 './html/layout-html5.html.erb' else './html/layout-xhtml1.html.erb' end ReVIEW::Template.generate(path: template_path, binding: binding) end
ncx(indentarray)
click to toggle source
# File lib/review/epubmaker/epubcommon.rb, line 82 def ncx(indentarray) raise NotImplementedError # should be overridden end
opf()
click to toggle source
# File lib/review/epubmaker/epubcommon.rb, line 48 def opf raise NotImplementedError # should be overridden end
opf_coverimage()
click to toggle source
# File lib/review/epubmaker/epubcommon.rb, line 68 def opf_coverimage if config['coverimage'] item = contents.find { |content| content.coverimage?(config['coverimage']) } unless item raise ApplicationError, "coverimage #{config['coverimage']} not found. Abort." end %Q( <meta name="cover" content="#{item.id}"/>\n) else '' end end
opf_manifest()
click to toggle source
# File lib/review/epubmaker/epubcommon.rb, line 52 def opf_manifest raise NotImplementedError # should be overridden end
opf_metainfo()
click to toggle source
# File lib/review/epubmaker/epubcommon.rb, line 56 def opf_metainfo raise NotImplementedError # should be overridden end
opf_path()
click to toggle source
# File lib/review/epubmaker/epubcommon.rb, line 64 def opf_path "OEBPS/#{config['bookname']}.opf" end
opf_tocx()
click to toggle source
# File lib/review/epubmaker/epubcommon.rb, line 60 def opf_tocx raise NotImplementedError # should be overridden end
produce(epubfile, basedir, tmpdir)
click to toggle source
# File lib/review/epubmaker/epubcommon.rb, line 39 def produce(epubfile, basedir, tmpdir) raise NotImplementedError # should be overridden end
produce_write_common(basedir, tmpdir)
click to toggle source
# File lib/review/epubmaker/epubcommon.rb, line 316 def produce_write_common(basedir, tmpdir) File.write("#{tmpdir}/mimetype", mimetype) FileUtils.mkdir_p("#{tmpdir}/META-INF") File.write("#{tmpdir}/META-INF/container.xml", container) FileUtils.mkdir_p("#{tmpdir}/OEBPS") File.write(File.join(tmpdir, opf_path), opf) if File.exist?("#{basedir}/#{config['cover']}") FileUtils.cp("#{basedir}/#{config['cover']}", "#{tmpdir}/OEBPS") else File.write("#{tmpdir}/OEBPS/#{config['cover']}", cover) end if config['colophon'] && !config['colophon'].is_a?(String) filename = File.join(basedir, "colophon.#{config['htmlext']}") File.write(filename, colophon) end contents.each do |item| next if item.file =~ /#/ # skip subgroup fname = "#{basedir}/#{item.file}" unless File.exist?(fname) raise ApplicationError, "#{fname} is not found." end FileUtils.mkdir_p(File.dirname("#{tmpdir}/OEBPS/#{item.file}")) FileUtils.cp(fname, "#{tmpdir}/OEBPS/#{item.file}") end end
titlepage()
click to toggle source
Return title (copying) content. NOTE: this method is not used yet.
see lib/review/epubmaker.rb#build_titlepage
# File lib/review/epubmaker/epubcommon.rb, line 128 def titlepage @title = h(config.name_of('title')) @title_str = config.name_of('title') if config['subtitle'] @subtitle_str = config.name_of('subtitle') end if config['aut'] @author_str = join_with_separator(config.names_of('aut'), ReVIEW::I18n.t('names_splitter')) end if config.names_of('pbl') @publisher_str = join_with_separator(config.names_of('pbl'), ReVIEW::I18n.t('names_splitter')) end @body = ReVIEW::Template.generate(path: './html/_titlepage.html.erb', binding: binding) @language = config['language'] @stylesheets = config['stylesheet'] template_path = if config['htmlversion'].to_i == 5 './html/layout-html5.html.erb' else './html/layout-xhtml1.html.erb' end ReVIEW::Template.generate(path: template_path, binding: binding) end