@oebps_dir = File.join(@output_dir, OEBPS_DIR)
@css_file = css_file ? File.expand_path(css_file) : css_file
@embedded_fonts = embedded_fonts
- raise NotImplementedError if @embedded_fonts.length > 1
@to_delete = []
if customization_layer
html_stylesheet = "--stringparam html.stylesheet #{File.basename(@css_file)}" if @css_file
base = "--stringparam base.dir #{OEBPS_DIR}/"
unless @embedded_fonts.empty?
- font = "--stringparam epub.embedded.font \"#{File.basename(@embedded_fonts.first)}\""
+ embedded_fonts = @embedded_fonts.map {|f| File.basename(f)}.join(',')
+ font = "--stringparam epub.embedded.fonts \"#{embedded_fonts}\""
end
meta = "--stringparam epub.metainf.dir #{META_DIR}/"
oebps = "--stringparam epub.oebps.dir #{OEBPS_DIR}/"
@css_file = File.join(@filedir, @css_file_base)
customization_layer = nil
@embedded_font_file_base = "DejaVuSerif.otf"
- embedded_fonts = [File.join(@filedir, @embedded_font_file_base)]
- @css_epub = DocBook::Epub.new(File.join(@testdocsdir, "book.002.xml"), @tmpdir, @css_file, customization_layer, embedded_fonts)
+ @embedded_font_file2_base = "DejaVuSerif-Italic.otf"
+ @embedded_fonts = [File.join(@filedir, @embedded_font_file_base),
+ File.join(@filedir, @embedded_font_file2_base),
+ ]
+ @css_epub = DocBook::Epub.new(File.join(@testdocsdir, "book.002.xml"), @tmpdir, @css_file, customization_layer, @embedded_fonts)
@css_epubfile = File.join(@tmpdir, "css.epub")
@css_epub.render_to_file(@css_epubfile, $DEBUG)
success = system("unzip -q -d #{File.expand_path(tmpdir)} -o #{@css_epubfile}")
raise "Could not unzip #{@css_epubfile}" unless success
opf_files = Dir.glob(File.join(tmpdir, "**", "*.opf"))
- opf_links = opf_files.find_all {|opf_file| File.open(opf_file).readlines.to_s =~ /<(opf:item|item) [^>]*#{@embedded_font_file_base}/}
- opf_links.should_not be_empty
+
+ @embedded_fonts.each {|font|
+ opf_links = opf_files.find_all {|opf_file| File.open(opf_file).readlines.to_s =~ /<(opf:item|item) [^>]*#{File.basename(font)}/}
+ opf_links.should_not be_empty
+ }
rescue => e
raise e
ensure
success = system("unzip -q -d #{File.expand_path(tmpdir)} -o #{@css_epubfile}")
raise "Could not unzip #{@css_epubfile}" unless success
- font_files = Dir.glob(File.join(tmpdir, "**", @embedded_font_file_base))
- font_files.should_not be_empty
+ @embedded_fonts.each {|font|
+ font_files = Dir.glob(File.join(tmpdir, "**", File.basename(font)))
+ font_files.should_not be_empty
+ }
rescue => e
raise e
ensure
end
end
+ it "should be valid .epub after including more than one embedded font" do
+ @css_epubfile.should be_valid_epub
+ end
+
it "should include one and only one <h1> in each HTML file in rendered ePub files for <book>s" do
begin
tmpdir = File.join(Dir::tmpdir(), "epubtoctest"); Dir.mkdir(tmpdir) rescue Errno::EEXIST
font-weight: normal;
src:url(DejaVuSerif.otf);
}
+@font-face {
+ font-family: "DejaVu Serif Italic";
+ font-style: italic;
+ font-weight: normal;
+ src:url(DejaVuSerif-Italic.otf);
+}
h2 {
font-family: "DejaVu Serif";
text-align: center;
color: #dda0dd;
}
+em {
+ font-family: "DejaVu Serif Italic";
+}
xmlns:ng="http://docbook.org/docbook-ng"
xmlns:opf="http://www.idpf.org/2007/opf"
xmlns:stext="http://nwalsh.com/xslt/ext/com.nwalsh.saxon.TextFactory"
+ xmlns:str="http://exslt.org/strings"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xtext="xalan://com.nwalsh.xalan.Text"
extension-element-prefixes="stext xtext"
- exclude-result-prefixes="exsl db dc h ncx ng opf stext xtext"
+ exclude-result-prefixes="exsl db dc h ncx ng opf stext str xtext"
version="1.0">
<xsl:param name="epub.html.toc.id">htmltoc</xsl:param>
<xsl:param name="epub.metainf.dir" select="'META-INF/'"/>
- <xsl:param name="epub.embedded.font"></xsl:param>
+ <xsl:param name="epub.embedded.fonts"></xsl:param>
<!-- Per Bob Stayton:
"""Process your documents with the css.decoration parameter set to zero.
</xsl:element>
</xsl:if>
- <xsl:if test="$epub.embedded.font != ''">
- <xsl:element namespace="http://www.idpf.org/2007/opf" name="item">
- <xsl:attribute name="id">epub.embedded.font</xsl:attribute>
- <xsl:attribute name="href"><xsl:value-of select="$epub.embedded.font"/></xsl:attribute>
- <xsl:choose>
- <xsl:when test="contains($epub.embedded.font, 'otf')">
- <xsl:attribute name="media-type">font/opentype</xsl:attribute>
- </xsl:when>
- <xsl:otherwise>
- <xsl:message>
- <xsl:text>WARNING: OpenType fonts should be supplied! (</xsl:text>
- <xsl:value-of select="$epub.embedded.font"/>
- <xsl:text>)</xsl:text>
- </xsl:message>
- </xsl:otherwise>
- </xsl:choose>
- </xsl:element>
- </xsl:if>
+ <xsl:choose>
+ <xsl:when test="$epub.embedded.fonts != '' and not(contains($epub.embedded.fonts, ','))">
+ <xsl:call-template name="embedded-font-item">
+ <xsl:with-param name="font.file" select="$epub.embedded.fonts"/> <!-- There is just one -->
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="$epub.embedded.fonts != ''">
+ <xsl:variable name="font.file.tokens" select="str:tokenize($epub.embedded.fonts, ',')"/>
+ <xsl:for-each select="exsl:node-set($font.file.tokens)">
+ <xsl:call-template name="embedded-font-item">
+ <xsl:with-param name="font.file" select="."/>
+ <xsl:with-param name="font.order" select="position()"/>
+ </xsl:call-template>
+ </xsl:for-each>
+ </xsl:when>
+ </xsl:choose>
<!-- TODO: be nice to have a id="titlepage" here -->
<xsl:apply-templates select="//part|
<xsl:template match="bibliodiv[title]" mode="label.markup">
</xsl:template>
+ <xsl:template match="token" mode="opf.manifest.font">
+ <xsl:call-template name="embedded-font-item">
+ <xsl:with-param name="font.file" select="."/>
+ </xsl:call-template>
+ </xsl:template>
+
+ <xsl:template name="embedded-font-item">
+ <xsl:param name="font.file"/>
+ <xsl:param name="font.order" select="1"/>
+
+ <xsl:element namespace="http://www.idpf.org/2007/opf" name="item">
+ <xsl:attribute name="id">
+ <xsl:value-of select="concat('epub.embedded.font.', $font.order)"/>
+ </xsl:attribute>
+ <xsl:attribute name="href"><xsl:value-of select="$font.file"/></xsl:attribute>
+ <xsl:choose>
+ <xsl:when test="contains($font.file, 'otf')">
+ <xsl:attribute name="media-type">font/opentype</xsl:attribute>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message>
+ <xsl:text>WARNING: OpenType fonts should be supplied! (</xsl:text>
+ <xsl:value-of select="$font.file"/>
+ <xsl:text>)</xsl:text>
+ </xsl:message>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:element>
+ </xsl:template>
<!-- Change section.heading to improve SEO on generated HTML by doing heading levels
"correctly". SEO rules are sometimes silly silly, but this does actually create