utils.go 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. package feed
  2. import (
  3. "errors"
  4. "fmt"
  5. "net/url"
  6. "slices"
  7. "strings"
  8. )
  9. var (
  10. ErrNoContent = errors.New("failed to retrieve any content")
  11. ErrPartialContent = errors.New("failed to retrieve some of the content")
  12. )
  13. func percentChange(current, previous float64) float64 {
  14. return (current/previous - 1) * 100
  15. }
  16. func extractDomainFromUrl(u string) string {
  17. if u == "" {
  18. return ""
  19. }
  20. parsed, err := url.Parse(u)
  21. if err != nil {
  22. return ""
  23. }
  24. return strings.TrimPrefix(strings.ToLower(parsed.Host), "www.")
  25. }
  26. func SvgPolylineCoordsFromYValues(width float64, height float64, values []float64) string {
  27. if len(values) < 2 {
  28. return ""
  29. }
  30. verticalPadding := height * 0.02
  31. height -= verticalPadding * 2
  32. coordinates := make([]string, len(values))
  33. distanceBetweenPoints := width / float64(len(values)-1)
  34. min := slices.Min(values)
  35. max := slices.Max(values)
  36. for i := range values {
  37. coordinates[i] = fmt.Sprintf(
  38. "%.2f,%.2f",
  39. float64(i)*distanceBetweenPoints,
  40. ((max-values[i])/(max-min))*height+verticalPadding,
  41. )
  42. }
  43. return strings.Join(coordinates, " ")
  44. }
  45. func maybeCopySliceWithoutZeroValues[T int | float64](values []T) []T {
  46. if len(values) == 0 {
  47. return values
  48. }
  49. for i := range values {
  50. if values[i] != 0 {
  51. continue
  52. }
  53. c := make([]T, 0, len(values)-1)
  54. for i := range values {
  55. if values[i] != 0 {
  56. c = append(c, values[i])
  57. }
  58. }
  59. return c
  60. }
  61. return values
  62. }
  63. func limitStringLength(s string, max int) (string, bool) {
  64. asRunes := []rune(s)
  65. if len(asRunes) > max {
  66. return string(asRunes[:max]), true
  67. }
  68. return s, false
  69. }