codekingpro/portable-devtools
114k
1"""2 pygments.lexers.jsx3 ~~~~~~~~~~~~~~~~~~~4 5 Lexers for JSX (React).6 7 :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS.8 :license: BSD, see LICENSE for details.9"""10 11import re12 13from pygments.lexer import bygroups, default, include, inherit14from pygments.lexers.javascript import JavascriptLexer15from pygments.token import Name, Operator, Punctuation, String, Text, \16 Whitespace17 18__all__ = ['JsxLexer']19 20 21class JsxLexer(JavascriptLexer):22 """For JavaScript Syntax Extension (JSX).23 """24 25 name = "JSX"26 aliases = ["jsx", "react"]27 filenames = ["*.jsx", "*.react"]28 mimetypes = ["text/jsx", "text/typescript-jsx"]29 url = "https://facebook.github.io/jsx/"30 version_added = '2.17'31 32 flags = re.MULTILINE | re.DOTALL33 34 # Use same tokens as `JavascriptLexer`, but with tags and attributes support35 tokens = {36 "root": [37 include("jsx"),38 inherit,39 ],40 "jsx": [41 (r"</?>", Punctuation), # JSXFragment <>|</>42 (r"(<)(\w+)(\.?)", bygroups(Punctuation, Name.Tag, Punctuation), "tag"),43 (44 r"(</)(\w+)(>)",45 bygroups(Punctuation, Name.Tag, Punctuation),46 ),47 (48 r"(</)(\w+)",49 bygroups(Punctuation, Name.Tag),50 "fragment",51 ), # Same for React.Context52 ],53 "tag": [54 (r"\s+", Whitespace),55 (r"([\w-]+)(\s*)(=)(\s*)", bygroups(Name.Attribute, Whitespace, Operator, Whitespace), "attr"),56 (r"[{}]+", Punctuation),57 (r"[\w\.]+", Name.Attribute),58 (r"(/?)(\s*)(>)", bygroups(Punctuation, Text, Punctuation), "#pop"),59 ],60 "fragment": [61 (r"(.)(\w+)", bygroups(Punctuation, Name.Attribute)),62 (r"(>)", bygroups(Punctuation), "#pop"),63 ],64 "attr": [65 (r"\{", Punctuation, "expression"),66 (r'".*?"', String, "#pop"),67 (r"'.*?'", String, "#pop"),68 default("#pop"),69 ],70 "expression": [71 (r"\{", Punctuation, "#push"),72 (r"\}", Punctuation, "#pop"),73 include("root"),74 ],75 }76 