Skip to content
Snippets Groups Projects
html.go 1.58 KiB
Newer Older
package util

import (
	"errors"
	"golang.org/x/net/html"
	"os"
	"strconv"
)

func LoadHtml(p string) (*html.Node, error) {
	f, err := os.Open(p)
	if err != nil {
		return nil, err
	}
	defer f.Close()

	return html.Parse(f)

}

func GetAttribute(attrs []html.Attribute, key string) string {
	for _, attr := range attrs {
		if attr.Key == key {
			return attr.Val
		}
	}

	return ""
}

var internalIDCounter int = 999

func GetNextId() string {
	internalIDCounter++
	return "id" + strconv.Itoa(internalIDCounter)

}

func GetOrCreateId(node *html.Node, text string) string {

	var err error

	nodeId := GetAttribute(node.Attr, "id")
	if nodeId != "" {
		return nodeId
	}

	nodeId, err = BuildTextKey(text)
	if err != nil {
		nodeId = GetNextId()
	}

	node.Attr = append(node.Attr, html.Attribute{Key: "id", Val: nodeId})
	return nodeId

}

func ReplaceAttribute(node *html.Node, key, value string) {
	for i, attr := range node.Attr {
		if attr.Key != key {
			continue
		}

		node.Attr[i].Val = value
		return
	}

	node.Attr = append(node.Attr, html.Attribute{Key: key, Val: value})

}

func SaveHtml(p string, node *html.Node) error {

	var f *os.File
	var err error

	_, err = os.Stat(p)
	if errors.Is(err, os.ErrNotExist) {
		var dir = path.Dir(p)
		err := os.MkdirAll(dir, os.ModePerm)
		if err != nil {
			return err
		}

		f, err = os.Create(p)
		if err != nil {
			return err
		}

	} else if err != nil {
		return err
	} else {
		err := os.Remove(p)
		if err != nil {
			return err
		}
		f, err = os.Create(p)
		if err != nil {
			return err
		}
	}

	defer f.Close()
	return html.Render(f, node)

}