mirror of
https://github.com/celogeek/go-comic-converter.git
synced 2025-05-25 00:02:37 +02:00
75 lines
1.9 KiB
Go
75 lines
1.9 KiB
Go
package epubtemplates
|
|
|
|
import (
|
|
"path/filepath"
|
|
"strings"
|
|
|
|
"github.com/beevik/etree"
|
|
|
|
"github.com/celogeek/go-comic-converter/v3/internal/pkg/epubimage"
|
|
)
|
|
|
|
// Toc create toc
|
|
//
|
|
//goland:noinspection HttpUrlsUsage
|
|
func Toc(title string, hasTitle bool, stripFirstDirectoryFromToc bool, images []epubimage.EPUBImage) string {
|
|
doc := etree.NewDocument()
|
|
doc.CreateProcInst("xml", `version="1.0" encoding="UTF-8"`)
|
|
doc.CreateDirective("DOCTYPE html")
|
|
|
|
html := doc.CreateElement("html")
|
|
html.CreateAttr("xmlns", "http://www.w3.org/1999/xhtml")
|
|
html.CreateAttr("xmlns:epub", "http://www.idpf.org/2007/ops")
|
|
|
|
html.CreateElement("head").CreateElement("title").CreateText(title)
|
|
body := html.CreateElement("body")
|
|
nav := body.CreateElement("nav")
|
|
nav.CreateAttr("epub:type", "toc")
|
|
nav.CreateAttr("id", "toc")
|
|
nav.CreateElement("h2").CreateText(title)
|
|
|
|
ol := etree.NewElement("ol")
|
|
paths := map[string]*etree.Element{".": ol}
|
|
for _, img := range images {
|
|
currentPath := "."
|
|
for _, path := range strings.Split(img.Path, string(filepath.Separator)) {
|
|
parentPath := currentPath
|
|
currentPath = filepath.Join(currentPath, path)
|
|
if _, ok := paths[currentPath]; ok {
|
|
continue
|
|
}
|
|
t := paths[parentPath].CreateElement("li")
|
|
link := t.CreateElement("a")
|
|
link.CreateAttr("href", img.PagePath())
|
|
link.CreateText(path)
|
|
paths[currentPath] = t.CreateElement("ol")
|
|
}
|
|
}
|
|
|
|
if len(ol.ChildElements()) == 1 && stripFirstDirectoryFromToc {
|
|
ol = ol.FindElement("/li/ol")
|
|
}
|
|
|
|
for _, v := range ol.FindElements("//ol") {
|
|
if len(v.ChildElements()) == 0 {
|
|
v.Parent().RemoveChild(v)
|
|
}
|
|
}
|
|
|
|
beginning := etree.NewElement("li")
|
|
beginningLink := beginning.CreateElement("a")
|
|
if hasTitle {
|
|
beginningLink.CreateAttr("href", "Text/title.xhtml")
|
|
} else {
|
|
beginningLink.CreateAttr("href", images[0].PagePath())
|
|
}
|
|
beginningLink.CreateText(title)
|
|
ol.InsertChildAt(0, beginning)
|
|
|
|
nav.AddChild(ol)
|
|
|
|
doc.Indent(2)
|
|
r, _ := doc.WriteToString()
|
|
return r
|
|
}
|