feat(sync): serve web highlight colors to KOReader (mapped to its palette)
Reverses the earlier "no colors to the device" decision now that the echo machinery makes it safe: GetMetadata maps the stored web hex to KOReader's fixed color names (#ce93d8→purple, #90caf9→blue, #a5d6a7→green, #ffd54f→yellow; pink maps to purple as the closest — round-trip drift is prevented on the device by echo suppression, and a device edit still wins). mapColorToKOReader restored for serving; ingest (name→hex, preserve-on-echo) unchanged.
This commit is contained in:
@@ -993,10 +993,12 @@ func (h *KOReaderHandler) GetMetadata(c *echo.Context) error {
|
|||||||
Text: ann.SelectionText,
|
Text: ann.SelectionText,
|
||||||
Pos0: pos0,
|
Pos0: pos0,
|
||||||
Pos1: pos1,
|
Pos1: pos1,
|
||||||
// No color served: devices render their own default and
|
// Web colors flow to the device, mapped to KOReader's named
|
||||||
// cannot round-trip web colors — the web color only changes
|
// palette. Round-trip safety: the device suppresses the color
|
||||||
// when the highlight is edited on the device (push carries
|
// when echoing un-edited applied entries (a pink→purple
|
||||||
// the device color, ingested with the name→hex map).
|
// palette mismatch must not rewrite the stored hex), and an
|
||||||
|
// actual device edit pushes its color, which wins.
|
||||||
|
Color: mapColorToKOReader(ann.Color.String),
|
||||||
Datetime: ann.CreatedAt.Time.Format(time.RFC3339),
|
Datetime: ann.CreatedAt.Time.Format(time.RFC3339),
|
||||||
DedupKey: ann.DedupKey.String,
|
DedupKey: ann.DedupKey.String,
|
||||||
}
|
}
|
||||||
@@ -1196,6 +1198,25 @@ func mapColorFromKOReader(name string) string {
|
|||||||
return "#ffd54f"
|
return "#ffd54f"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var koreaderColorFromHex = map[string]string{
|
||||||
|
"#ffd54f": "yellow",
|
||||||
|
"#a5d6a7": "green",
|
||||||
|
"#90caf9": "blue",
|
||||||
|
"#ce93d8": "purple",
|
||||||
|
"#f48fb1": "purple",
|
||||||
|
}
|
||||||
|
|
||||||
|
// mapColorToKOReader normalizes a web hex swatch to the nearest KOReader
|
||||||
|
// color name (default yellow) when serving to devices. Pink maps to purple
|
||||||
|
// (the palette's closest); round-trip drift is prevented on the device by
|
||||||
|
// suppressing echo colors for un-edited applied entries.
|
||||||
|
func mapColorToKOReader(hex string) string {
|
||||||
|
if name, ok := koreaderColorFromHex[strings.ToLower(strings.TrimSpace(hex))]; ok {
|
||||||
|
return name
|
||||||
|
}
|
||||||
|
return "yellow"
|
||||||
|
}
|
||||||
|
|
||||||
// 1. A device-native CRE xpointer ("/body/...") in startPosition wins —
|
// 1. A device-native CRE xpointer ("/body/...") in startPosition wins —
|
||||||
// round-trip identical for KOReader-pushed annotations (converting the
|
// round-trip identical for KOReader-pushed annotations (converting the
|
||||||
// stored CFI instead could drift and duplicate on the device).
|
// stored CFI instead could drift and duplicate on the device).
|
||||||
|
|||||||
Reference in New Issue
Block a user