package main import ( "fmt" "net/url" "strings" "github.com/PuerkitoBio/goquery" ) func optimizeCss(htmlContent []byte) ([]byte, error) { doc, err := goquery.NewDocumentFromReader(strings.NewReader(string(htmlContent))) if err != nil { return nil, err } originalHTMLContent := string(htmlContent) // Replace img elements doc.Find("img").Each(func(i int, s *goquery.Selection) { //For each of the image element, replace the parent from p to div orginalParent, err := s.Parent().Html() if err != nil { fmt.Println("Error getting parent HTML:", err) return } src, exists := s.Attr("src") if !exists { fmt.Println("No src attribute found for img element") return } encodedSrc := (&url.URL{Path: src}).String() //Patch the bug in the parser that converts " />" to "/>" orginalParent = strings.ReplaceAll(orginalParent, "/>", " />") fmt.Println("
%s
", newClass, originalParagraph)) }) //Replace hr with ts-divider // Replace hr elements outside of code blocks doc.Find("hr").Each(func(i int, s *goquery.Selection) { parent := s.Parent() if parent.Is("code") { // Skip blocks
return
}
// Replace
with
originalHTMLContent = strings.ReplaceAll(originalHTMLContent, "
", "")
})
// Add ts-table to all table elements
doc.Find("table").Each(func(i int, s *goquery.Selection) {
class, exists := s.Attr("class")
var newClass string
if exists {
newClass = fmt.Sprintf("%s ts-table", class)
} else {
newClass = "ts-table"
}
originalTable, _ := s.Html()
originalHTMLContent = strings.ReplaceAll(originalHTMLContent, originalTable, fmt.Sprintf("%s
", newClass, originalTable))
})
// Replace and -
originalHTMLContent = strings.ReplaceAll(originalHTMLContent, "
", "")
originalHTMLContent = strings.ReplaceAll(originalHTMLContent, "", "")
originalHTMLContent = strings.ReplaceAll(originalHTMLContent, "", "")
originalHTMLContent = strings.ReplaceAll(originalHTMLContent, "", "")
originalHTMLContent = strings.ReplaceAll(originalHTMLContent, "- ", "")
originalHTMLContent = strings.ReplaceAll(originalHTMLContent, "", "")
// Replace with
originalHTMLContent = strings.ReplaceAll(originalHTMLContent, "", "")
originalHTMLContent = strings.ReplaceAll(originalHTMLContent, "", "")
// Replace
without class with
for {
startIndex := strings.Index(originalHTMLContent, "")
if startIndex == -1 {
break
}
endIndex := strings.Index(originalHTMLContent[startIndex+6:], "
")
if endIndex == -1 {
break
}
endIndex += startIndex + 6
codeSegment := originalHTMLContent[startIndex : endIndex+7] // Include
fmt.Println(">>>>", codeSegment)
if !strings.Contains(codeSegment, "class=") {
replacement := strings.Replace(codeSegment, "", "", 1)
replacement = strings.Replace(replacement, "
", "", 1)
originalHTMLContent = strings.Replace(originalHTMLContent, codeSegment, replacement, 1)
} else {
// Skip if already has a class
break
}
}
//Replace blockquote to
originalHTMLContent = strings.ReplaceAll(originalHTMLContent, "", "")
originalHTMLContent = strings.ReplaceAll(originalHTMLContent, "", "")
return []byte(originalHTMLContent), err
}