prism-markup.js 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. Prism.languages.markup = {
  2. 'comment': /<!--[\s\S]*?-->/,
  3. 'prolog': /<\?[\s\S]+?\?>/,
  4. 'doctype': {
  5. // https://www.w3.org/TR/xml/#NT-doctypedecl
  6. pattern: /<!DOCTYPE(?:[^>"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|<!--(?:[^-]|-(?!->))*-->)*\]\s*)?>/i,
  7. greedy: true,
  8. inside: {
  9. 'internal-subset': {
  10. pattern: /(\[)[\s\S]+(?=\]>$)/,
  11. lookbehind: true,
  12. greedy: true,
  13. inside: null // see below
  14. },
  15. 'string': {
  16. pattern: /"[^"]*"|'[^']*'/,
  17. greedy: true
  18. },
  19. 'punctuation': /^<!|>$|[[\]]/,
  20. 'doctype-tag': /^DOCTYPE/,
  21. 'name': /[^\s<>'"]+/
  22. }
  23. },
  24. 'cdata': /<!\[CDATA\[[\s\S]*?]]>/i,
  25. 'tag': {
  26. pattern: /<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,
  27. greedy: true,
  28. inside: {
  29. 'tag': {
  30. pattern: /^<\/?[^\s>\/]+/,
  31. inside: {
  32. 'punctuation': /^<\/?/,
  33. 'namespace': /^[^\s>\/:]+:/
  34. }
  35. },
  36. 'attr-value': {
  37. pattern: /=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,
  38. inside: {
  39. 'punctuation': [
  40. {
  41. pattern: /^=/,
  42. alias: 'attr-equals'
  43. },
  44. /"|'/
  45. ]
  46. }
  47. },
  48. 'punctuation': /\/?>/,
  49. 'attr-name': {
  50. pattern: /[^\s>\/]+/,
  51. inside: {
  52. 'namespace': /^[^\s>\/:]+:/
  53. }
  54. }
  55. }
  56. },
  57. 'entity': [
  58. {
  59. pattern: /&[\da-z]{1,8};/i,
  60. alias: 'named-entity'
  61. },
  62. /&#x?[\da-f]{1,8};/i
  63. ]
  64. };
  65. Prism.languages.markup['tag'].inside['attr-value'].inside['entity'] =
  66. Prism.languages.markup['entity'];
  67. Prism.languages.markup['doctype'].inside['internal-subset'].inside = Prism.languages.markup;
  68. // Plugin to make entity title show the real entity, idea by Roman Komarov
  69. Prism.hooks.add('wrap', function (env) {
  70. if (env.type === 'entity') {
  71. env.attributes['title'] = env.content.replace(/&amp;/, '&');
  72. }
  73. });
  74. Object.defineProperty(Prism.languages.markup.tag, 'addInlined', {
  75. /**
  76. * Adds an inlined language to markup.
  77. *
  78. * An example of an inlined language is CSS with `<style>` tags.
  79. *
  80. * @param {string} tagName The name of the tag that contains the inlined language. This name will be treated as
  81. * case insensitive.
  82. * @param {string} lang The language key.
  83. * @example
  84. * addInlined('style', 'css');
  85. */
  86. value: function addInlined(tagName, lang) {
  87. var includedCdataInside = {};
  88. includedCdataInside['language-' + lang] = {
  89. pattern: /(^<!\[CDATA\[)[\s\S]+?(?=\]\]>$)/i,
  90. lookbehind: true,
  91. inside: Prism.languages[lang]
  92. };
  93. includedCdataInside['cdata'] = /^<!\[CDATA\[|\]\]>$/i;
  94. var inside = {
  95. 'included-cdata': {
  96. pattern: /<!\[CDATA\[[\s\S]*?\]\]>/i,
  97. inside: includedCdataInside
  98. }
  99. };
  100. inside['language-' + lang] = {
  101. pattern: /[\s\S]+/,
  102. inside: Prism.languages[lang]
  103. };
  104. var def = {};
  105. def[tagName] = {
  106. pattern: RegExp(/(<__[\s\S]*?>)(?:<!\[CDATA\[(?:[^\]]|\](?!\]>))*\]\]>|(?!<!\[CDATA\[)[\s\S])*?(?=<\/__>)/.source.replace(/__/g, function () { return tagName; }), 'i'),
  107. lookbehind: true,
  108. greedy: true,
  109. inside: inside
  110. };
  111. Prism.languages.insertBefore('markup', 'cdata', def);
  112. }
  113. });
  114. Prism.languages.html = Prism.languages.markup;
  115. Prism.languages.mathml = Prism.languages.markup;
  116. Prism.languages.svg = Prism.languages.markup;
  117. Prism.languages.xml = Prism.languages.extend('markup', {});
  118. Prism.languages.ssml = Prism.languages.xml;
  119. Prism.languages.atom = Prism.languages.xml;
  120. Prism.languages.rss = Prism.languages.xml;