title page settings

add option to include or not title page
0 = never
1 = always
2 = when the epub is splitted
This commit is contained in:
Celogeek 2023-05-05 12:08:48 +02:00
parent 0de6cc9acd
commit a54e093844
Signed by: celogeek
SSH Key Fingerprint: SHA256:njNJLzoLQdbV9PC6ehcruRb0QnEgxABoCYZ+0+aUIYc
7 changed files with 56 additions and 15 deletions

View File

@ -129,6 +129,7 @@ func (c *Converter) InitParse() {
c.AddStringParam(&c.Options.Format, "format", c.Options.Format, "Format of output images: jpeg (lossy), png (lossless)")
c.AddFloatParam(&c.Options.AspectRatio, "aspect-ratio", c.Options.AspectRatio, "Aspect ratio (height/width) of the output\n -1 = same as device\n 0 = same as source\n1.6 = amazon advice for kindle")
c.AddBoolParam(&c.Options.PortraitOnly, "portrait-only", c.Options.PortraitOnly, "Portrait only: force orientation to portrait only.")
c.AddIntParam(&c.Options.TitlePage, "titlepage", c.Options.TitlePage, "Title page\n0 = never\n1 = always\n2 = only if epub is splitted")
c.AddSection("Default config")
c.AddBoolParam(&c.Options.Show, "show", false, "Show your default parameters")
@ -361,7 +362,12 @@ func (c *Converter) Validate() error {
// Aspect Ratio
if c.Options.AspectRatio < 0 && c.Options.AspectRatio != -1 {
return errors.New("aspect ratio should be: -1, 0, > 0")
return errors.New("aspect ratio should be -1, 0 or > 0")
}
// Title Page
if c.Options.TitlePage < 0 || c.Options.TitlePage > 2 {
return errors.New("title page should be 0, 1 or 2")
}
return nil

View File

@ -45,6 +45,7 @@ type Options struct {
Format string `yaml:"format"`
AspectRatio float64 `yaml:"aspect_ratio"`
PortraitOnly bool `yaml:"portrait_only"`
TitlePage int `yaml:"title_page"`
// Default Config
Show bool `yaml:"-"`
@ -87,6 +88,7 @@ func New() *Options {
ForegroundColor: "000",
BackgroundColor: "FFF",
Format: "jpeg",
TitlePage: 1,
profiles: profiles.New(),
}
}
@ -167,6 +169,16 @@ func (o *Options) ShowConfig() string {
aspectRatio = fmt.Sprintf("1:%0.2f (device)", float64(profile.Height)/float64(profile.Width))
}
titlePage := ""
switch o.TitlePage {
case 0:
titlePage = "never"
case 1:
titlePage = "always"
case 2:
titlePage = "when epub is splitted"
}
var b strings.Builder
for _, v := range []struct {
Key string
@ -194,6 +206,7 @@ func (o *Options) ShowConfig() string {
{"Resize", !o.NoResize, true},
{"Aspect Ratio", aspectRatio, true},
{"Portrait Only", o.PortraitOnly, true},
{"Title Page", titlePage, true},
} {
if v.Condition {
b.WriteString(fmt.Sprintf("\n %-26s: %v", v.Key, v.Value))

View File

@ -372,6 +372,7 @@ func (e *ePub) Write() error {
})
e.computeViewPort(epubParts)
hasTitlePage := e.TitlePage == 1 || (e.TitlePage == 2 && totalParts > 1)
for i, part := range epubParts {
ext := filepath.Ext(e.Output)
suffix := ""
@ -398,6 +399,7 @@ func (e *ePub) Write() error {
{"META-INF/com.apple.ibooks.display-options.xml", epubtemplates.AppleBooks},
{"OEBPS/content.opf", epubtemplates.Content(&epubtemplates.ContentOptions{
Title: title,
HasTitlePage: hasTitlePage,
UID: e.UID,
Author: e.Author,
Publisher: e.Publisher,
@ -408,7 +410,7 @@ func (e *ePub) Write() error {
Current: i + 1,
Total: totalParts,
})},
{"OEBPS/toc.xhtml", epubtemplates.Toc(title, e.StripFirstDirectoryFromToc, part.Images)},
{"OEBPS/toc.xhtml", epubtemplates.Toc(title, hasTitlePage, e.StripFirstDirectoryFromToc, part.Images)},
{"OEBPS/Text/style.css", e.render(epubtemplates.Style, map[string]any{
"View": e.Image.View,
})},
@ -427,8 +429,10 @@ func (e *ePub) Write() error {
return err
}
if err = e.writeTitleImage(wz, part.Cover, title); err != nil {
return err
if hasTitlePage {
if err = e.writeTitleImage(wz, part.Cover, title); err != nil {
return err
}
}
lastImage := part.Images[len(part.Images)-1]

View File

@ -41,6 +41,7 @@ type Options struct {
Input string
Output string
Title string
TitlePage int
Author string
LimitMb int
StripFirstDirectoryFromToc bool

View File

@ -10,6 +10,7 @@ import (
type ContentOptions struct {
Title string
HasTitlePage bool
UID string
Author string
Publisher string
@ -156,14 +157,19 @@ func getManifest(o *ContentOptions) []tag {
items := []tag{
{"item", tagAttrs{"id": "toc", "href": "toc.xhtml", "properties": "nav", "media-type": "application/xhtml+xml"}, ""},
{"item", tagAttrs{"id": "css", "href": "Text/style.css", "media-type": "text/css"}, ""},
{"item", tagAttrs{"id": "page_title", "href": "Text/title.xhtml", "media-type": "application/xhtml+xml"}, ""},
{"item", tagAttrs{"id": "img_title", "href": fmt.Sprintf("Images/title.%s", o.ImageOptions.Format), "media-type": fmt.Sprintf("image/%s", o.ImageOptions.Format)}, ""},
{"item", tagAttrs{"id": "page_cover", "href": "Text/cover.xhtml", "media-type": "application/xhtml+xml"}, ""},
{"item", tagAttrs{"id": "img_cover", "href": fmt.Sprintf("Images/cover.%s", o.ImageOptions.Format), "media-type": fmt.Sprintf("image/%s", o.ImageOptions.Format)}, ""},
}
if !o.ImageOptions.View.PortraitOnly {
items = append(items, tag{"item", tagAttrs{"id": "space_title", "href": "Text/space_title.xhtml", "media-type": "application/xhtml+xml"}, ""})
if o.HasTitlePage {
items = append(items,
tag{"item", tagAttrs{"id": "page_title", "href": "Text/title.xhtml", "media-type": "application/xhtml+xml"}, ""},
tag{"item", tagAttrs{"id": "img_title", "href": fmt.Sprintf("Images/title.%s", o.ImageOptions.Format), "media-type": fmt.Sprintf("image/%s", o.ImageOptions.Format)}, ""},
)
if !o.ImageOptions.View.PortraitOnly {
items = append(items, tag{"item", tagAttrs{"id": "space_title", "href": "Text/space_title.xhtml", "media-type": "application/xhtml+xml"}, ""})
}
}
lastImage := o.Images[len(o.Images)-1]
@ -198,9 +204,12 @@ func getSpineAuto(o *ContentOptions) []tag {
return fmt.Sprintf("%s layout-blank", getSpread(false))
}
spine := []tag{
{"itemref", tagAttrs{"idref": "space_title", "properties": getSpreadBlank()}, ""},
{"itemref", tagAttrs{"idref": "page_title", "properties": getSpread(false)}, ""},
spine := []tag{}
if o.HasTitlePage {
spine = append(spine,
tag{"itemref", tagAttrs{"idref": "space_title", "properties": getSpreadBlank()}, ""},
tag{"itemref", tagAttrs{"idref": "page_title", "properties": getSpread(false)}, ""},
)
}
for _, img := range o.Images {
if img.DoublePage && o.ImageOptions.Manga == isOnTheRight {
@ -230,8 +239,11 @@ func getSpineAuto(o *ContentOptions) []tag {
}
func getSpinePortrait(o *ContentOptions) []tag {
spine := []tag{
{"itemref", tagAttrs{"idref": "page_title"}, ""},
spine := []tag{}
if o.HasTitlePage {
spine = append(spine,
tag{"itemref", tagAttrs{"idref": "page_title"}, ""},
)
}
for _, img := range o.Images {
spine = append(spine, tag{

View File

@ -9,7 +9,7 @@ import (
)
// create toc
func Toc(title string, stripFirstDirectoryFromToc bool, images []*epubimage.Image) string {
func Toc(title string, hasTitle bool, stripFirstDirectoryFromToc bool, images []*epubimage.Image) string {
doc := etree.NewDocument()
doc.CreateProcInst("xml", `version="1.0" encoding="UTF-8"`)
doc.CreateDirective("DOCTYPE html")
@ -55,7 +55,11 @@ func Toc(title string, stripFirstDirectoryFromToc bool, images []*epubimage.Imag
beginning := etree.NewElement("li")
beginningLink := beginning.CreateElement("a")
beginningLink.CreateAttr("href", "Text/title.xhtml")
if hasTitle {
beginningLink.CreateAttr("href", "Text/title.xhtml")
} else {
beginningLink.CreateAttr("href", images[0].PagePath())
}
beginningLink.CreateText(title)
ol.InsertChildAt(0, beginning)

View File

@ -105,6 +105,7 @@ $ go install github.com/celogeek/go-comic-converter/v%d@%s
Output: cmd.Options.Output,
LimitMb: cmd.Options.LimitMb,
Title: cmd.Options.Title,
TitlePage: cmd.Options.TitlePage,
Author: cmd.Options.Author,
StripFirstDirectoryFromToc: cmd.Options.StripFirstDirectoryFromToc,
SortPathMode: cmd.Options.SortPathMode,