123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475 |
- """
- pygments.lexers.jsx
- ~~~~~~~~~~~~~~~~~~~
- Lexers for JSX (React).
- :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS.
- :license: BSD, see LICENSE for details.
- """
- import re
- from pygments.lexer import bygroups, default, include, inherit
- from pygments.lexers.javascript import JavascriptLexer
- from pygments.token import Name, Operator, Punctuation, String, Text, \
- Whitespace
- __all__ = ['JsxLexer']
- class JsxLexer(JavascriptLexer):
- """For JavaScript Syntax Extension (JSX).
- """
- name = "JSX"
- aliases = ["jsx", "react"]
- filenames = ["*.jsx", "*.react"]
- mimetypes = ["text/jsx", "text/typescript-jsx"]
- url = "https://facebook.github.io/jsx/"
- version_added = '2.17'
- flags = re.MULTILINE | re.DOTALL
- # Use same tokens as `JavascriptLexer`, but with tags and attributes support
- tokens = {
- "root": [
- include("jsx"),
- inherit,
- ],
- "jsx": [
- (r"</?>", Punctuation), # JSXFragment <>|</>
- (r"(<)(\w+)(\.?)", bygroups(Punctuation, Name.Tag, Punctuation), "tag"),
- (
- r"(</)(\w+)(>)",
- bygroups(Punctuation, Name.Tag, Punctuation),
- ),
- (
- r"(</)(\w+)",
- bygroups(Punctuation, Name.Tag),
- "fragment",
- ), # Same for React.Context
- ],
- "tag": [
- (r"\s+", Whitespace),
- (r"([\w-]+)(\s*)(=)(\s*)", bygroups(Name.Attribute, Whitespace, Operator, Whitespace), "attr"),
- (r"[{}]+", Punctuation),
- (r"[\w\.]+", Name.Attribute),
- (r"(/?)(\s*)(>)", bygroups(Punctuation, Text, Punctuation), "#pop"),
- ],
- "fragment": [
- (r"(.)(\w+)", bygroups(Punctuation, Name.Attribute)),
- (r"(>)", bygroups(Punctuation), "#pop"),
- ],
- "attr": [
- (r"\{", Punctuation, "expression"),
- (r'".*?"', String, "#pop"),
- (r"'.*?'", String, "#pop"),
- default("#pop"),
- ],
- "expression": [
- (r"\{", Punctuation, "#push"),
- (r"\}", Punctuation, "#pop"),
- include("root"),
- ],
- }
|