xml.js 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. /*
  2. Language: HTML, XML
  3. Website: https://www.w3.org/XML/
  4. Category: common
  5. */
  6. export default function (hljs) {
  7. var XML_IDENT_RE = '[A-Za-z0-9\\._:-]+';
  8. var XML_ENTITIES = {
  9. className: 'symbol',
  10. begin: '&[a-z]+;|&#[0-9]+;|&#x[a-f0-9]+;'
  11. };
  12. var XML_META_KEYWORDS = {
  13. begin: '\\s',
  14. contains: [
  15. {
  16. className: 'meta-keyword',
  17. begin: '#?[a-z_][a-z1-9_-]+',
  18. illegal: '\\n'
  19. }
  20. ]
  21. };
  22. var XML_META_PAR_KEYWORDS = hljs.inherit(XML_META_KEYWORDS, {
  23. begin: '\\(',
  24. end: '\\)'
  25. });
  26. var APOS_META_STRING_MODE = hljs.inherit(hljs.APOS_STRING_MODE, {
  27. className: 'meta-string'
  28. });
  29. var QUOTE_META_STRING_MODE = hljs.inherit(hljs.QUOTE_STRING_MODE, {
  30. className: 'meta-string'
  31. });
  32. var TAG_INTERNALS = {
  33. endsWithParent: true,
  34. illegal: /</,
  35. relevance: 0,
  36. contains: [
  37. {
  38. className: 'attr',
  39. begin: XML_IDENT_RE,
  40. relevance: 0
  41. },
  42. {
  43. begin: /=\s*/,
  44. relevance: 0,
  45. contains: [
  46. {
  47. className: 'string',
  48. endsParent: true,
  49. variants: [
  50. {
  51. begin: /"/,
  52. end: /"/,
  53. contains: [XML_ENTITIES]
  54. },
  55. {
  56. begin: /'/,
  57. end: /'/,
  58. contains: [XML_ENTITIES]
  59. },
  60. {
  61. begin: /[^\s"'=<>`]+/
  62. }
  63. ]
  64. }
  65. ]
  66. }
  67. ]
  68. };
  69. return {
  70. name: 'HTML, XML',
  71. aliases: ['html', 'xhtml', 'rss', 'atom', 'xjb', 'xsd', 'xsl', 'plist', 'wsf', 'svg'],
  72. case_insensitive: true,
  73. contains: [
  74. {
  75. className: 'meta',
  76. begin: '<![a-z]',
  77. end: '>',
  78. relevance: 10,
  79. contains: [
  80. XML_META_KEYWORDS,
  81. QUOTE_META_STRING_MODE,
  82. APOS_META_STRING_MODE,
  83. XML_META_PAR_KEYWORDS,
  84. {
  85. begin: '\\[',
  86. end: '\\]',
  87. contains: [
  88. {
  89. className: 'meta',
  90. begin: '<![a-z]',
  91. end: '>',
  92. contains: [XML_META_KEYWORDS, XML_META_PAR_KEYWORDS, QUOTE_META_STRING_MODE, APOS_META_STRING_MODE]
  93. }
  94. ]
  95. }
  96. ]
  97. },
  98. hljs.COMMENT('<!--', '-->', {
  99. relevance: 10
  100. }),
  101. {
  102. begin: '<\\!\\[CDATA\\[',
  103. end: '\\]\\]>',
  104. relevance: 10
  105. },
  106. XML_ENTITIES,
  107. {
  108. className: 'meta',
  109. begin: /<\?xml/,
  110. end: /\?>/,
  111. relevance: 10
  112. },
  113. {
  114. className: 'tag',
  115. /*
  116. The lookahead pattern (?=...) ensures that 'begin' only matches
  117. '<style' as a single word, followed by a whitespace or an
  118. ending braket. The '$' is needed for the lexeme to be recognized
  119. by hljs.subMode() that tests lexemes outside the stream.
  120. */
  121. begin: '<style(?=\\s|>)',
  122. end: '>',
  123. keywords: {
  124. name: 'style'
  125. },
  126. contains: [TAG_INTERNALS],
  127. starts: {
  128. end: '</style>',
  129. returnEnd: true,
  130. subLanguage: ['css', 'xml']
  131. }
  132. },
  133. {
  134. className: 'tag',
  135. // See the comment in the <style tag about the lookahead pattern
  136. begin: '<script(?=\\s|>)',
  137. end: '>',
  138. keywords: {
  139. name: 'script'
  140. },
  141. contains: [TAG_INTERNALS],
  142. starts: {
  143. end: '</script>',
  144. returnEnd: true,
  145. subLanguage: ['javascript', 'handlebars', 'xml']
  146. }
  147. },
  148. {
  149. className: 'tag',
  150. begin: '</?',
  151. end: '/?>',
  152. contains: [
  153. {
  154. className: 'name',
  155. begin: /[^\/><\s]+/,
  156. relevance: 0
  157. },
  158. TAG_INTERNALS
  159. ]
  160. }
  161. ]
  162. };
  163. }