2025-01-24 00:18:41 +00:00
|
|
|
package html
|
|
|
|
|
|
|
|
import (
|
|
|
|
"embed"
|
2025-01-30 06:21:17 +00:00
|
|
|
"encoding/json"
|
2025-02-05 20:16:42 +00:00
|
|
|
"fmt"
|
2025-01-24 00:18:41 +00:00
|
|
|
"html/template"
|
|
|
|
"io"
|
2025-01-30 06:21:17 +00:00
|
|
|
"log"
|
2025-01-25 05:27:26 +00:00
|
|
|
"time"
|
2025-01-25 05:41:46 +00:00
|
|
|
|
|
|
|
"github.com/Jaculabilis/intake/core"
|
2025-01-24 00:18:41 +00:00
|
|
|
)
|
|
|
|
|
2025-01-25 05:27:26 +00:00
|
|
|
func rawHtml(str string) template.HTML {
|
|
|
|
return template.HTML(str)
|
|
|
|
}
|
|
|
|
|
2025-02-05 20:16:42 +00:00
|
|
|
func dateFormat(tm time.Time) string {
|
2025-01-25 05:27:26 +00:00
|
|
|
return tm.Format(time.DateTime)
|
|
|
|
}
|
|
|
|
|
2025-02-05 20:16:42 +00:00
|
|
|
func tsToDate(t int) time.Time {
|
|
|
|
return time.Unix(int64(t), 0).UTC()
|
|
|
|
}
|
|
|
|
|
|
|
|
func until(tm time.Time) string {
|
2025-02-06 15:28:53 +00:00
|
|
|
now := time.Now() // TODO pass this value in
|
|
|
|
dur := tm.Sub(now).Round(time.Second)
|
2025-02-05 20:16:42 +00:00
|
|
|
|
|
|
|
var format string
|
|
|
|
if dur < 0 {
|
|
|
|
format = "%s ago"
|
|
|
|
dur = dur.Abs()
|
|
|
|
} else {
|
|
|
|
format = "in %s"
|
|
|
|
}
|
|
|
|
|
|
|
|
var length string
|
|
|
|
if dur.Hours() > 24 {
|
|
|
|
length = fmt.Sprintf("%dd", int(dur.Hours()/24))
|
|
|
|
} else {
|
|
|
|
length = dur.String()
|
|
|
|
}
|
|
|
|
|
|
|
|
return fmt.Sprintf(format, length)
|
|
|
|
}
|
|
|
|
|
2025-01-30 06:21:17 +00:00
|
|
|
func massDeactivateVals(items []core.Item) string {
|
|
|
|
var shorts []string
|
|
|
|
for _, item := range items {
|
|
|
|
shorts = append(shorts, core.FormatAsShort(item))
|
|
|
|
}
|
|
|
|
massDeac := struct {
|
|
|
|
Items []string `json:"items"`
|
|
|
|
}{shorts}
|
|
|
|
vals, err := json.Marshal(massDeac)
|
|
|
|
if err != nil {
|
|
|
|
log.Printf("error serializing mass deactivate list: %v", err)
|
|
|
|
}
|
|
|
|
return string(vals)
|
|
|
|
}
|
|
|
|
|
2025-02-07 16:17:51 +00:00
|
|
|
func page(i int, delta int) int {
|
|
|
|
i = i + delta
|
|
|
|
if i < 1 {
|
|
|
|
return 1
|
|
|
|
}
|
|
|
|
return i
|
|
|
|
}
|
|
|
|
|
2025-01-25 05:27:26 +00:00
|
|
|
var funcs = template.FuncMap{
|
2025-01-30 06:21:17 +00:00
|
|
|
"raw": rawHtml,
|
2025-02-05 20:16:42 +00:00
|
|
|
"dateFormat": dateFormat,
|
2025-01-30 06:21:17 +00:00
|
|
|
"tsToDate": tsToDate,
|
2025-02-05 20:16:42 +00:00
|
|
|
"until": until,
|
2025-01-30 06:21:17 +00:00
|
|
|
"massDeacVars": massDeactivateVals,
|
2025-02-07 16:17:51 +00:00
|
|
|
"page": page,
|
2025-01-25 05:27:26 +00:00
|
|
|
}
|
|
|
|
|
2025-01-24 15:15:54 +00:00
|
|
|
//go:embed intake.css
|
|
|
|
var Stylesheet []byte
|
|
|
|
|
2025-01-28 04:34:07 +00:00
|
|
|
//go:embed htmx.org@2.0.4.js
|
|
|
|
var Htmx []byte
|
|
|
|
|
2025-01-24 00:18:41 +00:00
|
|
|
//go:embed *.html
|
|
|
|
var templates embed.FS
|
|
|
|
|
2025-01-28 03:35:13 +00:00
|
|
|
func load(files ...string) *template.Template {
|
|
|
|
files = append([]string{"layout.html"}, files...)
|
|
|
|
return template.Must(template.New("layout.html").Funcs(funcs).ParseFS(templates, files...))
|
2025-01-24 00:18:41 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
var home = load("home.html")
|
|
|
|
|
2025-02-01 02:03:30 +00:00
|
|
|
type ChannelData struct {
|
|
|
|
Name string
|
|
|
|
Active int
|
|
|
|
}
|
|
|
|
|
2025-01-25 05:41:46 +00:00
|
|
|
type SourceData struct {
|
|
|
|
Name string
|
|
|
|
}
|
|
|
|
|
|
|
|
type HomeData struct {
|
2025-02-01 02:03:30 +00:00
|
|
|
Channels []ChannelData
|
|
|
|
Sources []SourceData
|
2025-01-25 05:41:46 +00:00
|
|
|
}
|
|
|
|
|
2025-02-06 06:12:49 +00:00
|
|
|
func Home(writer io.Writer, data HomeData) {
|
|
|
|
if err := home.Execute(writer, data); err != nil {
|
|
|
|
log.Printf("error: failed to render home: %v", err)
|
|
|
|
}
|
2025-01-24 00:18:41 +00:00
|
|
|
}
|
2025-01-25 05:27:26 +00:00
|
|
|
|
2025-01-28 03:35:13 +00:00
|
|
|
var feed = load("feed.html", "item.html")
|
2025-01-25 05:27:26 +00:00
|
|
|
|
2025-01-25 05:41:46 +00:00
|
|
|
type FeedData struct {
|
2025-02-07 16:17:51 +00:00
|
|
|
Items []core.Item
|
|
|
|
ShowHidden int
|
|
|
|
Page int
|
|
|
|
Count int
|
2025-01-25 05:41:46 +00:00
|
|
|
}
|
|
|
|
|
2025-02-06 06:12:49 +00:00
|
|
|
func Feed(writer io.Writer, data FeedData) {
|
|
|
|
if err := feed.Execute(writer, data); err != nil {
|
|
|
|
log.Printf("error: failed to render feed: %v", err)
|
|
|
|
}
|
2025-01-25 05:27:26 +00:00
|
|
|
}
|
2025-01-28 04:19:08 +00:00
|
|
|
|
|
|
|
var item = load("itemPage.html", "item.html")
|
|
|
|
|
|
|
|
type ItemData struct {
|
|
|
|
Item core.Item
|
|
|
|
}
|
|
|
|
|
2025-02-06 06:12:49 +00:00
|
|
|
func Item(writer io.Writer, data ItemData) {
|
|
|
|
if err := item.Execute(writer, data); err != nil {
|
|
|
|
log.Printf("error: failed to render item: %v", err)
|
|
|
|
}
|
2025-01-28 04:19:08 +00:00
|
|
|
}
|
2025-02-06 14:33:39 +00:00
|
|
|
|
|
|
|
var login = load("login.html")
|
|
|
|
|
|
|
|
type LoginData struct {
|
|
|
|
Error string
|
|
|
|
}
|
|
|
|
|
2025-02-07 22:16:43 +00:00
|
|
|
func Login(writer io.Writer, data LoginData) {
|
2025-02-06 14:33:39 +00:00
|
|
|
err := login.Execute(writer, data)
|
|
|
|
if err != nil {
|
2025-02-07 22:16:43 +00:00
|
|
|
log.Printf("error: failed to render login: %v", err)
|
2025-02-06 14:33:39 +00:00
|
|
|
}
|
|
|
|
}
|
2025-02-07 22:37:36 +00:00
|
|
|
|
|
|
|
var fetch = load("fetch.html")
|
|
|
|
|
|
|
|
type FetchData struct {
|
|
|
|
Source string
|
|
|
|
Added int
|
|
|
|
Updated int
|
|
|
|
Deleted int
|
|
|
|
Items []core.Item
|
|
|
|
}
|
|
|
|
|
|
|
|
func Fetch(writer io.Writer, data FetchData) {
|
|
|
|
if err := fetch.Execute(writer, data); err != nil {
|
|
|
|
log.Printf("error: failed to render fetch: %v", err)
|
|
|
|
}
|
|
|
|
}
|
2025-02-12 15:46:19 +00:00
|
|
|
|
|
|
|
var editChannels = load("editChannels.html")
|
|
|
|
|
|
|
|
type EditChannelsData struct {
|
|
|
|
Sources []string
|
|
|
|
ChannelSources map[string][]string
|
|
|
|
}
|
|
|
|
|
|
|
|
func EditChannels(writer io.Writer, data EditChannelsData) {
|
|
|
|
if err := editChannels.Execute(writer, data); err != nil {
|
|
|
|
log.Printf("error: failed to render edit channels: %v", err)
|
|
|
|
}
|
|
|
|
}
|