feat(media-supply): add image upload functionality and enhance HTML handling in article processing
This commit is contained in:
@@ -19,6 +19,8 @@ import (
|
||||
|
||||
goredis "github.com/redis/go-redis/v9"
|
||||
"github.com/yuin/goldmark"
|
||||
"github.com/yuin/goldmark/extension"
|
||||
goldhtml "github.com/yuin/goldmark/renderer/html"
|
||||
nethtml "golang.org/x/net/html"
|
||||
"golang.org/x/net/html/atom"
|
||||
|
||||
@@ -1153,28 +1155,16 @@ func meijiequanArticleHTML(content string) string {
|
||||
if source == "" {
|
||||
return ""
|
||||
}
|
||||
if looksLikeHTML(source) {
|
||||
return source
|
||||
}
|
||||
return markdownToMeijiequanHTML(source)
|
||||
}
|
||||
|
||||
func looksLikeHTML(source string) bool {
|
||||
lower := strings.ToLower(strings.TrimSpace(source))
|
||||
return strings.Contains(lower, "<p") ||
|
||||
strings.Contains(lower, "<h1") ||
|
||||
strings.Contains(lower, "<h2") ||
|
||||
strings.Contains(lower, "<h3") ||
|
||||
strings.Contains(lower, "<img") ||
|
||||
strings.Contains(lower, "<figure") ||
|
||||
strings.Contains(lower, "<table") ||
|
||||
strings.Contains(lower, "<ul") ||
|
||||
strings.Contains(lower, "<ol")
|
||||
}
|
||||
|
||||
func markdownToMeijiequanHTML(markdown string) string {
|
||||
var output bytes.Buffer
|
||||
if err := goldmark.Convert([]byte(markdown), &output); err != nil {
|
||||
renderer := goldmark.New(
|
||||
goldmark.WithExtensions(extension.GFM),
|
||||
goldmark.WithRendererOptions(goldhtml.WithUnsafe()),
|
||||
)
|
||||
if err := renderer.Convert([]byte(markdown), &output); err != nil {
|
||||
return ""
|
||||
}
|
||||
return addMeijiequanImageSrcAttributes(strings.TrimSpace(output.String()))
|
||||
@@ -1211,24 +1201,57 @@ func addMeijiequanImageSrcAttribute(node *nethtml.Node) {
|
||||
}
|
||||
if node.Type == nethtml.ElementNode && strings.EqualFold(node.Data, "img") {
|
||||
src := ""
|
||||
hasOriginalSrc := false
|
||||
originalSrc := ""
|
||||
dataSrc := ""
|
||||
attrs := make([]nethtml.Attribute, 0, len(node.Attr)+1)
|
||||
for _, attr := range node.Attr {
|
||||
switch strings.ToLower(attr.Key) {
|
||||
switch strings.ToLower(strings.TrimSpace(attr.Key)) {
|
||||
case "src":
|
||||
src = strings.TrimSpace(attr.Val)
|
||||
case "_src":
|
||||
hasOriginalSrc = true
|
||||
originalSrc = strings.TrimSpace(attr.Val)
|
||||
case "data-src":
|
||||
dataSrc = strings.TrimSpace(attr.Val)
|
||||
case "data-asset-id":
|
||||
continue
|
||||
}
|
||||
attrs = append(attrs, attr)
|
||||
}
|
||||
if src == "" {
|
||||
src = firstNonEmptyText(originalSrc, dataSrc)
|
||||
}
|
||||
if src != "" {
|
||||
for idx := range attrs {
|
||||
switch strings.ToLower(strings.TrimSpace(attrs[idx].Key)) {
|
||||
case "src":
|
||||
attrs[idx].Val = src
|
||||
case "_src":
|
||||
attrs[idx].Val = src
|
||||
}
|
||||
}
|
||||
if !meijiequanHTMLAttrsHaveKey(attrs, "src") {
|
||||
attrs = append(attrs, nethtml.Attribute{Key: "src", Val: src})
|
||||
}
|
||||
if !meijiequanHTMLAttrsHaveKey(attrs, "_src") {
|
||||
attrs = append(attrs, nethtml.Attribute{Key: "_src", Val: src})
|
||||
}
|
||||
}
|
||||
if src != "" && !hasOriginalSrc {
|
||||
node.Attr = append(node.Attr, nethtml.Attribute{Key: "_src", Val: src})
|
||||
}
|
||||
node.Attr = attrs
|
||||
}
|
||||
for child := node.FirstChild; child != nil; child = child.NextSibling {
|
||||
addMeijiequanImageSrcAttribute(child)
|
||||
}
|
||||
}
|
||||
|
||||
func meijiequanHTMLAttrsHaveKey(attrs []nethtml.Attribute, key string) bool {
|
||||
for _, attr := range attrs {
|
||||
if strings.EqualFold(strings.TrimSpace(attr.Key), key) {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func (c *MeijiequanClient) httpClient(ctx context.Context) (*http.Client, string, error) {
|
||||
session, err := c.loadSession(ctx)
|
||||
if err != nil {
|
||||
|
||||
Reference in New Issue
Block a user