Browse Source

Avoid stretched image if specified width is larger than Miniflux's layout

Frédéric Guillot 3 years ago
parent
commit
c0eab5ebc5
2 changed files with 39 additions and 3 deletions
  1. 28 2
      reader/sanitizer/sanitizer.go
  2. 11 1
      reader/sanitizer/sanitizer_test.go

+ 28 - 2
reader/sanitizer/sanitizer.go

@@ -100,6 +100,12 @@ func Sanitize(baseURL, input string) string {
 func sanitizeAttributes(baseURL, tagName string, attributes []html.Attribute) ([]string, string) {
 	var htmlAttrs, attrNames []string
 	var err error
+	var isImageLargerThanLayout bool
+
+	if tagName == "img" {
+		imgWidth := getIntegerAttributeValue("width", attributes)
+		isImageLargerThanLayout = imgWidth > 750
+	}
 
 	for _, attribute := range attributes {
 		value := attribute.Val
@@ -112,8 +118,14 @@ func sanitizeAttributes(baseURL, tagName string, attributes []html.Attribute) ([
 			value = sanitizeSrcsetAttr(baseURL, value)
 		}
 
-		if tagName == "img" && (attribute.Key == "width" || attribute.Key == "height") && !isPositiveInteger(value) {
-			continue
+		if tagName == "img" && (attribute.Key == "width" || attribute.Key == "height") {
+			if !isPositiveInteger(value) {
+				continue
+			}
+
+			if isImageLargerThanLayout {
+				continue
+			}
 		}
 
 		if isExternalResourceAttribute(attribute.Key) {
@@ -486,3 +498,17 @@ func isPositiveInteger(value string) bool {
 	}
 	return false
 }
+
+func getAttributeValue(name string, attributes []html.Attribute) string {
+	for _, attribute := range attributes {
+		if attribute.Key == name {
+			return attribute.Val
+		}
+	}
+	return ""
+}
+
+func getIntegerAttributeValue(name string, attributes []html.Attribute) int {
+	number, _ := strconv.Atoi(getAttributeValue(name, attributes))
+	return number
+}

+ 11 - 1
reader/sanitizer/sanitizer_test.go

@@ -25,6 +25,16 @@ func TestImgWithWidthAndHeightAttribute(t *testing.T) {
 	}
 }
 
+func TestImgWithWidthAndHeightAttributeLargerThanMinifluxLayout(t *testing.T) {
+	input := `<img src="https://example.org/image.png" width="1200" height="675">`
+	expected := `<img src="https://example.org/image.png" loading="lazy">`
+	output := Sanitize("http://example.org/", input)
+
+	if output != expected {
+		t.Errorf(`Wrong output: %s`, output)
+	}
+}
+
 func TestImgWithIncorrectWidthAndHeightAttribute(t *testing.T) {
 	input := `<img src="https://example.org/image.png" width="10px" height="20px">`
 	expected := `<img src="https://example.org/image.png" loading="lazy">`
@@ -77,7 +87,7 @@ func TestSourceWithSrcsetAndMedia(t *testing.T) {
 
 func TestMediumImgWithSrcset(t *testing.T) {
 	input := `<img alt="Image for post" class="t u v ef aj" src="https://miro.medium.com/max/5460/1*aJ9JibWDqO81qMfNtqgqrw.jpeg" srcset="https://miro.medium.com/max/552/1*aJ9JibWDqO81qMfNtqgqrw.jpeg 276w, https://miro.medium.com/max/1000/1*aJ9JibWDqO81qMfNtqgqrw.jpeg 500w" sizes="500px" width="2730" height="3407">`
-	expected := `<img alt="Image for post" src="https://miro.medium.com/max/5460/1*aJ9JibWDqO81qMfNtqgqrw.jpeg" srcset="https://miro.medium.com/max/552/1*aJ9JibWDqO81qMfNtqgqrw.jpeg 276w, https://miro.medium.com/max/1000/1*aJ9JibWDqO81qMfNtqgqrw.jpeg 500w" sizes="500px" width="2730" height="3407" loading="lazy">`
+	expected := `<img alt="Image for post" src="https://miro.medium.com/max/5460/1*aJ9JibWDqO81qMfNtqgqrw.jpeg" srcset="https://miro.medium.com/max/552/1*aJ9JibWDqO81qMfNtqgqrw.jpeg 276w, https://miro.medium.com/max/1000/1*aJ9JibWDqO81qMfNtqgqrw.jpeg 500w" sizes="500px" loading="lazy">`
 	output := Sanitize("http://example.org/", input)
 
 	if output != expected {