Files
ainovel-clients/state/timeline.go
voocel 27bd85ef90 init
2026-03-07 21:25:55 +08:00

52 lines
1.2 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package state
import (
"fmt"
"os"
"strings"
"github.com/voocel/ainovel-cli/domain"
)
// SaveTimeline 全量写入 timeline.json + timeline.md。
func (s *Store) SaveTimeline(events []domain.TimelineEvent) error {
if err := s.writeJSON("timeline.json", events); err != nil {
return err
}
return s.writeMarkdown("timeline.md", renderTimeline(events))
}
// LoadTimeline 读取时间线。
func (s *Store) LoadTimeline() ([]domain.TimelineEvent, error) {
var events []domain.TimelineEvent
if err := s.readJSON("timeline.json", &events); err != nil {
if os.IsNotExist(err) {
return nil, nil
}
return nil, err
}
return events, nil
}
// AppendTimelineEvents 追加时间线事件。
func (s *Store) AppendTimelineEvents(newEvents []domain.TimelineEvent) error {
existing, err := s.LoadTimeline()
if err != nil {
return err
}
return s.SaveTimeline(append(existing, newEvents...))
}
func renderTimeline(events []domain.TimelineEvent) string {
var b strings.Builder
b.WriteString("# 时间线\n\n")
for _, e := range events {
chars := ""
if len(e.Characters) > 0 {
chars = "" + strings.Join(e.Characters, "、") + ""
}
fmt.Fprintf(&b, "- **第 %d 章 [%s]**%s%s\n", e.Chapter, e.Time, e.Event, chars)
}
return b.String()
}