utils.go 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  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. // parseISO8601Duration parses a subset of ISO8601 durations, mainly for youtube video.
  14. func parseISO8601Duration(duration string) (time.Duration, error) {
  15. after, ok := strings.CutPrefix(duration, "PT")
  16. if !ok {
  17. return 0, errors.New("the period doesn't start with PT")
  18. }
  19. var d time.Duration
  20. num := ""
  21. for _, char := range after {
  22. var val int
  23. var err error
  24. switch char {
  25. case 'Y', 'W', 'D':
  26. return 0, fmt.Errorf("the '%c' specifier isn't supported", char)
  27. case 'H':
  28. if val, err = strconv.Atoi(num); err != nil {
  29. return 0, err
  30. }
  31. d += time.Duration(val) * time.Hour
  32. num = ""
  33. case 'M':
  34. if val, err = strconv.Atoi(num); err != nil {
  35. return 0, err
  36. }
  37. d += time.Duration(val) * time.Minute
  38. num = ""
  39. case 'S':
  40. if val, err = strconv.Atoi(num); err != nil {
  41. return 0, err
  42. }
  43. d += time.Duration(val) * time.Second
  44. num = ""
  45. case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9':
  46. num += string(char)
  47. continue
  48. default:
  49. return 0, errors.New("invalid character in the period")
  50. }
  51. }
  52. return d, nil
  53. }
  54. func minifyContent(content string) string {
  55. m := minify.New()
  56. // Options required to avoid breaking the HTML content.
  57. m.Add("text/html", &html.Minifier{
  58. KeepEndTags: true,
  59. KeepQuotes: true,
  60. KeepComments: false,
  61. KeepSpecialComments: false,
  62. KeepDefaultAttrVals: false,
  63. })
  64. if minifiedHTML, err := m.String("text/html", content); err == nil {
  65. content = minifiedHTML
  66. }
  67. return content
  68. }