package templates import ( "encoding/json" "fmt" ) func readerInitExpr(metadata ReaderMetadata, progress ReadingProgress, bookmarks []Bookmark) string { config := map[string]interface{}{ "mediaItemId": metadata.MediaItemID, "fileUrl": metadata.FileURL, "formatGroup": metadata.FormatGroup, "readingDirection": metadata.ReadingDirection, "mangaType": metadata.MangaType, } if progress.Percentage > 0 { config["savedPercentage"] = progress.Percentage / 100 } if progress.EpubCfi != "" { config["savedCfi"] = progress.EpubCfi } // Fixed-layout & comic formats: the page index is the canonical, exact // locator (pages are fixed images). Pass it so the reader restores by page. if (metadata.FormatGroup == "fixed_layout" || metadata.FormatGroup == "comic_archive") && progress.CurrentPage > 0 { config["savedPage"] = progress.CurrentPage if progress.TotalPages > 0 { config["savedTotalPages"] = progress.TotalPages } } if len(bookmarks) > 0 { items := make([]map[string]interface{}, 0, len(bookmarks)) for _, b := range bookmarks { var page any if b.PageNumber != nil { page = *b.PageNumber } items = append(items, map[string]interface{}{ "id": b.ID, "title": b.Title, "positionLabel": b.Position, "cfi": b.CfiPosition, "page": page, }) } config["bookmarks"] = items } jsonBytes, _ := json.Marshal(config) return fmt.Sprintf("initReader(%s)", string(jsonBytes)) } templ Reader(user User, metadata ReaderMetadata, progress ReadingProgress, bookmarks []Bookmark) {