-
Notifications
You must be signed in to change notification settings - Fork 2
/
html.go
123 lines (104 loc) · 3.21 KB
/
html.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
// Copyright 2013 com authors
//
// Licensed under the Apache License, Version 2.0 (the "License"): you may
// not use this file except in compliance with the License. You may obtain
// a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
// License for the specific language governing permissions and limitations
// under the License.
package com
import (
"html"
"regexp"
"strings"
)
var html2jsReplacer = strings.NewReplacer(
`\`, `\\`,
"\n", `\n`,
"\r", "",
`"`, `\"`,
)
// HTML2JS converts []byte type of HTML content into JS format.
func HTML2JS(data []byte) []byte {
s := string(data)
s = html2jsReplacer.Replace(s)
return []byte(s)
}
// HTMLEncode encode html chars to string
func HTMLEncode(str string) string {
return html.EscapeString(str)
}
// HTMLDecode decode string to html chars
func HTMLDecode(str string) string {
return html.UnescapeString(str)
}
// HTMLDecodeAll decode string to html chars
func HTMLDecodeAll(text string) string {
original := text
text = HTMLDecode(text)
if original == text {
return text
}
return HTMLDecodeAll(text)
}
var (
regexpAnyHTMLTag = regexp.MustCompile(`<[\S\s]+?>`)
regexpStyleHTMLTag = regexp.MustCompile(`<(?i:style)[\S\s]+?</(?i:style)[^>]*>`)
regexpScriptHTMLTag = regexp.MustCompile(`<(?i:script)[\S\s]+?</(?i:script)[^>]*>`)
regexpMoreSpace = regexp.MustCompile(`([\s]){2,}`)
regexpMoreNewline = regexp.MustCompile("(\n){2,}")
regexpAnyHTMLAttr = regexp.MustCompile(`<[/]?[\S]+[^>]*>`)
regexpBrHTMLTag = regexp.MustCompile("<(?i:br)[^>]*>")
)
// ClearHTMLAttr clear all attributes
func ClearHTMLAttr(src string) string {
src = regexpAnyHTMLAttr.ReplaceAllString(src, "<$1$2>")
return src
}
// TextLine Single line of text
func TextLine(src string) string {
src = StripTags(src)
return RemoveEOL(src)
}
// CleanMoreNl remove all \n(2+)
func CleanMoreNl(src string) string {
return regexpMoreNewline.ReplaceAllString(src, "$1")
}
// CleanMoreSpace remove all spaces(2+)
func CleanMoreSpace(src string) string {
return regexpMoreSpace.ReplaceAllString(src, "$1")
}
// StripTags strip tags in html string
func StripTags(src string, singleLine ...bool) string {
//remove tag <style>
src = regexpStyleHTMLTag.ReplaceAllString(src, "")
//remove tag <script>
src = regexpScriptHTMLTag.ReplaceAllString(src, "")
if len(singleLine) > 0 && singleLine[0] {
//remove all html tag
src = regexpAnyHTMLTag.ReplaceAllString(src, "")
src = RemoveEOL(src)
} else {
//replace all html tag into \n
src = regexpAnyHTMLTag.ReplaceAllString(src, "\n")
src = CleanMoreSpace(src)
}
return strings.TrimSpace(src)
}
var nl2brReplacer = strings.NewReplacer(
"\r", "",
"\n", "<br />",
)
// Nl2br change \n to <br/>
func Nl2br(str string) string {
return nl2brReplacer.Replace(str)
}
// Br2nl change <br/> to \n
func Br2nl(str string) string {
return regexpBrHTMLTag.ReplaceAllString(str, "\n")
}