xml.js 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. module.exports = function(hljs) {
  2. var XML_IDENT_RE = '[A-Za-z0-9\\._:-]+';
  3. var TAG_INTERNALS = {
  4. endsWithParent: true,
  5. illegal: /</,
  6. relevance: 0,
  7. contains: [
  8. {
  9. className: 'attr',
  10. begin: XML_IDENT_RE,
  11. relevance: 0
  12. },
  13. {
  14. begin: /=\s*/,
  15. relevance: 0,
  16. contains: [
  17. {
  18. className: 'string',
  19. endsParent: true,
  20. variants: [
  21. {begin: /"/, end: /"/},
  22. {begin: /'/, end: /'/},
  23. {begin: /[^\s"'=<>`]+/}
  24. ]
  25. }
  26. ]
  27. }
  28. ]
  29. };
  30. return {
  31. aliases: ['html', 'xhtml', 'rss', 'atom', 'xjb', 'xsd', 'xsl', 'plist'],
  32. case_insensitive: true,
  33. contains: [
  34. {
  35. className: 'meta',
  36. begin: '<!DOCTYPE', end: '>',
  37. relevance: 10,
  38. contains: [{begin: '\\[', end: '\\]'}]
  39. },
  40. hljs.COMMENT(
  41. '<!--',
  42. '-->',
  43. {
  44. relevance: 10
  45. }
  46. ),
  47. {
  48. begin: '<\\!\\[CDATA\\[', end: '\\]\\]>',
  49. relevance: 10
  50. },
  51. {
  52. className: 'meta',
  53. begin: /<\?xml/, end: /\?>/, relevance: 10
  54. },
  55. {
  56. begin: /<\?(php)?/, end: /\?>/,
  57. subLanguage: 'php',
  58. contains: [
  59. // We don't want the php closing tag ?> to close the PHP block when
  60. // inside any of the following blocks:
  61. {begin: '/\\*', end: '\\*/', skip: true},
  62. {begin: 'b"', end: '"', skip: true},
  63. {begin: 'b\'', end: '\'', skip: true},
  64. hljs.inherit(hljs.APOS_STRING_MODE, {illegal: null, className: null, contains: null, skip: true}),
  65. hljs.inherit(hljs.QUOTE_STRING_MODE, {illegal: null, className: null, contains: null, skip: true})
  66. ]
  67. },
  68. {
  69. className: 'tag',
  70. /*
  71. The lookahead pattern (?=...) ensures that 'begin' only matches
  72. '<style' as a single word, followed by a whitespace or an
  73. ending braket. The '$' is needed for the lexeme to be recognized
  74. by hljs.subMode() that tests lexemes outside the stream.
  75. */
  76. begin: '<style(?=\\s|>|$)', end: '>',
  77. keywords: {name: 'style'},
  78. contains: [TAG_INTERNALS],
  79. starts: {
  80. end: '</style>', returnEnd: true,
  81. subLanguage: ['css', 'xml']
  82. }
  83. },
  84. {
  85. className: 'tag',
  86. // See the comment in the <style tag about the lookahead pattern
  87. begin: '<script(?=\\s|>|$)', end: '>',
  88. keywords: {name: 'script'},
  89. contains: [TAG_INTERNALS],
  90. starts: {
  91. end: '\<\/script\>', returnEnd: true,
  92. subLanguage: ['actionscript', 'javascript', 'handlebars', 'xml']
  93. }
  94. },
  95. {
  96. className: 'tag',
  97. begin: '</?', end: '/?>',
  98. contains: [
  99. {
  100. className: 'name', begin: /[^\/><\s]+/, relevance: 0
  101. },
  102. TAG_INTERNALS
  103. ]
  104. }
  105. ]
  106. };
  107. };