David K. Bainbridge | 215e024 | 2017-09-05 23:18:24 -0700 | [diff] [blame] | 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 | // Section 12.2.3.2 of the HTML5 specification says "The following elements |
| 8 | // have varying levels of special parsing rules". |
| 9 | // https://html.spec.whatwg.org/multipage/syntax.html#the-stack-of-open-elements |
| 10 | var isSpecialElementMap = map[string]bool{ |
| 11 | "address": true, |
| 12 | "applet": true, |
| 13 | "area": true, |
| 14 | "article": true, |
| 15 | "aside": true, |
| 16 | "base": true, |
| 17 | "basefont": true, |
| 18 | "bgsound": true, |
| 19 | "blockquote": true, |
| 20 | "body": true, |
| 21 | "br": true, |
| 22 | "button": true, |
| 23 | "caption": true, |
| 24 | "center": true, |
| 25 | "col": true, |
| 26 | "colgroup": true, |
| 27 | "dd": true, |
| 28 | "details": true, |
| 29 | "dir": true, |
| 30 | "div": true, |
| 31 | "dl": true, |
| 32 | "dt": true, |
| 33 | "embed": true, |
| 34 | "fieldset": true, |
| 35 | "figcaption": true, |
| 36 | "figure": true, |
| 37 | "footer": true, |
| 38 | "form": true, |
| 39 | "frame": true, |
| 40 | "frameset": true, |
| 41 | "h1": true, |
| 42 | "h2": true, |
| 43 | "h3": true, |
| 44 | "h4": true, |
| 45 | "h5": true, |
| 46 | "h6": true, |
| 47 | "head": true, |
| 48 | "header": true, |
| 49 | "hgroup": true, |
| 50 | "hr": true, |
| 51 | "html": true, |
| 52 | "iframe": true, |
| 53 | "img": true, |
| 54 | "input": true, |
| 55 | "isindex": true, |
| 56 | "li": true, |
| 57 | "link": true, |
| 58 | "listing": true, |
| 59 | "marquee": true, |
| 60 | "menu": true, |
| 61 | "meta": true, |
| 62 | "nav": true, |
| 63 | "noembed": true, |
| 64 | "noframes": true, |
| 65 | "noscript": true, |
| 66 | "object": true, |
| 67 | "ol": true, |
| 68 | "p": true, |
| 69 | "param": true, |
| 70 | "plaintext": true, |
| 71 | "pre": true, |
| 72 | "script": true, |
| 73 | "section": true, |
| 74 | "select": true, |
| 75 | "source": true, |
| 76 | "style": true, |
| 77 | "summary": true, |
| 78 | "table": true, |
| 79 | "tbody": true, |
| 80 | "td": true, |
| 81 | "template": true, |
| 82 | "textarea": true, |
| 83 | "tfoot": true, |
| 84 | "th": true, |
| 85 | "thead": true, |
| 86 | "title": true, |
| 87 | "tr": true, |
| 88 | "track": true, |
| 89 | "ul": true, |
| 90 | "wbr": true, |
| 91 | "xmp": true, |
| 92 | } |
| 93 | |
| 94 | func isSpecialElement(element *Node) bool { |
| 95 | switch element.Namespace { |
| 96 | case "", "html": |
| 97 | return isSpecialElementMap[element.Data] |
| 98 | case "svg": |
| 99 | return element.Data == "foreignObject" |
| 100 | } |
| 101 | return false |
| 102 | } |