xml.js 3.5 KB

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