typoscript.py 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226
  1. # -*- coding: utf-8 -*-
  2. """
  3. pygments.lexers.typoscript
  4. ~~~~~~~~~~~~~~~~~~~~~~~~~~
  5. Lexers for TypoScript
  6. `TypoScriptLexer`
  7. A TypoScript lexer.
  8. `TypoScriptCssDataLexer`
  9. Lexer that highlights markers, constants and registers within css.
  10. `TypoScriptHtmlDataLexer`
  11. Lexer that highlights markers, constants and registers within html tags.
  12. :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
  13. :license: BSD, see LICENSE for details.
  14. """
  15. import re
  16. from pygments.lexer import RegexLexer, include, bygroups, using
  17. from pygments.token import Text, Comment, Name, String, Number, \
  18. Operator, Punctuation
  19. __all__ = ['TypoScriptLexer', 'TypoScriptCssDataLexer', 'TypoScriptHtmlDataLexer']
  20. class TypoScriptCssDataLexer(RegexLexer):
  21. """
  22. Lexer that highlights markers, constants and registers within css blocks.
  23. .. versionadded:: 2.2
  24. """
  25. name = 'TypoScriptCssData'
  26. aliases = ['typoscriptcssdata']
  27. tokens = {
  28. 'root': [
  29. # marker: ###MARK###
  30. (r'(.*)(###\w+###)(.*)', bygroups(String, Name.Constant, String)),
  31. # constant: {$some.constant}
  32. (r'(\{)(\$)((?:[\w\-]+\.)*)([\w\-]+)(\})',
  33. bygroups(String.Symbol, Operator, Name.Constant,
  34. Name.Constant, String.Symbol)), # constant
  35. # constant: {register:somevalue}
  36. (r'(.*)(\{)([\w\-]+)(\s*:\s*)([\w\-]+)(\})(.*)',
  37. bygroups(String, String.Symbol, Name.Constant, Operator,
  38. Name.Constant, String.Symbol, String)), # constant
  39. # whitespace
  40. (r'\s+', Text),
  41. # comments
  42. (r'/\*(?:(?!\*/).)*\*/', Comment),
  43. (r'(?<!(#|\'|"))(?:#(?!(?:[a-fA-F0-9]{6}|[a-fA-F0-9]{3}))[^\n#]+|//[^\n]*)',
  44. Comment),
  45. # other
  46. (r'[<>,:=.*%+|]', String),
  47. (r'[\w"\-!/&;(){}]+', String),
  48. ]
  49. }
  50. class TypoScriptHtmlDataLexer(RegexLexer):
  51. """
  52. Lexer that highlights markers, constants and registers within html tags.
  53. .. versionadded:: 2.2
  54. """
  55. name = 'TypoScriptHtmlData'
  56. aliases = ['typoscripthtmldata']
  57. tokens = {
  58. 'root': [
  59. # INCLUDE_TYPOSCRIPT
  60. (r'(INCLUDE_TYPOSCRIPT)', Name.Class),
  61. # Language label or extension resource FILE:... or LLL:... or EXT:...
  62. (r'(EXT|FILE|LLL):[^}\n"]*', String),
  63. # marker: ###MARK###
  64. (r'(.*)(###\w+###)(.*)', bygroups(String, Name.Constant, String)),
  65. # constant: {$some.constant}
  66. (r'(\{)(\$)((?:[\w\-]+\.)*)([\w\-]+)(\})',
  67. bygroups(String.Symbol, Operator, Name.Constant,
  68. Name.Constant, String.Symbol)), # constant
  69. # constant: {register:somevalue}
  70. (r'(.*)(\{)([\w\-]+)(\s*:\s*)([\w\-]+)(\})(.*)',
  71. bygroups(String, String.Symbol, Name.Constant, Operator,
  72. Name.Constant, String.Symbol, String)), # constant
  73. # whitespace
  74. (r'\s+', Text),
  75. # other
  76. (r'[<>,:=.*%+|]', String),
  77. (r'[\w"\-!/&;(){}#]+', String),
  78. ]
  79. }
  80. class TypoScriptLexer(RegexLexer):
  81. """
  82. Lexer for TypoScript code.
  83. http://docs.typo3.org/typo3cms/TyposcriptReference/
  84. .. versionadded:: 2.2
  85. """
  86. name = 'TypoScript'
  87. aliases = ['typoscript']
  88. filenames = ['*.ts', '*.txt']
  89. mimetypes = ['text/x-typoscript']
  90. flags = re.DOTALL | re.MULTILINE
  91. # Slightly higher than TypeScript (which is 0).
  92. priority = 0.1
  93. tokens = {
  94. 'root': [
  95. include('comment'),
  96. include('constant'),
  97. include('html'),
  98. include('label'),
  99. include('whitespace'),
  100. include('keywords'),
  101. include('punctuation'),
  102. include('operator'),
  103. include('structure'),
  104. include('literal'),
  105. include('other'),
  106. ],
  107. 'keywords': [
  108. # Conditions
  109. (r'(\[)(?i)(browser|compatVersion|dayofmonth|dayofweek|dayofyear|'
  110. r'device|ELSE|END|GLOBAL|globalString|globalVar|hostname|hour|IP|'
  111. r'language|loginUser|loginuser|minute|month|page|PIDinRootline|'
  112. r'PIDupinRootline|system|treeLevel|useragent|userFunc|usergroup|'
  113. r'version)([^\]]*)(\])',
  114. bygroups(String.Symbol, Name.Constant, Text, String.Symbol)),
  115. # Functions
  116. (r'(?=[\w\-])(HTMLparser|HTMLparser_tags|addParams|cache|encapsLines|'
  117. r'filelink|if|imageLinkWrap|imgResource|makelinks|numRows|numberFormat|'
  118. r'parseFunc|replacement|round|select|split|stdWrap|strPad|tableStyle|'
  119. r'tags|textStyle|typolink)(?![\w\-])', Name.Function),
  120. # Toplevel objects and _*
  121. (r'(?:(=?\s*<?\s+|^\s*))(cObj|field|config|content|constants|FEData|'
  122. r'file|frameset|includeLibs|lib|page|plugin|register|resources|sitemap|'
  123. r'sitetitle|styles|temp|tt_[^:.\s]*|types|xmlnews|INCLUDE_TYPOSCRIPT|'
  124. r'_CSS_DEFAULT_STYLE|_DEFAULT_PI_VARS|_LOCAL_LANG)(?![\w\-])',
  125. bygroups(Operator, Name.Builtin)),
  126. # Content objects
  127. (r'(?=[\w\-])(CASE|CLEARGIF|COA|COA_INT|COBJ_ARRAY|COLUMNS|CONTENT|'
  128. r'CTABLE|EDITPANEL|FILE|FILES|FLUIDTEMPLATE|FORM|HMENU|HRULER|HTML|'
  129. r'IMAGE|IMGTEXT|IMG_RESOURCE|LOAD_REGISTER|MEDIA|MULTIMEDIA|OTABLE|'
  130. r'PAGE|QTOBJECT|RECORDS|RESTORE_REGISTER|SEARCHRESULT|SVG|SWFOBJECT|'
  131. r'TEMPLATE|TEXT|USER|USER_INT)(?![\w\-])', Name.Class),
  132. # Menu states
  133. (r'(?=[\w\-])(ACTIFSUBRO|ACTIFSUB|ACTRO|ACT|CURIFSUBRO|CURIFSUB|CURRO|'
  134. r'CUR|IFSUBRO|IFSUB|NO|SPC|USERDEF1RO|USERDEF1|USERDEF2RO|USERDEF2|'
  135. r'USRRO|USR)', Name.Class),
  136. # Menu objects
  137. (r'(?=[\w\-])(GMENU_FOLDOUT|GMENU_LAYERS|GMENU|IMGMENUITEM|IMGMENU|'
  138. r'JSMENUITEM|JSMENU|TMENUITEM|TMENU_LAYERS|TMENU)', Name.Class),
  139. # PHP objects
  140. (r'(?=[\w\-])(PHP_SCRIPT(_EXT|_INT)?)', Name.Class),
  141. (r'(?=[\w\-])(userFunc)(?![\w\-])', Name.Function),
  142. ],
  143. 'whitespace': [
  144. (r'\s+', Text),
  145. ],
  146. 'html': [
  147. (r'<\S[^\n>]*>', using(TypoScriptHtmlDataLexer)),
  148. (r'&[^;\n]*;', String),
  149. (r'(_CSS_DEFAULT_STYLE)(\s*)(\()(?s)(.*(?=\n\)))',
  150. bygroups(Name.Class, Text, String.Symbol, using(TypoScriptCssDataLexer))),
  151. ],
  152. 'literal': [
  153. (r'0x[0-9A-Fa-f]+t?', Number.Hex),
  154. # (r'[0-9]*\.[0-9]+([eE][0-9]+)?[fd]?\s*(?:[^=])', Number.Float),
  155. (r'[0-9]+', Number.Integer),
  156. (r'(###\w+###)', Name.Constant),
  157. ],
  158. 'label': [
  159. # Language label or extension resource FILE:... or LLL:... or EXT:...
  160. (r'(EXT|FILE|LLL):[^}\n"]*', String),
  161. # Path to a resource
  162. (r'(?![^\w\-])([\w\-]+(?:/[\w\-]+)+/?)(\S*\n)',
  163. bygroups(String, String)),
  164. ],
  165. 'punctuation': [
  166. (r'[,.]', Punctuation),
  167. ],
  168. 'operator': [
  169. (r'[<>,:=.*%+|]', Operator),
  170. ],
  171. 'structure': [
  172. # Brackets and braces
  173. (r'[{}()\[\]\\]', String.Symbol),
  174. ],
  175. 'constant': [
  176. # Constant: {$some.constant}
  177. (r'(\{)(\$)((?:[\w\-]+\.)*)([\w\-]+)(\})',
  178. bygroups(String.Symbol, Operator, Name.Constant,
  179. Name.Constant, String.Symbol)), # constant
  180. # Constant: {register:somevalue}
  181. (r'(\{)([\w\-]+)(\s*:\s*)([\w\-]+)(\})',
  182. bygroups(String.Symbol, Name.Constant, Operator,
  183. Name.Constant, String.Symbol)), # constant
  184. # Hex color: #ff0077
  185. (r'(#[a-fA-F0-9]{6}\b|#[a-fA-F0-9]{3}\b)', String.Char)
  186. ],
  187. 'comment': [
  188. (r'(?<!(#|\'|"))(?:#(?!(?:[a-fA-F0-9]{6}|[a-fA-F0-9]{3}))[^\n#]+|//[^\n]*)',
  189. Comment),
  190. (r'/\*(?:(?!\*/).)*\*/', Comment),
  191. (r'(\s*#\s*\n)', Comment),
  192. ],
  193. 'other': [
  194. (r'[\w"\-!/&;]+', Text),
  195. ],
  196. }
  197. def analyse_text(text):
  198. if '<INCLUDE_TYPOSCRIPT:' in text:
  199. return 1.0