table.go 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  1. package html // import "github.com/tdewolff/minify/html"
  2. import "github.com/tdewolff/parse/html"
  3. type traits uint8
  4. const (
  5. rawTag traits = 1 << iota
  6. nonPhrasingTag
  7. objectTag
  8. booleanAttr
  9. caselessAttr
  10. urlAttr
  11. omitPTag // omit p end tag if it is followed by this start tag
  12. keepPTag // keep p end tag if it is followed by this end tag
  13. )
  14. var tagMap = map[html.Hash]traits{
  15. html.A: keepPTag,
  16. html.Address: nonPhrasingTag | omitPTag,
  17. html.Article: nonPhrasingTag | omitPTag,
  18. html.Aside: nonPhrasingTag | omitPTag,
  19. html.Audio: objectTag | keepPTag,
  20. html.Blockquote: nonPhrasingTag | omitPTag,
  21. html.Body: nonPhrasingTag,
  22. html.Br: nonPhrasingTag,
  23. html.Button: objectTag,
  24. html.Canvas: objectTag,
  25. html.Caption: nonPhrasingTag,
  26. html.Col: nonPhrasingTag,
  27. html.Colgroup: nonPhrasingTag,
  28. html.Dd: nonPhrasingTag,
  29. html.Del: keepPTag,
  30. html.Details: omitPTag,
  31. html.Div: nonPhrasingTag | omitPTag,
  32. html.Dl: nonPhrasingTag | omitPTag,
  33. html.Dt: nonPhrasingTag,
  34. html.Embed: nonPhrasingTag,
  35. html.Fieldset: nonPhrasingTag | omitPTag,
  36. html.Figcaption: nonPhrasingTag | omitPTag,
  37. html.Figure: nonPhrasingTag | omitPTag,
  38. html.Footer: nonPhrasingTag | omitPTag,
  39. html.Form: nonPhrasingTag | omitPTag,
  40. html.H1: nonPhrasingTag | omitPTag,
  41. html.H2: nonPhrasingTag | omitPTag,
  42. html.H3: nonPhrasingTag | omitPTag,
  43. html.H4: nonPhrasingTag | omitPTag,
  44. html.H5: nonPhrasingTag | omitPTag,
  45. html.H6: nonPhrasingTag | omitPTag,
  46. html.Head: nonPhrasingTag,
  47. html.Header: nonPhrasingTag | omitPTag,
  48. html.Hgroup: nonPhrasingTag,
  49. html.Hr: nonPhrasingTag | omitPTag,
  50. html.Html: nonPhrasingTag,
  51. html.Iframe: rawTag | objectTag,
  52. html.Img: objectTag,
  53. html.Input: objectTag,
  54. html.Ins: keepPTag,
  55. html.Keygen: objectTag,
  56. html.Li: nonPhrasingTag,
  57. html.Main: nonPhrasingTag | omitPTag,
  58. html.Map: keepPTag,
  59. html.Math: rawTag,
  60. html.Menu: omitPTag,
  61. html.Meta: nonPhrasingTag,
  62. html.Meter: objectTag,
  63. html.Nav: nonPhrasingTag | omitPTag,
  64. html.Noscript: nonPhrasingTag | keepPTag,
  65. html.Object: objectTag,
  66. html.Ol: nonPhrasingTag | omitPTag,
  67. html.Output: nonPhrasingTag,
  68. html.P: nonPhrasingTag | omitPTag,
  69. html.Picture: objectTag,
  70. html.Pre: nonPhrasingTag | omitPTag,
  71. html.Progress: objectTag,
  72. html.Q: objectTag,
  73. html.Script: rawTag,
  74. html.Section: nonPhrasingTag | omitPTag,
  75. html.Select: objectTag,
  76. html.Style: rawTag | nonPhrasingTag,
  77. html.Svg: rawTag | objectTag,
  78. html.Table: nonPhrasingTag | omitPTag,
  79. html.Tbody: nonPhrasingTag,
  80. html.Td: nonPhrasingTag,
  81. html.Textarea: rawTag | objectTag,
  82. html.Tfoot: nonPhrasingTag,
  83. html.Th: nonPhrasingTag,
  84. html.Thead: nonPhrasingTag,
  85. html.Title: nonPhrasingTag,
  86. html.Tr: nonPhrasingTag,
  87. html.Ul: nonPhrasingTag | omitPTag,
  88. html.Video: objectTag | keepPTag,
  89. }
  90. var attrMap = map[html.Hash]traits{
  91. html.Accept: caselessAttr,
  92. html.Accept_Charset: caselessAttr,
  93. html.Action: urlAttr,
  94. html.Align: caselessAttr,
  95. html.Alink: caselessAttr,
  96. html.Allowfullscreen: booleanAttr,
  97. html.Async: booleanAttr,
  98. html.Autofocus: booleanAttr,
  99. html.Autoplay: booleanAttr,
  100. html.Axis: caselessAttr,
  101. html.Background: urlAttr,
  102. html.Bgcolor: caselessAttr,
  103. html.Charset: caselessAttr,
  104. html.Checked: booleanAttr,
  105. html.Cite: urlAttr,
  106. html.Classid: urlAttr,
  107. html.Clear: caselessAttr,
  108. html.Codebase: urlAttr,
  109. html.Codetype: caselessAttr,
  110. html.Color: caselessAttr,
  111. html.Compact: booleanAttr,
  112. html.Controls: booleanAttr,
  113. html.Data: urlAttr,
  114. html.Declare: booleanAttr,
  115. html.Default: booleanAttr,
  116. html.DefaultChecked: booleanAttr,
  117. html.DefaultMuted: booleanAttr,
  118. html.DefaultSelected: booleanAttr,
  119. html.Defer: booleanAttr,
  120. html.Dir: caselessAttr,
  121. html.Disabled: booleanAttr,
  122. html.Enabled: booleanAttr,
  123. html.Enctype: caselessAttr,
  124. html.Face: caselessAttr,
  125. html.Formaction: urlAttr,
  126. html.Formnovalidate: booleanAttr,
  127. html.Frame: caselessAttr,
  128. html.Hidden: booleanAttr,
  129. html.Href: urlAttr,
  130. html.Hreflang: caselessAttr,
  131. html.Http_Equiv: caselessAttr,
  132. html.Icon: urlAttr,
  133. html.Inert: booleanAttr,
  134. html.Ismap: booleanAttr,
  135. html.Itemscope: booleanAttr,
  136. html.Lang: caselessAttr,
  137. html.Language: caselessAttr,
  138. html.Link: caselessAttr,
  139. html.Longdesc: urlAttr,
  140. html.Manifest: urlAttr,
  141. html.Media: caselessAttr,
  142. html.Method: caselessAttr,
  143. html.Multiple: booleanAttr,
  144. html.Muted: booleanAttr,
  145. html.Nohref: booleanAttr,
  146. html.Noresize: booleanAttr,
  147. html.Noshade: booleanAttr,
  148. html.Novalidate: booleanAttr,
  149. html.Nowrap: booleanAttr,
  150. html.Open: booleanAttr,
  151. html.Pauseonexit: booleanAttr,
  152. html.Poster: urlAttr,
  153. html.Profile: urlAttr,
  154. html.Readonly: booleanAttr,
  155. html.Rel: caselessAttr,
  156. html.Required: booleanAttr,
  157. html.Rev: caselessAttr,
  158. html.Reversed: booleanAttr,
  159. html.Rules: caselessAttr,
  160. html.Scope: caselessAttr,
  161. html.Scoped: booleanAttr,
  162. html.Scrolling: caselessAttr,
  163. html.Seamless: booleanAttr,
  164. html.Selected: booleanAttr,
  165. html.Shape: caselessAttr,
  166. html.Sortable: booleanAttr,
  167. html.Src: urlAttr,
  168. html.Target: caselessAttr,
  169. html.Text: caselessAttr,
  170. html.Translate: booleanAttr,
  171. html.Truespeed: booleanAttr,
  172. html.Type: caselessAttr,
  173. html.Typemustmatch: booleanAttr,
  174. html.Undeterminate: booleanAttr,
  175. html.Usemap: urlAttr,
  176. html.Valign: caselessAttr,
  177. html.Valuetype: caselessAttr,
  178. html.Vlink: caselessAttr,
  179. html.Visible: booleanAttr,
  180. html.Xmlns: urlAttr,
  181. }