class EPUBMaker::EPUBCommon
EPUBCommon is the common class for EPUB producer.
Public Class Methods
new(producer)
click to toggle source
Construct object with parameter hash params
and message
resource hash res
.
# File lib/epubmaker/epubcommon.rb, line 20 def initialize(producer) @body_ext = '' @producer = producer @body_ext = nil end
Public Instance Methods
colophon()
click to toggle source
Return colophon content.
# File lib/epubmaker/epubcommon.rb, line 210 def colophon @title = CGI.escapeHTML(@producer.res.v("colophontitle")) @body = <<EOT <div class="colophon"> EOT if @producer.params["subtitle"].nil? @body << <<EOT <p class="title">#{CGI.escapeHTML(@producer.params.name_of("title"))}</p> EOT else @body << <<EOT <p class="title">#{CGI.escapeHTML(@producer.params.name_of("title"))}<br /><span class="subtitle">#{CGI.escapeHTML(@producer.params.name_of("subtitle"))}</span></p> EOT end if @producer.params["date"] || @producer.params["history"] @body << colophon_history end @body << %Q[ <table class="colophon">\n] @body << @producer.params["colophon_order"].map{ |role| if @producer.params[role] %Q[ <tr><th>#{CGI.escapeHTML(@producer.res.v(role))}</th><td>#{CGI.escapeHTML(join_with_separator(@producer.params.names_of(role), ReVIEW::I18n.t("names_splitter")))}</td></tr>\n] else "" end }.join("") if @producer.isbn_hyphen @body << %Q[ <tr><th>ISBN</th><td>#{@producer.isbn_hyphen}</td></tr>\n] end @body << %Q[ </table>\n] if !@producer.params["rights"].nil? && @producer.params["rights"].size > 0 @body << %Q[ <p class="copyright">#{join_with_separator(@producer.params.names_of("rights").map {|m| CGI.escapeHTML(m)}, "<br />")}</p>\n] end @body << %Q[ </div>\n] @language = @producer.params['language'] @stylesheets = @producer.params["stylesheet"] if @producer.params["htmlversion"].to_i == 5 tmplfile = File.expand_path('./html/layout-html5.html.erb', ReVIEW::Template::TEMPLATE_DIR) else tmplfile = File.expand_path('./html/layout-xhtml1.html.erb', ReVIEW::Template::TEMPLATE_DIR) end tmpl = ReVIEW::Template.load(tmplfile) tmpl.result(binding) end
colophon_history()
click to toggle source
# File lib/epubmaker/epubcommon.rb, line 259 def colophon_history buf = "" buf << %Q[ <div class="pubhistory">\n] if @producer.params["history"] @producer.params["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}") revstr = ReVIEW::I18n.t("nth_impression", "#{rev+1}") if item =~ /\A\d+\-\d+\-\d+\Z/ buf << %Q[ <p>#{ReVIEW::I18n.t("published_by1", [date_to_s(item), editstr+revstr])}</p>\n] elsif item =~ /\A(\d+\-\d+\-\d+)[\s ](.+)/ # custom date with string item.match(/\A(\d+\-\d+\-\d+)[\s ](.+)/) do |m| buf << %Q[ <p>#{ReVIEW::I18n.t("published_by3", [date_to_s(m[1]), m[2]])}</p>\n] end else # free format buf << %Q[ <p>#{item}</p>\n] end end end else buf << %Q[ <p>#{ReVIEW::I18n.t("published_by2", date_to_s(@producer.params["date"]))}</p>\n] end buf << %Q[ </div>\n] buf end
container()
click to toggle source
Return container content.
# File lib/epubmaker/epubcommon.rb, line 115 def container @opf_path = opf_path tmplfile = File.expand_path('./xml/container.xml.erb', ReVIEW::Template::TEMPLATE_DIR) tmpl = ReVIEW::Template.load(tmplfile) tmpl.result(binding) end
cover(type=nil)
click to toggle source
Return cover content.
# File lib/epubmaker/epubcommon.rb, line 123 def cover(type=nil) @body_ext = type.nil? ? "" : " epub:type=\"#{type}\"" if @producer.params["coverimage"] file = @producer.coverimage if !file raise "coverimage #{@producer.params["coverimage"]} not found. Abort." end @body = <<-EOT <div id="cover-image" class="cover-image"> <img src="#{file}" alt="#{CGI.escapeHTML(@producer.params.name_of("title"))}" class="max"/> </div> EOT else @body = <<-EOT <h1 class="cover-title">#{CGI.escapeHTML(@producer.params.name_of("title"))}</h1> EOT if @producer.params["subtitle"] @body << <<-EOT <h2 class="cover-subtitle">#{CGI.escapeHTML(@producer.params.name_of("subtitle"))}</h2> EOT end end @title = CGI.escapeHTML(@producer.params.name_of("title")) @language = @producer.params['language'] @stylesheets = @producer.params["stylesheet"] if @producer.params["htmlversion"].to_i == 5 tmplfile = File.expand_path('./html/layout-html5.html.erb', ReVIEW::Template::TEMPLATE_DIR) else tmplfile = File.expand_path('./html/layout-xhtml1.html.erb', ReVIEW::Template::TEMPLATE_DIR) end tmpl = ReVIEW::Template.load(tmplfile) tmpl.result(binding) end
date_to_s(date)
click to toggle source
# File lib/epubmaker/epubcommon.rb, line 287 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/epubmaker/epubcommon.rb, line 382 def flat_ncx(type, indent=nil) s = %Q[<#{type} class="toc-h1">\n] @producer.contents.each do |item| next if !item.notoc.nil? || item.level.nil? || item.file.nil? || item.title.nil? || item.level > @producer.params["toclevel"].to_i is = indent == true ? " " * item.level : "" s << %Q[<li><a href="#{item.file}">#{is}#{CGI.escapeHTML(item.title)}</a></li>\n] end s << %Q[</#{type}>\n] s end
hierarchy_ncx(type)
click to toggle source
# File lib/epubmaker/epubcommon.rb, line 315 def hierarchy_ncx(type) require 'rexml/document' level = 1 find_jump = nil has_part = nil toclevel = @producer.params["toclevel"].to_i # check part existance @producer.contents.each do |item| if item.notoc.nil? && item.chaptype == "part" has_part = true break end end if !has_part.nil? @producer.contents.each do |item| item.level += 1 if item.chaptype == "part" || item.chaptype == "body" item.notoc = true if (item.chaptype == "pre" || item.chaptype == "post") && !item.level.nil? && (item.level + 1 == toclevel) # FIXME: 部があるときに前後の処理が困難 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/> @producer.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) do |n| e = e.parent.parent end 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 "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
join_with_separator(value, sep)
click to toggle source
# File lib/epubmaker/epubcommon.rb, line 432 def join_with_separator(value, sep) if value.kind_of? Array value.join(sep) else value end end
legacy_cover_and_title_file(loadfile, writefile)
click to toggle source
# File lib/epubmaker/epubcommon.rb, line 418 def legacy_cover_and_title_file(loadfile, writefile) @title = @producer.params["booktitle"] s = "" File.open(loadfile) do |f| f.each_line do |l| s << l end end File.open(writefile, "w") do |f| f.puts s end end
mimetype()
click to toggle source
Return mimetype content.
# File lib/epubmaker/epubcommon.rb, line 27 def mimetype "application/epub+zip" end
mytoc()
click to toggle source
Return own toc content.
# File lib/epubmaker/epubcommon.rb, line 294 def mytoc @title = CGI.escapeHTML(@producer.res.v("toctitle")) @body = %Q[ <h1 class="toc-title">#{CGI.escapeHTML(@producer.res.v("toctitle"))}</h1>\n] if @producer.params["epubmaker"]["flattoc"].nil? @body << hierarchy_ncx("ul") else @body << flat_ncx("ul", @producer.params["epubmaker"]["flattocindent"]) end @language = @producer.params['language'] @stylesheets = @producer.params["stylesheet"] if @producer.params["htmlversion"].to_i == 5 tmplfile = File.expand_path('./html/layout-html5.html.erb', ReVIEW::Template::TEMPLATE_DIR) else tmplfile = File.expand_path('./html/layout-xhtml1.html.erb', ReVIEW::Template::TEMPLATE_DIR) end tmpl = ReVIEW::Template.load(tmplfile) tmpl.result(binding) end
ncx_doctitle()
click to toggle source
# File lib/epubmaker/epubcommon.rb, line 56 def ncx_doctitle <<EOT <docTitle> <text>#{CGI.escapeHTML(@producer.params["title"])}</text> </docTitle> <docAuthor> <text>#{@producer.params["aut"].nil? ? "" : CGI.escapeHTML(join_with_separator(@producer.params["aut"], ReVIEW::I18n.t("names_splitter")))}</text> </docAuthor> EOT end
ncx_isbn()
click to toggle source
# File lib/epubmaker/epubcommon.rb, line 51 def ncx_isbn uid = @producer.params["isbn"] || @producer.params["urnid"] %Q[ <meta name="dtb:uid" content="#{uid}"/>\n] end
opf_coverimage()
click to toggle source
# File lib/epubmaker/epubcommon.rb, line 35 def opf_coverimage s = "" if @producer.params["coverimage"] file = nil @producer.contents.each do |item| if item.media.start_with?('image') && item.file =~ /#{@producer.params["coverimage"]}\Z/ s << %Q[ <meta name="cover" content="#{item.id}"/>\n] file = item.file break end end raise "coverimage #{@producer.params["coverimage"]} not found. Abort." if file.nil? end s end
opf_path()
click to toggle source
# File lib/epubmaker/epubcommon.rb, line 31 def opf_path "OEBPS/#{@producer.params["bookname"]}.opf" end
produce_write_common(basedir, tmpdir)
click to toggle source
# File lib/epubmaker/epubcommon.rb, line 394 def produce_write_common(basedir, tmpdir) File.open("#{tmpdir}/mimetype", "w") {|f| @producer.mimetype(f) } FileUtils.mkdir_p("#{tmpdir}/META-INF") File.open("#{tmpdir}/META-INF/container.xml", "w") {|f| @producer.container(f) } FileUtils.mkdir_p("#{tmpdir}/OEBPS") File.open(File.join(tmpdir, opf_path), "w") {|f| @producer.opf(f) } if File.exist?("#{basedir}/#{@producer.params["cover"]}") FileUtils.cp("#{basedir}/#{@producer.params["cover"]}", "#{tmpdir}/OEBPS") else File.open("#{tmpdir}/OEBPS/#{@producer.params["cover"]}", "w") {|f| @producer.cover(f) } end @producer.contents.each do |item| next if item.file =~ /#/ # skip subgroup fname = "#{basedir}/#{item.file}" raise "#{fname} doesn't exist. Abort." unless File.exist?(fname) 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/epubmaker/epubcommon.rb, line 162 def titlepage @title = CGI.escapeHTML(@producer.params.name_of("title")) @body = <<EOT <h1 class="tp-title">#{@title}</h1> EOT if @producer.params["subtitle"] @body << <<EOT <h2 class="tp-subtitle">#{CGI.escapeHTML(@producer.params.name_of("subtitle"))}</h2> EOT end if @producer.params["aut"] @body << <<EOT <p> <br /> <br /> </p> <h2 class="tp-author">#{CGI.escapeHTML(join_with_separator(@producer.params.names_of("aut"), ReVIEW::I18n.t("names_splitter")))}</h2> EOT end publisher = @producer.params.names_of("pbl") if publisher @body << <<EOT <p> <br /> <br /> <br /> <br /> </p> <h3 class="tp-publisher">#{CGI.escapeHTML(join_with_separator(publisher, ReVIEW::I18n.t("names_splitter")))}</h3> EOT end @language = @producer.params['language'] @stylesheets = @producer.params["stylesheet"] if @producer.params["htmlversion"].to_i == 5 tmplfile = File.expand_path('./html/layout-html5.html.erb', ReVIEW::Template::TEMPLATE_DIR) else tmplfile = File.expand_path('./html/layout-xhtml1.html.erb', ReVIEW::Template::TEMPLATE_DIR) end tmpl = ReVIEW::Template.load(tmplfile) tmpl.result(binding) end