parserOptionsMinimal.ts 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. import {
  2. TextModes,
  3. ParserOptions,
  4. ElementNode,
  5. Namespaces,
  6. NodeTypes
  7. } from '@vue/compiler-core'
  8. export const enum DOMNamespaces {
  9. HTML = Namespaces.HTML,
  10. SVG,
  11. MATH_ML
  12. }
  13. export const parserOptionsMinimal: ParserOptions = {
  14. // https://html.spec.whatwg.org/multipage/parsing.html#tree-construction-dispatcher
  15. getNamespace(tag: string, parent: ElementNode | undefined): DOMNamespaces {
  16. let ns = parent ? parent.ns : DOMNamespaces.HTML
  17. if (parent && ns === DOMNamespaces.MATH_ML) {
  18. if (parent.tag === 'annotation-xml') {
  19. if (tag === 'svg') {
  20. return DOMNamespaces.SVG
  21. }
  22. if (
  23. parent.props.some(
  24. a =>
  25. a.type === NodeTypes.ATTRIBUTE &&
  26. a.name === 'encoding' &&
  27. a.value != null &&
  28. (a.value.content === 'text/html' ||
  29. a.value.content === 'application/xhtml+xml')
  30. )
  31. ) {
  32. ns = DOMNamespaces.HTML
  33. }
  34. } else if (
  35. /^m(?:[ions]|text)$/.test(parent.tag) &&
  36. tag !== 'mglyph' &&
  37. tag !== 'malignmark'
  38. ) {
  39. ns = DOMNamespaces.HTML
  40. }
  41. } else if (parent && ns === DOMNamespaces.SVG) {
  42. if (
  43. parent.tag === 'foreignObject' ||
  44. parent.tag === 'desc' ||
  45. parent.tag === 'title'
  46. ) {
  47. ns = DOMNamespaces.HTML
  48. }
  49. }
  50. if (ns === DOMNamespaces.HTML) {
  51. if (tag === 'svg') {
  52. return DOMNamespaces.SVG
  53. }
  54. if (tag === 'math') {
  55. return DOMNamespaces.MATH_ML
  56. }
  57. }
  58. return ns
  59. },
  60. // https://html.spec.whatwg.org/multipage/parsing.html#parsing-html-fragments
  61. getTextMode(tag: string, ns: DOMNamespaces): TextModes {
  62. if (ns === DOMNamespaces.HTML) {
  63. if (tag === 'textarea' || tag === 'title') {
  64. return TextModes.RCDATA
  65. }
  66. if (
  67. /^(?:style|xmp|iframe|noembed|noframes|script|noscript)$/i.test(tag)
  68. ) {
  69. return TextModes.RAWTEXT
  70. }
  71. }
  72. return TextModes.DATA
  73. },
  74. isVoidTag(tag: string): boolean {
  75. return /^(?:area|base|br|col|embed|hr|img|input|link|meta|param|source|track|wbr)$/i.test(
  76. tag
  77. )
  78. }
  79. }