utils.go 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  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. num := ""
  33. for _, char := range after {
  34. var val int
  35. var err error
  36. switch char {
  37. case 'Y', 'W', 'D':
  38. return 0, fmt.Errorf("the '%c' specifier isn't supported", char)
  39. case 'H':
  40. if val, err = strconv.Atoi(num); err != nil {
  41. return 0, err
  42. }
  43. d += time.Duration(val) * time.Hour
  44. num = ""
  45. case 'M':
  46. if val, err = strconv.Atoi(num); err != nil {
  47. return 0, err
  48. }
  49. d += time.Duration(val) * time.Minute
  50. num = ""
  51. case 'S':
  52. if val, err = strconv.Atoi(num); err != nil {
  53. return 0, err
  54. }
  55. d += time.Duration(val) * time.Second
  56. num = ""
  57. case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9':
  58. num += string(char)
  59. continue
  60. default:
  61. return 0, errors.New("invalid character in the period")
  62. }
  63. }
  64. return d, nil
  65. }
  66. func minifyContent(content string) string {
  67. // when an error occurs, String returns the original content.
  68. ret, _ := htmlMinifier.String("text/html", content)
  69. return ret
  70. }