File: utils.go

package info (click to toggle)
miniflux 2.2.16-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 6,188 kB
  • sloc: xml: 4,853; javascript: 1,158; sh: 257; makefile: 161
file content (79 lines) | stat: -rw-r--r-- 1,824 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
// 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 int
		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.Atoi(num); err != nil {
				return 0, err
			}
			d += time.Duration(val) * time.Hour
			num = ""
		case 'M':
			if val, err = strconv.Atoi(num); err != nil {
				return 0, err
			}
			d += time.Duration(val) * time.Minute
			num = ""
		case 'S':
			if val, err = strconv.Atoi(num); 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
}