meifamily/ptt-alertor

View on GitHub
ptt/web/node.go

Summary

Maintainability
A
2 hrs
Test Coverage
package web

import (
    "golang.org/x/net/html"
)

type findInHTML func(node *html.Node) *html.Node

func findNodes(nodes *html.Node, find findInHTML) []*html.Node {
    targetNodes := make([]*html.Node, 0)
    return traverseHTMLNode(nodes, find, targetNodes)
}

func traverseHTMLNode(nodes *html.Node, find findInHTML, targetNodes []*html.Node) []*html.Node {
    for child := nodes.FirstChild; child != nil; child = child.NextSibling {
        targetNode := find(child)
        if targetNode != nil {
            targetNodes = append(targetNodes, targetNode)
        }
        targetNodes = traverseHTMLNode(child, find, targetNodes)
    }
    return targetNodes
}

func findAnchor(node *html.Node) *html.Node {
    if node.Type == html.ElementNode && node.Data == "a" {
        return node
    }
    return nil
}

func findDivByClassName(node *html.Node, className string) *html.Node {
    if node.Type == html.ElementNode && node.Data == "div" {
        for _, tagAttr := range node.Attr {
            if tagAttr.Key == "class" && tagAttr.Val == className {
                return node
            }
        }
    }
    return nil
}

func findSpanByClassName(node *html.Node, className string) *html.Node {
    if node.Type == html.ElementNode && node.Data == "span" {
        for _, tagAttr := range node.Attr {
            if tagAttr.Key == "class" && tagAttr.Val == className {
                return node
            }
        }
    }
    return nil
}

func getAnchorLink(anchor *html.Node) string {
    for _, value := range anchor.Attr {
        if value.Key == "href" {
            return value.Val
        }
    }
    return ""
}

func getTitle(title *html.Node) string {
    return title.FirstChild.Data
}

func findTitle(node *html.Node) *html.Node {
    if node.Type == html.ElementNode && node.Data == "title" {
        return node
    }
    return nil
}

func findMeta(node *html.Node, property string) *html.Node {
    if node.Type == html.ElementNode && node.Data == "meta" {
        for _, tagAttr := range node.Attr {
            if tagAttr.Key == "property" && tagAttr.Val == property {
                return node
            }
        }
    }
    return nil
}

func getMetaContent(meta *html.Node) string {
    for _, value := range meta.Attr {
        if value.Key == "content" {
            return value.Val
        }
    }
    return ""
}