utils.go 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. // SPDX-FileCopyrightText: Copyright The Miniflux Authors. All rights reserved.
  2. // SPDX-License-Identifier: Apache-2.0
  3. package processor // import "miniflux.app/v2/internal/reader/processor"
  4. import (
  5. "errors"
  6. "fmt"
  7. "strconv"
  8. "strings"
  9. "time"
  10. "github.com/tdewolff/minify/v2"
  11. "github.com/tdewolff/minify/v2/html"
  12. )
  13. var htmlMinifier = newHTMLMinifier()
  14. func newHTMLMinifier() *minify.M {
  15. m := minify.New()
  16. m.Add("text/html", &html.Minifier{
  17. KeepEndTags: true,
  18. KeepQuotes: true,
  19. KeepComments: false,
  20. KeepSpecialComments: false,
  21. KeepDefaultAttrVals: false,
  22. })
  23. return m
  24. }
  25. // parseISO8601Duration parses a subset of ISO8601 durations, mainly for youtube video.
  26. func parseISO8601Duration(duration string) (time.Duration, error) {
  27. after, ok := strings.CutPrefix(duration, "PT")
  28. if !ok {
  29. return 0, errors.New("the period doesn't start with PT")
  30. }
  31. var d time.Duration
  32. start := 0
  33. for i := 0; i < len(after); i++ {
  34. var unit time.Duration
  35. switch after[i] {
  36. case 'Y', 'W', 'D':
  37. return 0, fmt.Errorf("the '%c' specifier isn't supported", after[i])
  38. case 'H':
  39. unit = time.Hour
  40. case 'M':
  41. unit = time.Minute
  42. case 'S':
  43. unit = time.Second
  44. case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9':
  45. continue
  46. default:
  47. return 0, errors.New("invalid character in the period")
  48. }
  49. val, err := strconv.Atoi(after[start:i])
  50. if err != nil {
  51. return 0, err
  52. }
  53. d += time.Duration(val) * unit
  54. start = i + 1
  55. }
  56. return d, nil
  57. }
  58. func minifyContent(content string) string {
  59. // when an error occurs, String returns the original content.
  60. ret, _ := htmlMinifier.String("text/html", content)
  61. return ret
  62. }