diff options
Diffstat (limited to 'vendor/golang.org/x/net/html/doctype.go')
-rw-r--r-- | vendor/golang.org/x/net/html/doctype.go | 156 |
1 files changed, 156 insertions, 0 deletions
diff --git a/vendor/golang.org/x/net/html/doctype.go b/vendor/golang.org/x/net/html/doctype.go new file mode 100644 index 0000000..c484e5a --- /dev/null +++ b/vendor/golang.org/x/net/html/doctype.go | |||
@@ -0,0 +1,156 @@ | |||
1 | // Copyright 2011 The Go Authors. All rights reserved. | ||
2 | // Use of this source code is governed by a BSD-style | ||
3 | // license that can be found in the LICENSE file. | ||
4 | |||
5 | package html | ||
6 | |||
7 | import ( | ||
8 | "strings" | ||
9 | ) | ||
10 | |||
11 | // parseDoctype parses the data from a DoctypeToken into a name, | ||
12 | // public identifier, and system identifier. It returns a Node whose Type | ||
13 | // is DoctypeNode, whose Data is the name, and which has attributes | ||
14 | // named "system" and "public" for the two identifiers if they were present. | ||
15 | // quirks is whether the document should be parsed in "quirks mode". | ||
16 | func parseDoctype(s string) (n *Node, quirks bool) { | ||
17 | n = &Node{Type: DoctypeNode} | ||
18 | |||
19 | // Find the name. | ||
20 | space := strings.IndexAny(s, whitespace) | ||
21 | if space == -1 { | ||
22 | space = len(s) | ||
23 | } | ||
24 | n.Data = s[:space] | ||
25 | // The comparison to "html" is case-sensitive. | ||
26 | if n.Data != "html" { | ||
27 | quirks = true | ||
28 | } | ||
29 | n.Data = strings.ToLower(n.Data) | ||
30 | s = strings.TrimLeft(s[space:], whitespace) | ||
31 | |||
32 | if len(s) < 6 { | ||
33 | // It can't start with "PUBLIC" or "SYSTEM". | ||
34 | // Ignore the rest of the string. | ||
35 | return n, quirks || s != "" | ||
36 | } | ||
37 | |||
38 | key := strings.ToLower(s[:6]) | ||
39 | s = s[6:] | ||
40 | for key == "public" || key == "system" { | ||
41 | s = strings.TrimLeft(s, whitespace) | ||
42 | if s == "" { | ||
43 | break | ||
44 | } | ||
45 | quote := s[0] | ||
46 | if quote != '"' && quote != '\'' { | ||
47 | break | ||
48 | } | ||
49 | s = s[1:] | ||
50 | q := strings.IndexRune(s, rune(quote)) | ||
51 | var id string | ||
52 | if q == -1 { | ||
53 | id = s | ||
54 | s = "" | ||
55 | } else { | ||
56 | id = s[:q] | ||
57 | s = s[q+1:] | ||
58 | } | ||
59 | n.Attr = append(n.Attr, Attribute{Key: key, Val: id}) | ||
60 | if key == "public" { | ||
61 | key = "system" | ||
62 | } else { | ||
63 | key = "" | ||
64 | } | ||
65 | } | ||
66 | |||
67 | if key != "" || s != "" { | ||
68 | quirks = true | ||
69 | } else if len(n.Attr) > 0 { | ||
70 | if n.Attr[0].Key == "public" { | ||
71 | public := strings.ToLower(n.Attr[0].Val) | ||
72 | switch public { | ||
73 | case "-//w3o//dtd w3 html strict 3.0//en//", "-/w3d/dtd html 4.0 transitional/en", "html": | ||
74 | quirks = true | ||
75 | default: | ||
76 | for _, q := range quirkyIDs { | ||
77 | if strings.HasPrefix(public, q) { | ||
78 | quirks = true | ||
79 | break | ||
80 | } | ||
81 | } | ||
82 | } | ||
83 | // The following two public IDs only cause quirks mode if there is no system ID. | ||
84 | if len(n.Attr) == 1 && (strings.HasPrefix(public, "-//w3c//dtd html 4.01 frameset//") || | ||
85 | strings.HasPrefix(public, "-//w3c//dtd html 4.01 transitional//")) { | ||
86 | quirks = true | ||
87 | } | ||
88 | } | ||
89 | if lastAttr := n.Attr[len(n.Attr)-1]; lastAttr.Key == "system" && | ||
90 | strings.ToLower(lastAttr.Val) == "http://www.ibm.com/data/dtd/v11/ibmxhtml1-transitional.dtd" { | ||
91 | quirks = true | ||
92 | } | ||
93 | } | ||
94 | |||
95 | return n, quirks | ||
96 | } | ||
97 | |||
98 | // quirkyIDs is a list of public doctype identifiers that cause a document | ||
99 | // to be interpreted in quirks mode. The identifiers should be in lower case. | ||
100 | var quirkyIDs = []string{ | ||
101 | "+//silmaril//dtd html pro v0r11 19970101//", | ||
102 | "-//advasoft ltd//dtd html 3.0 aswedit + extensions//", | ||
103 | "-//as//dtd html 3.0 aswedit + extensions//", | ||
104 | "-//ietf//dtd html 2.0 level 1//", | ||
105 | "-//ietf//dtd html 2.0 level 2//", | ||
106 | "-//ietf//dtd html 2.0 strict level 1//", | ||
107 | "-//ietf//dtd html 2.0 strict level 2//", | ||
108 | "-//ietf//dtd html 2.0 strict//", | ||
109 | "-//ietf//dtd html 2.0//", | ||
110 | "-//ietf//dtd html 2.1e//", | ||
111 | "-//ietf//dtd html 3.0//", | ||
112 | "-//ietf//dtd html 3.2 final//", | ||
113 | "-//ietf//dtd html 3.2//", | ||
114 | "-//ietf//dtd html 3//", | ||
115 | "-//ietf//dtd html level 0//", | ||
116 | "-//ietf//dtd html level 1//", | ||
117 | "-//ietf//dtd html level 2//", | ||
118 | "-//ietf//dtd html level 3//", | ||
119 | "-//ietf//dtd html strict level 0//", | ||
120 | "-//ietf//dtd html strict level 1//", | ||
121 | "-//ietf//dtd html strict level 2//", | ||
122 | "-//ietf//dtd html strict level 3//", | ||
123 | "-//ietf//dtd html strict//", | ||
124 | "-//ietf//dtd html//", | ||
125 | "-//metrius//dtd metrius presentational//", | ||
126 | "-//microsoft//dtd internet explorer 2.0 html strict//", | ||
127 | "-//microsoft//dtd internet explorer 2.0 html//", | ||
128 | "-//microsoft//dtd internet explorer 2.0 tables//", | ||
129 | "-//microsoft//dtd internet explorer 3.0 html strict//", | ||
130 | "-//microsoft//dtd internet explorer 3.0 html//", | ||
131 | "-//microsoft//dtd internet explorer 3.0 tables//", | ||
132 | "-//netscape comm. corp.//dtd html//", | ||
133 | "-//netscape comm. corp.//dtd strict html//", | ||
134 | "-//o'reilly and associates//dtd html 2.0//", | ||
135 | "-//o'reilly and associates//dtd html extended 1.0//", | ||
136 | "-//o'reilly and associates//dtd html extended relaxed 1.0//", | ||
137 | "-//softquad software//dtd hotmetal pro 6.0::19990601::extensions to html 4.0//", | ||
138 | "-//softquad//dtd hotmetal pro 4.0::19971010::extensions to html 4.0//", | ||
139 | "-//spyglass//dtd html 2.0 extended//", | ||
140 | "-//sq//dtd html 2.0 hotmetal + extensions//", | ||
141 | "-//sun microsystems corp.//dtd hotjava html//", | ||
142 | "-//sun microsystems corp.//dtd hotjava strict html//", | ||
143 | "-//w3c//dtd html 3 1995-03-24//", | ||
144 | "-//w3c//dtd html 3.2 draft//", | ||
145 | "-//w3c//dtd html 3.2 final//", | ||
146 | "-//w3c//dtd html 3.2//", | ||
147 | "-//w3c//dtd html 3.2s draft//", | ||
148 | "-//w3c//dtd html 4.0 frameset//", | ||
149 | "-//w3c//dtd html 4.0 transitional//", | ||
150 | "-//w3c//dtd html experimental 19960712//", | ||
151 | "-//w3c//dtd html experimental 970421//", | ||
152 | "-//w3c//dtd w3 html//", | ||
153 | "-//w3o//dtd w3 html 3.0//", | ||
154 | "-//webtechs//dtd mozilla html 2.0//", | ||
155 | "-//webtechs//dtd mozilla html//", | ||
156 | } | ||