indent content of script and style tags
2 files changed, 59 insertions(+), 7 deletions(-)
changed files
M format.go → format.go
@@ -1,6 +1,7 @@ package htmlformat import ( + "bufio" "fmt" "io" "strings"@@ -111,6 +112,21 @@ } return false } +func isSpecialContentElement(n *html.Node) bool { + if n != nil { + switch n.DataAtom { + case atom.Style, + atom.Script: + return true + } + } + return false +} + +func isEmptyTextNode(n *html.Node) bool { + return n.Type == html.TextNode && strings.TrimSpace(n.Data) == "" +} + func getFirstRune(s string) rune { r, _ := utf8.DecodeRuneInString(s) return r@@ -126,18 +142,40 @@ case html.TextNode: s := n.Data s = strings.TrimSpace(s) if s != "" { - if !hasSingleTextChild(n.Parent) && + if !isSpecialContentElement(n.Parent) && !hasSingleTextChild(n.Parent) && (n.PrevSibling == nil || !unicode.IsPunct(getFirstRune(s))) { if err = printIndent(w, level); err != nil { return } } - if _, err = fmt.Fprint(w, s); err != nil { - return - } - if !hasSingleTextChild(n.Parent) { - if _, err = fmt.Fprint(w, "\n"); err != nil { + if isSpecialContentElement(n.Parent) { + scanner := bufio.NewScanner(strings.NewReader(s)) + for scanner.Scan() { + t := scanner.Text() + if _, err = fmt.Fprintln(w); err != nil { + return + } + if err = printIndent(w, level+1); err != nil { + return + } + if _, err = fmt.Fprint(w, t); err != nil { + return + } + } + if err = scanner.Err(); err != nil { + return + } + if _, err = fmt.Fprintln(w); err != nil { + return + } + } else { + if _, err = fmt.Fprint(w, s); err != nil { return + } + if !hasSingleTextChild(n.Parent) { + if _, err = fmt.Fprint(w, "\n"); err != nil { + return + } } } }@@ -166,7 +204,7 @@ if !isVoidElement(n) { if err = printChildren(w, n, level+1); err != nil { return } - if !hasSingleTextChild(n) { + if isSpecialContentElement(n) || !hasSingleTextChild(n) { if err = printIndent(w, level); err != nil { return }
M format_test.go → format_test.go
@@ -62,6 +62,20 @@ </li> </ul> `, }, + { + name: "style content is indented consistently", + input: `<style> +body { + text-color: red; +} +</style>`, + expected: `<style> + body { + text-color: red; + } +</style> +`, + }, } for _, test := range tests {