1
0
Fork 0
mirror of https://github.com/miniflux/v2.git synced 2025-08-06 17:41:00 +00:00
miniflux-v2/internal/reader/processor/utils.go

79 lines
1.8 KiB
Go

// SPDX-FileCopyrightText: Copyright The Miniflux Authors. All rights reserved.
// SPDX-License-Identifier: Apache-2.0
package processor // import "miniflux.app/v2/internal/reader/processor"
import (
"errors"
"fmt"
"strconv"
"strings"
"time"
"github.com/tdewolff/minify/v2"
"github.com/tdewolff/minify/v2/html"
)
// parseISO8601Duration parses a subset of ISO8601 durations, mainly for youtube video.
func parseISO8601Duration(duration string) (time.Duration, error) {
after, ok := strings.CutPrefix(duration, "PT")
if !ok {
return 0, errors.New("the period doesn't start with PT")
}
var d time.Duration
num := ""
for _, char := range after {
var val float64
var err error
switch char {
case 'Y', 'W', 'D':
return 0, fmt.Errorf("the '%c' specifier isn't supported", char)
case 'H':
if val, err = strconv.ParseFloat(num, 64); err != nil {
return 0, err
}
d += time.Duration(val) * time.Hour
num = ""
case 'M':
if val, err = strconv.ParseFloat(num, 64); err != nil {
return 0, err
}
d += time.Duration(val) * time.Minute
num = ""
case 'S':
if val, err = strconv.ParseFloat(num, 64); err != nil {
return 0, err
}
d += time.Duration(val) * time.Second
num = ""
case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '.':
num += string(char)
continue
default:
return 0, errors.New("invalid character in the period")
}
}
return d, nil
}
func minifyContent(content string) string {
m := minify.New()
// Options required to avoid breaking the HTML content.
m.Add("text/html", &html.Minifier{
KeepEndTags: true,
KeepQuotes: true,
KeepComments: false,
KeepSpecialComments: false,
KeepDefaultAttrVals: false,
})
if minifiedHTML, err := m.String("text/html", content); err == nil {
content = minifiedHTML
}
return content
}