package util import ( "errors" "golang.org/x/net/html" "os" "path" "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) }