mirror of
https://github.com/celogeek/go-comic-converter.git
synced 2025-05-24 15:52:38 +02:00
limit usage of Sprint
This commit is contained in:
parent
93294ba1f9
commit
0c8e54f0c4
@ -104,7 +104,7 @@ func (c *Converter) InitParse() {
|
|||||||
c.AddStringParam(&c.Options.Title, "title", "", "Title of the EPUB")
|
c.AddStringParam(&c.Options.Title, "title", "", "Title of the EPUB")
|
||||||
|
|
||||||
c.AddSection("Config")
|
c.AddSection("Config")
|
||||||
c.AddStringParam(&c.Options.Profile, "profile", c.Options.Profile, fmt.Sprintf("Profile to use: \n%s", c.Options.AvailableProfiles()))
|
c.AddStringParam(&c.Options.Profile, "profile", c.Options.Profile, "Profile to use: \n"+c.Options.AvailableProfiles())
|
||||||
c.AddIntParam(&c.Options.Quality, "quality", c.Options.Quality, "Quality of the image")
|
c.AddIntParam(&c.Options.Quality, "quality", c.Options.Quality, "Quality of the image")
|
||||||
c.AddBoolParam(&c.Options.Grayscale, "grayscale", c.Options.Grayscale, "Grayscale image. Ideal for eInk devices.")
|
c.AddBoolParam(&c.Options.Grayscale, "grayscale", c.Options.Grayscale, "Grayscale image. Ideal for eInk devices.")
|
||||||
c.AddIntParam(&c.Options.GrayscaleMode, "grayscale-mode", c.Options.GrayscaleMode, "Grayscale Mode\n0 = normal\n1 = average\n2 = luminance")
|
c.AddIntParam(&c.Options.GrayscaleMode, "grayscale-mode", c.Options.GrayscaleMode, "Grayscale Mode\n0 = normal\n1 = average\n2 = luminance")
|
||||||
@ -298,10 +298,10 @@ func (c *Converter) Validate() error {
|
|||||||
var defaultOutput string
|
var defaultOutput string
|
||||||
inputBase := filepath.Clean(c.Options.Input)
|
inputBase := filepath.Clean(c.Options.Input)
|
||||||
if fi.IsDir() {
|
if fi.IsDir() {
|
||||||
defaultOutput = fmt.Sprintf("%s.epub", inputBase)
|
defaultOutput = inputBase + ".epub"
|
||||||
} else {
|
} else {
|
||||||
ext := filepath.Ext(inputBase)
|
ext := filepath.Ext(inputBase)
|
||||||
defaultOutput = fmt.Sprintf("%s.epub", inputBase[0:len(inputBase)-len(ext)])
|
defaultOutput = inputBase[0:len(inputBase)-len(ext)] + ".epub"
|
||||||
}
|
}
|
||||||
|
|
||||||
if c.Options.Output == "" {
|
if c.Options.Output == "" {
|
||||||
|
@ -9,6 +9,8 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"gopkg.in/yaml.v3"
|
"gopkg.in/yaml.v3"
|
||||||
|
|
||||||
|
"github.com/celogeek/go-comic-converter/v2/internal/pkg/utils"
|
||||||
)
|
)
|
||||||
|
|
||||||
type Options struct {
|
type Options struct {
|
||||||
@ -217,13 +219,7 @@ func (o *Options) ShowConfig() string {
|
|||||||
var profileDesc string
|
var profileDesc string
|
||||||
profile := o.GetProfile()
|
profile := o.GetProfile()
|
||||||
if profile != nil {
|
if profile != nil {
|
||||||
profileDesc = fmt.Sprintf(
|
profileDesc = profile.String()
|
||||||
"%s - %s - %dx%d",
|
|
||||||
o.Profile,
|
|
||||||
profile.Description,
|
|
||||||
profile.Width,
|
|
||||||
profile.Height,
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
sortpathmode := ""
|
sortpathmode := ""
|
||||||
@ -238,10 +234,10 @@ func (o *Options) ShowConfig() string {
|
|||||||
|
|
||||||
aspectRatio := "auto"
|
aspectRatio := "auto"
|
||||||
if o.AspectRatio > 0 {
|
if o.AspectRatio > 0 {
|
||||||
aspectRatio = fmt.Sprintf("1:%.02f", o.AspectRatio)
|
aspectRatio = "1:" + utils.FloatToString(o.AspectRatio, 2)
|
||||||
} else if o.AspectRatio < 0 {
|
} else if o.AspectRatio < 0 {
|
||||||
if profile != nil {
|
if profile != nil {
|
||||||
aspectRatio = fmt.Sprintf("1:%0.2f (device)", float64(profile.Height)/float64(profile.Width))
|
aspectRatio = "1:" + utils.FloatToString(float64(profile.Height)/float64(profile.Width), 2) + " (device)"
|
||||||
} else {
|
} else {
|
||||||
aspectRatio = "1:?? (device)"
|
aspectRatio = "1:?? (device)"
|
||||||
}
|
}
|
||||||
@ -277,7 +273,14 @@ func (o *Options) ShowConfig() string {
|
|||||||
{"Grayscale", o.Grayscale, true},
|
{"Grayscale", o.Grayscale, true},
|
||||||
{"Grayscale mode", grayscaleMode, o.Grayscale},
|
{"Grayscale mode", grayscaleMode, o.Grayscale},
|
||||||
{"Crop", o.Crop, true},
|
{"Crop", o.Crop, true},
|
||||||
{"Crop ratio", fmt.Sprintf("%d Left - %d Up - %d Right - %d Bottom - Limit %d%% - Skip %v", o.CropRatioLeft, o.CropRatioUp, o.CropRatioRight, o.CropRatioBottom, o.CropLimit, o.CropSkipIfLimitReached), o.Crop},
|
{"Crop ratio",
|
||||||
|
utils.IntToString(o.CropRatioLeft) + " Left - " +
|
||||||
|
utils.IntToString(o.CropRatioUp) + " Up - " +
|
||||||
|
utils.IntToString(o.CropRatioRight) + " Right - " +
|
||||||
|
utils.IntToString(o.CropRatioBottom) + " Bottom - " +
|
||||||
|
"Limit " + utils.IntToString(o.CropLimit) + "% - " +
|
||||||
|
"Skip " + utils.BoolToString(o.CropSkipIfLimitReached),
|
||||||
|
o.Crop},
|
||||||
{"Brightness", o.Brightness, o.Brightness != 0},
|
{"Brightness", o.Brightness, o.Brightness != 0},
|
||||||
{"Contrast", o.Contrast, o.Contrast != 0},
|
{"Contrast", o.Contrast, o.Contrast != 0},
|
||||||
{"Auto contrast", o.AutoContrast, true},
|
{"Auto contrast", o.AutoContrast, true},
|
||||||
@ -288,11 +291,11 @@ func (o *Options) ShowConfig() string {
|
|||||||
{"No blank image", o.NoBlankImage, true},
|
{"No blank image", o.NoBlankImage, true},
|
||||||
{"Manga", o.Manga, true},
|
{"Manga", o.Manga, true},
|
||||||
{"Has cover", o.HasCover, true},
|
{"Has cover", o.HasCover, true},
|
||||||
{"Limit", fmt.Sprintf("%d Mb", o.LimitMb), o.LimitMb != 0},
|
{"Limit", utils.IntToString(o.LimitMb) + " Mb", o.LimitMb != 0},
|
||||||
{"Strip first directory from toc", o.StripFirstDirectoryFromToc, true},
|
{"Strip first directory from toc", o.StripFirstDirectoryFromToc, true},
|
||||||
{"Sort path mode", sortpathmode, true},
|
{"Sort path mode", sortpathmode, true},
|
||||||
{"Foreground color", fmt.Sprintf("#%s", o.ForegroundColor), true},
|
{"Foreground color", "#" + o.ForegroundColor, true},
|
||||||
{"Background color", fmt.Sprintf("#%s", o.BackgroundColor), true},
|
{"Background color", "#" + o.BackgroundColor, true},
|
||||||
{"Resize", !o.NoResize, true},
|
{"Resize", !o.NoResize, true},
|
||||||
{"Aspect ratio", aspectRatio, true},
|
{"Aspect ratio", aspectRatio, true},
|
||||||
{"Portrait only", o.PortraitOnly, true},
|
{"Portrait only", o.PortraitOnly, true},
|
||||||
|
@ -4,6 +4,8 @@ package converter
|
|||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
|
"github.com/celogeek/go-comic-converter/v2/internal/pkg/utils"
|
||||||
)
|
)
|
||||||
|
|
||||||
type Profile struct {
|
type Profile struct {
|
||||||
@ -13,6 +15,10 @@ type Profile struct {
|
|||||||
Height int `json:"height"`
|
Height int `json:"height"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (p Profile) String() string {
|
||||||
|
return p.Code + " - " + p.Description + " - " + utils.IntToString(p.Width) + "x" + utils.IntToString(p.Height)
|
||||||
|
}
|
||||||
|
|
||||||
type Profiles map[string]Profile
|
type Profiles map[string]Profile
|
||||||
|
|
||||||
// NewProfiles Initialize list of all supported profiles.
|
// NewProfiles Initialize list of all supported profiles.
|
||||||
@ -61,9 +67,9 @@ func (p Profiles) String() string {
|
|||||||
s := make([]string, 0)
|
s := make([]string, 0)
|
||||||
for _, v := range p {
|
for _, v := range p {
|
||||||
s = append(s, fmt.Sprintf(
|
s = append(s, fmt.Sprintf(
|
||||||
" - %-7s ( %9s ) - %s",
|
" - %-7s - %4d x %-4d - %s",
|
||||||
v.Code,
|
v.Code,
|
||||||
fmt.Sprintf("%dx%d", v.Width, v.Height),
|
v.Width, v.Height,
|
||||||
v.Description,
|
v.Description,
|
||||||
))
|
))
|
||||||
}
|
}
|
||||||
|
@ -73,8 +73,8 @@ func (e EPUB) writeImage(wz epubzip.EPUBZip, img epubimage.EPUBImage, zipImg *zi
|
|||||||
err := wz.WriteContent(
|
err := wz.WriteContent(
|
||||||
img.EPUBPagePath(),
|
img.EPUBPagePath(),
|
||||||
[]byte(e.render(epubtemplates.Text, map[string]any{
|
[]byte(e.render(epubtemplates.Text, map[string]any{
|
||||||
"Title": fmt.Sprintf("Image %d Part %d", img.Id, img.Part),
|
"Title": "Image " + utils.IntToString(img.Id) + " Part " + utils.IntToString(img.Part),
|
||||||
"ViewPort": fmt.Sprintf("width=%d,height=%d", e.Image.View.Width, e.Image.View.Height),
|
"ViewPort": e.Image.View.Port(),
|
||||||
"ImagePath": img.ImgPath(),
|
"ImagePath": img.ImgPath(),
|
||||||
"ImageStyle": img.ImgStyle(e.Image.View.Width, e.Image.View.Height, ""),
|
"ImageStyle": img.ImgStyle(e.Image.View.Width, e.Image.View.Height, ""),
|
||||||
})),
|
})),
|
||||||
@ -91,8 +91,8 @@ func (e EPUB) writeBlank(wz epubzip.EPUBZip, img epubimage.EPUBImage) error {
|
|||||||
return wz.WriteContent(
|
return wz.WriteContent(
|
||||||
img.EPUBSpacePath(),
|
img.EPUBSpacePath(),
|
||||||
[]byte(e.render(epubtemplates.Blank, map[string]any{
|
[]byte(e.render(epubtemplates.Blank, map[string]any{
|
||||||
"Title": fmt.Sprintf("Blank Page %d", img.Id),
|
"Title": "Blank Page " + utils.IntToString(img.Id),
|
||||||
"ViewPort": fmt.Sprintf("width=%d,height=%d", e.Image.View.Width, e.Image.View.Height),
|
"ViewPort": e.Image.View.Port(),
|
||||||
})),
|
})),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
@ -102,16 +102,16 @@ func (e EPUB) writeCoverImage(wz epubzip.EPUBZip, img epubimage.EPUBImage, part,
|
|||||||
title := "Cover"
|
title := "Cover"
|
||||||
text := ""
|
text := ""
|
||||||
if totalParts > 1 {
|
if totalParts > 1 {
|
||||||
text = fmt.Sprintf("%d / %d", part, totalParts)
|
text = utils.IntToString(part) + " / " + utils.IntToString(totalParts)
|
||||||
title = fmt.Sprintf("%s %s", title, text)
|
title = title + " " + text
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := wz.WriteContent(
|
if err := wz.WriteContent(
|
||||||
"OEBPS/Text/cover.xhtml",
|
"OEBPS/Text/cover.xhtml",
|
||||||
[]byte(e.render(epubtemplates.Text, map[string]any{
|
[]byte(e.render(epubtemplates.Text, map[string]any{
|
||||||
"Title": title,
|
"Title": title,
|
||||||
"ViewPort": fmt.Sprintf("width=%d,height=%d", e.Image.View.Width, e.Image.View.Height),
|
"ViewPort": e.Image.View.Port(),
|
||||||
"ImagePath": fmt.Sprintf("Images/cover.%s", e.Image.Format),
|
"ImagePath": "Images/cover." + e.Image.Format,
|
||||||
"ImageStyle": img.ImgStyle(e.Image.View.Width, e.Image.View.Height, ""),
|
"ImageStyle": img.ImgStyle(e.Image.View.Width, e.Image.View.Height, ""),
|
||||||
})),
|
})),
|
||||||
); err != nil {
|
); err != nil {
|
||||||
@ -156,7 +156,7 @@ func (e EPUB) writeTitleImage(wz epubzip.EPUBZip, img epubimage.EPUBImage, title
|
|||||||
"OEBPS/Text/space_title.xhtml",
|
"OEBPS/Text/space_title.xhtml",
|
||||||
[]byte(e.render(epubtemplates.Blank, map[string]any{
|
[]byte(e.render(epubtemplates.Blank, map[string]any{
|
||||||
"Title": "Blank Page Title",
|
"Title": "Blank Page Title",
|
||||||
"ViewPort": fmt.Sprintf("width=%d,height=%d", e.Image.View.Width, e.Image.View.Height),
|
"ViewPort": e.Image.View.Port(),
|
||||||
})),
|
})),
|
||||||
); err != nil {
|
); err != nil {
|
||||||
return err
|
return err
|
||||||
@ -167,8 +167,8 @@ func (e EPUB) writeTitleImage(wz epubzip.EPUBZip, img epubimage.EPUBImage, title
|
|||||||
"OEBPS/Text/title.xhtml",
|
"OEBPS/Text/title.xhtml",
|
||||||
[]byte(e.render(epubtemplates.Text, map[string]any{
|
[]byte(e.render(epubtemplates.Text, map[string]any{
|
||||||
"Title": title,
|
"Title": title,
|
||||||
"ViewPort": fmt.Sprintf("width=%d,height=%d", e.Image.View.Width, e.Image.View.Height),
|
"ViewPort": e.Image.View.Port(),
|
||||||
"ImagePath": fmt.Sprintf("Images/title.%s", e.Image.Format),
|
"ImagePath": "Images/title." + e.Image.Format,
|
||||||
"ImageStyle": img.ImgStyle(e.Image.View.Width, e.Image.View.Height, titleAlign),
|
"ImageStyle": img.ImgStyle(e.Image.View.Width, e.Image.View.Height, titleAlign),
|
||||||
})),
|
})),
|
||||||
); err != nil {
|
); err != nil {
|
||||||
@ -344,7 +344,7 @@ func (e EPUB) writePart(path string, currentPart, totalParts int, part epubPart,
|
|||||||
|
|
||||||
title := e.Title
|
title := e.Title
|
||||||
if totalParts > 1 {
|
if totalParts > 1 {
|
||||||
title = fmt.Sprintf("%s [%d/%d]", title, currentPart, totalParts)
|
title = title + " [" + utils.IntToString(currentPart) + "/" + utils.IntToString(totalParts) + "]"
|
||||||
}
|
}
|
||||||
|
|
||||||
type zipContent struct {
|
type zipContent struct {
|
||||||
@ -450,12 +450,12 @@ func (e EPUB) Write() error {
|
|||||||
ext := filepath.Ext(e.Output)
|
ext := filepath.Ext(e.Output)
|
||||||
suffix := ""
|
suffix := ""
|
||||||
if totalParts > 1 {
|
if totalParts > 1 {
|
||||||
fmtLen := len(fmt.Sprint(totalParts))
|
fmtLen := utils.FormatNumberOfDigits(totalParts)
|
||||||
fmtPart := fmt.Sprintf(" Part %%0%dd of %%0%dd", fmtLen, fmtLen)
|
fmtPart := "Part " + fmtLen + " of " + fmtLen
|
||||||
suffix = fmt.Sprintf(fmtPart, i+1, totalParts)
|
suffix = fmt.Sprintf(fmtPart, i+1, totalParts)
|
||||||
}
|
}
|
||||||
|
|
||||||
path := fmt.Sprintf("%s%s%s", e.Output[0:len(e.Output)-len(ext)], suffix, ext)
|
path := e.Output[0:len(e.Output)-len(ext)] + suffix + ext
|
||||||
|
|
||||||
if err := e.writePart(
|
if err := e.writePart(
|
||||||
path,
|
path,
|
||||||
|
@ -2,9 +2,10 @@
|
|||||||
package epubimage
|
package epubimage
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
|
||||||
"image"
|
"image"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
|
"github.com/celogeek/go-comic-converter/v2/internal/pkg/utils"
|
||||||
)
|
)
|
||||||
|
|
||||||
type EPUBImage struct {
|
type EPUBImage struct {
|
||||||
@ -25,47 +26,51 @@ type EPUBImage struct {
|
|||||||
|
|
||||||
// SpaceKey key name of the blank page after the image
|
// SpaceKey key name of the blank page after the image
|
||||||
func (i EPUBImage) SpaceKey() string {
|
func (i EPUBImage) SpaceKey() string {
|
||||||
return fmt.Sprintf("space_%d", i.Id)
|
return "space_" + utils.IntToString(i.Id)
|
||||||
}
|
}
|
||||||
|
|
||||||
// SpacePath path of the blank page
|
// SpacePath path of the blank page
|
||||||
func (i EPUBImage) SpacePath() string {
|
func (i EPUBImage) SpacePath() string {
|
||||||
return fmt.Sprintf("Text/%s.xhtml", i.SpaceKey())
|
return "Text/" + i.SpaceKey() + ".xhtml"
|
||||||
}
|
}
|
||||||
|
|
||||||
// EPUBSpacePath path of the blank page into the EPUB
|
// EPUBSpacePath path of the blank page into the EPUB
|
||||||
func (i EPUBImage) EPUBSpacePath() string {
|
func (i EPUBImage) EPUBSpacePath() string {
|
||||||
return fmt.Sprintf("OEBPS/%s", i.SpacePath())
|
return "OEBPS/" + i.SpacePath()
|
||||||
|
}
|
||||||
|
|
||||||
|
func (i EPUBImage) PartKey() string {
|
||||||
|
return utils.IntToString(i.Id) + "_p" + utils.IntToString(i.Part)
|
||||||
}
|
}
|
||||||
|
|
||||||
// PageKey key for page
|
// PageKey key for page
|
||||||
func (i EPUBImage) PageKey() string {
|
func (i EPUBImage) PageKey() string {
|
||||||
return fmt.Sprintf("page_%d_p%d", i.Id, i.Part)
|
return "page_" + i.PartKey()
|
||||||
}
|
}
|
||||||
|
|
||||||
// PagePath page path linked to the image
|
// PagePath page path linked to the image
|
||||||
func (i EPUBImage) PagePath() string {
|
func (i EPUBImage) PagePath() string {
|
||||||
return fmt.Sprintf("Text/%s.xhtml", i.PageKey())
|
return "Text/" + i.PageKey() + ".xhtml"
|
||||||
}
|
}
|
||||||
|
|
||||||
// EPUBPagePath page path into the EPUB
|
// EPUBPagePath page path into the EPUB
|
||||||
func (i EPUBImage) EPUBPagePath() string {
|
func (i EPUBImage) EPUBPagePath() string {
|
||||||
return fmt.Sprintf("OEBPS/%s", i.PagePath())
|
return "OEBPS/" + i.PagePath()
|
||||||
}
|
}
|
||||||
|
|
||||||
// ImgKey key for image
|
// ImgKey key for image
|
||||||
func (i EPUBImage) ImgKey() string {
|
func (i EPUBImage) ImgKey() string {
|
||||||
return fmt.Sprintf("img_%d_p%d", i.Id, i.Part)
|
return "img_" + i.PartKey()
|
||||||
}
|
}
|
||||||
|
|
||||||
// ImgPath image path
|
// ImgPath image path
|
||||||
func (i EPUBImage) ImgPath() string {
|
func (i EPUBImage) ImgPath() string {
|
||||||
return fmt.Sprintf("Images/%s.%s", i.ImgKey(), i.Format)
|
return "Images/" + i.ImgKey() + "." + i.Format
|
||||||
}
|
}
|
||||||
|
|
||||||
// EPUBImgPath image path into the EPUB
|
// EPUBImgPath image path into the EPUB
|
||||||
func (i EPUBImage) EPUBImgPath() string {
|
func (i EPUBImage) EPUBImgPath() string {
|
||||||
return fmt.Sprintf("OEBPS/%s", i.ImgPath())
|
return "OEBPS/" + i.ImgPath()
|
||||||
}
|
}
|
||||||
|
|
||||||
// ImgStyle style to apply to the image.
|
// ImgStyle style to apply to the image.
|
||||||
@ -76,11 +81,11 @@ func (i EPUBImage) ImgStyle(viewWidth, viewHeight int, align string) string {
|
|||||||
relWidth, relHeight := i.RelSize(viewWidth, viewHeight)
|
relWidth, relHeight := i.RelSize(viewWidth, viewHeight)
|
||||||
marginW, marginH := float64(viewWidth-relWidth)/2, float64(viewHeight-relHeight)/2
|
marginW, marginH := float64(viewWidth-relWidth)/2, float64(viewHeight-relHeight)/2
|
||||||
|
|
||||||
var style []string
|
style := make([]string, 0, 4)
|
||||||
|
|
||||||
style = append(style, fmt.Sprintf("width:%dpx", relWidth))
|
style = append(style, "width:"+utils.IntToString(relWidth)+"px")
|
||||||
style = append(style, fmt.Sprintf("height:%dpx", relHeight))
|
style = append(style, "height:"+utils.IntToString(relHeight)+"px")
|
||||||
style = append(style, fmt.Sprintf("top:%.2f%%", marginH*100/float64(viewHeight)))
|
style = append(style, "top:"+utils.FloatToString(marginH*100/float64(viewHeight), 2)+"%")
|
||||||
if align == "" {
|
if align == "" {
|
||||||
switch i.Position {
|
switch i.Position {
|
||||||
case "rendition:page-spread-left":
|
case "rendition:page-spread-left":
|
||||||
@ -88,7 +93,7 @@ func (i EPUBImage) ImgStyle(viewWidth, viewHeight int, align string) string {
|
|||||||
case "rendition:page-spread-right":
|
case "rendition:page-spread-right":
|
||||||
style = append(style, "left:0")
|
style = append(style, "left:0")
|
||||||
default:
|
default:
|
||||||
style = append(style, fmt.Sprintf("left:%.2f%%", marginW*100/float64(viewWidth)))
|
style = append(style, "left:"+utils.FloatToString(marginW*100/float64(viewWidth), 2)+"%")
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
style = append(style, align)
|
style = append(style, align)
|
||||||
|
@ -404,7 +404,7 @@ func (e EPUBImageProcessor) loadPdf() (totalImages int, output chan task, err er
|
|||||||
}
|
}
|
||||||
|
|
||||||
totalImages = len(pdf.Pages())
|
totalImages = len(pdf.Pages())
|
||||||
pageFmt := fmt.Sprintf("page %%0%dd", len(fmt.Sprintf("%d", totalImages)))
|
pageFmt := "page " + utils.FormatNumberOfDigits(totalImages)
|
||||||
output = make(chan task)
|
output = make(chan task)
|
||||||
go func() {
|
go func() {
|
||||||
defer close(output)
|
defer close(output)
|
||||||
|
@ -2,7 +2,6 @@
|
|||||||
package epubimageprocessor
|
package epubimageprocessor
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
|
||||||
"image"
|
"image"
|
||||||
"image/color"
|
"image/color"
|
||||||
"image/draw"
|
"image/draw"
|
||||||
@ -324,7 +323,7 @@ func (e EPUBImageProcessor) CoverTitleData(o CoverTitleDataOptions) (epubzip.Ima
|
|||||||
g.Draw(dst, o.Src)
|
g.Draw(dst, o.Src)
|
||||||
|
|
||||||
return epubzip.CompressImage(
|
return epubzip.CompressImage(
|
||||||
fmt.Sprintf("OEBPS/Images/%s.%s", o.Name, e.Image.Format),
|
"OEBPS/Images/"+o.Name+"."+e.Image.Format,
|
||||||
e.Image.Format,
|
e.Image.Format,
|
||||||
dst,
|
dst,
|
||||||
e.Image.Quality,
|
e.Image.Quality,
|
||||||
|
@ -1,8 +1,6 @@
|
|||||||
// Package epuboptions EPUBOptions for EPUB creation.
|
// Package epuboptions EPUBOptions for EPUB creation.
|
||||||
package epuboptions
|
package epuboptions
|
||||||
|
|
||||||
import "fmt"
|
|
||||||
|
|
||||||
type EPUBOptions struct {
|
type EPUBOptions struct {
|
||||||
Input string
|
Input string
|
||||||
Output string
|
Output string
|
||||||
@ -29,5 +27,5 @@ func (o EPUBOptions) WorkersRatio(pct int) (nbWorkers int) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (o EPUBOptions) ImgStorage() string {
|
func (o EPUBOptions) ImgStorage() string {
|
||||||
return fmt.Sprintf("%s.tmp", o.Output)
|
return o.Output + ".tmp"
|
||||||
}
|
}
|
||||||
|
@ -20,3 +20,7 @@ type Image struct {
|
|||||||
Format string
|
Format string
|
||||||
AppleBookCompatibility bool
|
AppleBookCompatibility bool
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (i Image) MediaType() string {
|
||||||
|
return "image/" + i.Format
|
||||||
|
}
|
||||||
|
@ -1,8 +1,20 @@
|
|||||||
package epuboptions
|
package epuboptions
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/celogeek/go-comic-converter/v2/internal/pkg/utils"
|
||||||
|
)
|
||||||
|
|
||||||
type View struct {
|
type View struct {
|
||||||
Width, Height int
|
Width, Height int
|
||||||
AspectRatio float64
|
AspectRatio float64
|
||||||
PortraitOnly bool
|
PortraitOnly bool
|
||||||
Color Color
|
Color Color
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (v View) Dimension() string {
|
||||||
|
return utils.IntToString(v.Width) + "x" + utils.IntToString(v.Height)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (v View) Port() string {
|
||||||
|
return "width=" + utils.IntToString(v.Width) + ",height=" + utils.IntToString(v.Height)
|
||||||
|
}
|
||||||
|
@ -38,15 +38,19 @@ func New(o Options) EPUBProgress {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fmtJob := fmt.Sprintf("%%0%dd", len(fmt.Sprint(o.TotalJob)))
|
fmtJob := utils.FormatNumberOfDigits(o.TotalJob)
|
||||||
fmtDesc := fmt.Sprintf("[%s/%s] %%-15s", fmtJob, fmtJob)
|
|
||||||
return progressbar.NewOptions(o.Max,
|
return progressbar.NewOptions(o.Max,
|
||||||
progressbar.OptionSetWriter(os.Stderr),
|
progressbar.OptionSetWriter(os.Stderr),
|
||||||
progressbar.OptionThrottle(65*time.Millisecond),
|
progressbar.OptionThrottle(65*time.Millisecond),
|
||||||
progressbar.OptionOnCompletion(func() {
|
progressbar.OptionOnCompletion(func() {
|
||||||
utils.Println()
|
utils.Println()
|
||||||
}),
|
}),
|
||||||
progressbar.OptionSetDescription(fmt.Sprintf(fmtDesc, o.CurrentJob, o.TotalJob, o.Description)),
|
progressbar.OptionSetDescription(fmt.Sprintf(
|
||||||
|
"["+fmtJob+"/"+fmtJob+"] %-15s",
|
||||||
|
o.CurrentJob,
|
||||||
|
o.TotalJob,
|
||||||
|
o.Description,
|
||||||
|
)),
|
||||||
progressbar.OptionSetWidth(60),
|
progressbar.OptionSetWidth(60),
|
||||||
progressbar.OptionShowCount(),
|
progressbar.OptionShowCount(),
|
||||||
progressbar.OptionSetRenderBlankState(true),
|
progressbar.OptionSetRenderBlankState(true),
|
||||||
|
@ -1,12 +1,11 @@
|
|||||||
package epubtemplates
|
package epubtemplates
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
|
||||||
|
|
||||||
"github.com/beevik/etree"
|
"github.com/beevik/etree"
|
||||||
|
|
||||||
"github.com/celogeek/go-comic-converter/v2/internal/pkg/epubimage"
|
"github.com/celogeek/go-comic-converter/v2/internal/pkg/epubimage"
|
||||||
"github.com/celogeek/go-comic-converter/v2/internal/pkg/epuboptions"
|
"github.com/celogeek/go-comic-converter/v2/internal/pkg/epuboptions"
|
||||||
|
"github.com/celogeek/go-comic-converter/v2/internal/pkg/utils"
|
||||||
)
|
)
|
||||||
|
|
||||||
type Content struct {
|
type Content struct {
|
||||||
@ -98,9 +97,9 @@ func (o Content) getMeta() []tag {
|
|||||||
{"meta", tagAttrs{"property": "schema:accessibilityHazard"}, "noSoundHazard"},
|
{"meta", tagAttrs{"property": "schema:accessibilityHazard"}, "noSoundHazard"},
|
||||||
{"meta", tagAttrs{"name": "book-type", "content": "comic"}, ""},
|
{"meta", tagAttrs{"name": "book-type", "content": "comic"}, ""},
|
||||||
{"opf:meta", tagAttrs{"name": "fixed-layout", "content": "true"}, ""},
|
{"opf:meta", tagAttrs{"name": "fixed-layout", "content": "true"}, ""},
|
||||||
{"opf:meta", tagAttrs{"name": "original-resolution", "content": fmt.Sprintf("%dx%d", o.ImageOptions.View.Width, o.ImageOptions.View.Height)}, ""},
|
{"opf:meta", tagAttrs{"name": "original-resolution", "content": o.ImageOptions.View.Dimension()}, ""},
|
||||||
{"dc:title", tagAttrs{}, o.Title},
|
{"dc:title", tagAttrs{}, o.Title},
|
||||||
{"dc:identifier", tagAttrs{"id": "ean"}, fmt.Sprintf("urn:uuid:%s", o.UID)},
|
{"dc:identifier", tagAttrs{"id": "ean"}, "urn:uuid:" + o.UID},
|
||||||
{"dc:language", tagAttrs{}, "en"},
|
{"dc:language", tagAttrs{}, "en"},
|
||||||
{"dc:creator", tagAttrs{}, o.Author},
|
{"dc:creator", tagAttrs{}, o.Author},
|
||||||
{"dc:publisher", tagAttrs{}, o.Publisher},
|
{"dc:publisher", tagAttrs{}, o.Publisher},
|
||||||
@ -134,7 +133,7 @@ func (o Content) getMeta() []tag {
|
|||||||
metas = append(
|
metas = append(
|
||||||
metas,
|
metas,
|
||||||
tag{"meta", tagAttrs{"name": "calibre:series", "content": o.Title}, ""},
|
tag{"meta", tagAttrs{"name": "calibre:series", "content": o.Title}, ""},
|
||||||
tag{"meta", tagAttrs{"name": "calibre:series_index", "content": fmt.Sprint(o.Current)}, ""},
|
tag{"meta", tagAttrs{"name": "calibre:series_index", "content": utils.IntToString(o.Current)}, ""},
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -145,7 +144,7 @@ func (o Content) getManifest() []tag {
|
|||||||
var imageTags, pageTags, spaceTags []tag
|
var imageTags, pageTags, spaceTags []tag
|
||||||
addTag := func(img epubimage.EPUBImage, withSpace bool) {
|
addTag := func(img epubimage.EPUBImage, withSpace bool) {
|
||||||
imageTags = append(imageTags,
|
imageTags = append(imageTags,
|
||||||
tag{"item", tagAttrs{"id": img.ImgKey(), "href": img.ImgPath(), "media-type": fmt.Sprintf("image/%s", o.ImageOptions.Format)}, ""},
|
tag{"item", tagAttrs{"id": img.ImgKey(), "href": img.ImgPath(), "media-type": o.ImageOptions.MediaType()}, ""},
|
||||||
)
|
)
|
||||||
pageTags = append(pageTags,
|
pageTags = append(pageTags,
|
||||||
tag{"item", tagAttrs{"id": img.PageKey(), "href": img.PagePath(), "media-type": "application/xhtml+xml"}, ""},
|
tag{"item", tagAttrs{"id": img.PageKey(), "href": img.PagePath(), "media-type": "application/xhtml+xml"}, ""},
|
||||||
@ -161,13 +160,13 @@ func (o Content) getManifest() []tag {
|
|||||||
{"item", tagAttrs{"id": "toc", "href": "toc.xhtml", "properties": "nav", "media-type": "application/xhtml+xml"}, ""},
|
{"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": "css", "href": "Text/style.css", "media-type": "text/css"}, ""},
|
||||||
{"item", tagAttrs{"id": "page_cover", "href": "Text/cover.xhtml", "media-type": "application/xhtml+xml"}, ""},
|
{"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)}, ""},
|
{"item", tagAttrs{"id": "img_cover", "href": "Images/cover." + o.ImageOptions.Format, "media-type": o.ImageOptions.MediaType()}, ""},
|
||||||
}
|
}
|
||||||
|
|
||||||
if o.HasTitlePage {
|
if o.HasTitlePage {
|
||||||
items = append(items,
|
items = append(items,
|
||||||
tag{"item", tagAttrs{"id": "page_title", "href": "Text/title.xhtml", "media-type": "application/xhtml+xml"}, ""},
|
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)}, ""},
|
tag{"item", tagAttrs{"id": "img_title", "href": "Images/title." + o.ImageOptions.Format, "media-type": o.ImageOptions.MediaType()}, ""},
|
||||||
)
|
)
|
||||||
|
|
||||||
if !o.ImageOptions.View.PortraitOnly {
|
if !o.ImageOptions.View.PortraitOnly {
|
||||||
@ -212,7 +211,7 @@ func (o Content) getSpineAuto() []tag {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
getSpreadBlank := func() string {
|
getSpreadBlank := func() string {
|
||||||
return fmt.Sprintf("%s layout-blank", getSpread(false))
|
return getSpread(false) + " layout-blank"
|
||||||
}
|
}
|
||||||
|
|
||||||
var spine []tag
|
var spine []tag
|
||||||
|
@ -3,6 +3,7 @@ package utils
|
|||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"os"
|
"os"
|
||||||
|
"strconv"
|
||||||
)
|
)
|
||||||
|
|
||||||
func Printf(format string, a ...interface{}) {
|
func Printf(format string, a ...interface{}) {
|
||||||
@ -12,3 +13,34 @@ func Printf(format string, a ...interface{}) {
|
|||||||
func Println(a ...interface{}) {
|
func Println(a ...interface{}) {
|
||||||
_, _ = fmt.Fprintln(os.Stderr, a...)
|
_, _ = fmt.Fprintln(os.Stderr, a...)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func IntToString(i int) string {
|
||||||
|
return strconv.FormatInt(int64(i), 10)
|
||||||
|
}
|
||||||
|
|
||||||
|
func FloatToString(f float64, precision int) string {
|
||||||
|
return strconv.FormatFloat(f, 'f', precision, 64)
|
||||||
|
}
|
||||||
|
|
||||||
|
func BoolToString(b bool) string {
|
||||||
|
if b {
|
||||||
|
return "true"
|
||||||
|
}
|
||||||
|
return "false"
|
||||||
|
}
|
||||||
|
|
||||||
|
func NumberOfDigits(i int) int {
|
||||||
|
x, count := 10, 1
|
||||||
|
if i < 0 {
|
||||||
|
i = -i
|
||||||
|
count++
|
||||||
|
}
|
||||||
|
for ; x <= i; count++ {
|
||||||
|
x *= 10
|
||||||
|
}
|
||||||
|
return count
|
||||||
|
}
|
||||||
|
|
||||||
|
func FormatNumberOfDigits(i int) string {
|
||||||
|
return "%0" + IntToString(NumberOfDigits(i)) + "d"
|
||||||
|
}
|
||||||
|
62
internal/pkg/utils/utils_test.go
Normal file
62
internal/pkg/utils/utils_test.go
Normal file
@ -0,0 +1,62 @@
|
|||||||
|
package utils
|
||||||
|
|
||||||
|
import "fmt"
|
||||||
|
|
||||||
|
func ExampleFloatToString() {
|
||||||
|
fmt.Println("test=" + FloatToString(3.14151617, 0) + "=")
|
||||||
|
fmt.Println("test=" + FloatToString(3.14151617, 1) + "=")
|
||||||
|
fmt.Println("test=" + FloatToString(3.14151617, 2) + "=")
|
||||||
|
fmt.Println("test=" + FloatToString(3.14151617, 4) + "=")
|
||||||
|
// Output: test=3=
|
||||||
|
// test=3.1=
|
||||||
|
// test=3.14=
|
||||||
|
// test=3.1415=
|
||||||
|
}
|
||||||
|
|
||||||
|
func ExampleIntToString() {
|
||||||
|
fmt.Println("test=" + IntToString(159) + "=")
|
||||||
|
// Output: test=159=
|
||||||
|
}
|
||||||
|
|
||||||
|
func ExampleNumberOfDigits() {
|
||||||
|
fmt.Println(NumberOfDigits(0))
|
||||||
|
fmt.Println(NumberOfDigits(4))
|
||||||
|
fmt.Println(NumberOfDigits(10))
|
||||||
|
fmt.Println(NumberOfDigits(14))
|
||||||
|
fmt.Println(NumberOfDigits(256))
|
||||||
|
fmt.Println(NumberOfDigits(2004))
|
||||||
|
fmt.Println(NumberOfDigits(-5))
|
||||||
|
fmt.Println(NumberOfDigits(-10))
|
||||||
|
fmt.Println(NumberOfDigits(-12))
|
||||||
|
|
||||||
|
// Output: 1
|
||||||
|
// 1
|
||||||
|
// 2
|
||||||
|
// 2
|
||||||
|
// 3
|
||||||
|
// 4
|
||||||
|
// 2
|
||||||
|
// 3
|
||||||
|
// 3
|
||||||
|
}
|
||||||
|
|
||||||
|
func ExampleFormatNumberOfDigits() {
|
||||||
|
fmt.Println(FormatNumberOfDigits(0))
|
||||||
|
fmt.Println(FormatNumberOfDigits(4))
|
||||||
|
fmt.Println(FormatNumberOfDigits(10))
|
||||||
|
fmt.Println(FormatNumberOfDigits(14))
|
||||||
|
fmt.Println(FormatNumberOfDigits(256))
|
||||||
|
fmt.Println(FormatNumberOfDigits(2004))
|
||||||
|
fmt.Println(FormatNumberOfDigits(-5))
|
||||||
|
fmt.Println(FormatNumberOfDigits(-10))
|
||||||
|
fmt.Println(FormatNumberOfDigits(-12))
|
||||||
|
// Output: %01d
|
||||||
|
// %01d
|
||||||
|
// %02d
|
||||||
|
// %02d
|
||||||
|
// %03d
|
||||||
|
// %04d
|
||||||
|
// %02d
|
||||||
|
// %03d
|
||||||
|
// %03d
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user