python.js 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. /*
  2. Language: Python
  3. Description: Python is an interpreted, object-oriented, high-level programming language with dynamic semantics.
  4. Website: https://www.python.org
  5. Category: common
  6. */
  7. function python(hljs) {
  8. var KEYWORDS = {
  9. keyword:
  10. 'and elif is global as in if from raise for except finally print import pass return ' +
  11. 'exec else break not with class assert yield try while continue del or def lambda ' +
  12. 'async await nonlocal|10',
  13. built_in:
  14. 'Ellipsis NotImplemented',
  15. literal: 'False None True'
  16. };
  17. var PROMPT = {
  18. className: 'meta', begin: /^(>>>|\.\.\.) /
  19. };
  20. var SUBST = {
  21. className: 'subst',
  22. begin: /\{/, end: /\}/,
  23. keywords: KEYWORDS,
  24. illegal: /#/
  25. };
  26. var LITERAL_BRACKET = {
  27. begin: /\{\{/,
  28. relevance: 0
  29. };
  30. var STRING = {
  31. className: 'string',
  32. contains: [hljs.BACKSLASH_ESCAPE],
  33. variants: [
  34. {
  35. begin: /(u|b)?r?'''/, end: /'''/,
  36. contains: [hljs.BACKSLASH_ESCAPE, PROMPT],
  37. relevance: 10
  38. },
  39. {
  40. begin: /(u|b)?r?"""/, end: /"""/,
  41. contains: [hljs.BACKSLASH_ESCAPE, PROMPT],
  42. relevance: 10
  43. },
  44. {
  45. begin: /(fr|rf|f)'''/, end: /'''/,
  46. contains: [hljs.BACKSLASH_ESCAPE, PROMPT, LITERAL_BRACKET, SUBST]
  47. },
  48. {
  49. begin: /(fr|rf|f)"""/, end: /"""/,
  50. contains: [hljs.BACKSLASH_ESCAPE, PROMPT, LITERAL_BRACKET, SUBST]
  51. },
  52. {
  53. begin: /(u|r|ur)'/, end: /'/,
  54. relevance: 10
  55. },
  56. {
  57. begin: /(u|r|ur)"/, end: /"/,
  58. relevance: 10
  59. },
  60. {
  61. begin: /(b|br)'/, end: /'/
  62. },
  63. {
  64. begin: /(b|br)"/, end: /"/
  65. },
  66. {
  67. begin: /(fr|rf|f)'/, end: /'/,
  68. contains: [hljs.BACKSLASH_ESCAPE, LITERAL_BRACKET, SUBST]
  69. },
  70. {
  71. begin: /(fr|rf|f)"/, end: /"/,
  72. contains: [hljs.BACKSLASH_ESCAPE, LITERAL_BRACKET, SUBST]
  73. },
  74. hljs.APOS_STRING_MODE,
  75. hljs.QUOTE_STRING_MODE
  76. ]
  77. };
  78. var NUMBER = {
  79. className: 'number', relevance: 0,
  80. variants: [
  81. {begin: hljs.BINARY_NUMBER_RE + '[lLjJ]?'},
  82. {begin: '\\b(0o[0-7]+)[lLjJ]?'},
  83. {begin: hljs.C_NUMBER_RE + '[lLjJ]?'}
  84. ]
  85. };
  86. var PARAMS = {
  87. className: 'params',
  88. variants: [
  89. // Exclude params at functions without params
  90. {begin: /\(\s*\)/, skip: true, className: null },
  91. {
  92. begin: /\(/, end: /\)/, excludeBegin: true, excludeEnd: true,
  93. contains: ['self', PROMPT, NUMBER, STRING, hljs.HASH_COMMENT_MODE],
  94. },
  95. ],
  96. };
  97. SUBST.contains = [STRING, NUMBER, PROMPT];
  98. return {
  99. name: 'Python',
  100. aliases: ['py', 'gyp', 'ipython'],
  101. keywords: KEYWORDS,
  102. illegal: /(<\/|->|\?)|=>/,
  103. contains: [
  104. PROMPT,
  105. NUMBER,
  106. // eat "if" prior to string so that it won't accidentally be
  107. // labeled as an f-string as in:
  108. { beginKeywords: "if", relevance: 0 },
  109. STRING,
  110. hljs.HASH_COMMENT_MODE,
  111. {
  112. variants: [
  113. {className: 'function', beginKeywords: 'def'},
  114. {className: 'class', beginKeywords: 'class'}
  115. ],
  116. end: /:/,
  117. illegal: /[${=;\n,]/,
  118. contains: [
  119. hljs.UNDERSCORE_TITLE_MODE,
  120. PARAMS,
  121. {
  122. begin: /->/, endsWithParent: true,
  123. keywords: 'None'
  124. }
  125. ]
  126. },
  127. {
  128. className: 'meta',
  129. begin: /^[\t ]*@/, end: /$/
  130. },
  131. {
  132. begin: /\b(print|exec)\(/ // don’t highlight keywords-turned-functions in Python 3
  133. }
  134. ]
  135. };
  136. }
  137. module.exports = python;