lib/rouge/lexers/jsx.rb in rouge-3.19.0 vs lib/rouge/lexers/jsx.rb in rouge-3.20.0
- old
+ new
@@ -4,100 +4,88 @@
module Lexers
load_lexer 'javascript.rb'
class JSX < Javascript
title 'JSX'
- desc 'React JSX (https://facebook.github.io/react/)'
+ desc 'An XML-like syntax extension to JavaScript (facebook.github.io/jsx/)'
tag 'jsx'
aliases 'jsx', 'react'
filenames '*.jsx'
mimetypes 'text/x-jsx', 'application/x-jsx'
- id = Javascript.id_regex
+ start { @html = HTML.new(options); push :expr_start }
- def start_embed!
- @embed ||= JSX.new(options)
- @embed.reset!
- @embed.push(:expr_start)
- push :jsx_embed_root
+ prepend :expr_start do
+ mixin :tag
end
- def tag_token(name)
- name[0] =~ /\p{Lower}/ ? Name::Tag : Name::Class
+ state :tag do
+ rule %r/</ do
+ token Punctuation
+ push :tag_opening
+ push :element
+ push :element_name
+ end
end
- start { @html = HTML.new(options) }
-
- state :jsx_tags do
- rule %r/</, Punctuation, :jsx_element
- end
-
- state :jsx_internal do
- rule %r(</) do
+ state :tag_opening do
+ rule %r/<\// do
token Punctuation
- goto :jsx_end_tag
+ goto :element
+ push :element_name
end
-
+ mixin :tag
rule %r/{/ do
token Str::Interpol
- start_embed!
+ push :interpol
+ push :expr_start
end
-
- rule %r/[^<>{]+/ do
+ rule %r/[^<{]+/ do
delegate @html
end
-
- mixin :jsx_tags
end
- prepend :expr_start do
- mixin :jsx_tags
- end
-
- state :jsx_tag do
+ state :element do
mixin :comments_and_whitespace
- rule %r/#{id}/ do |m|
- token tag_token(m[0])
+ rule %r/\/>/ do
+ token Punctuation
+ pop! 2
end
-
- rule %r/[.]/, Punctuation
- end
-
- state :jsx_end_tag do
- mixin :jsx_tag
rule %r/>/, Punctuation, :pop!
+ rule %r/{/ do
+ token Str::Interpol
+ push :interpol
+ push :expr_start
+ end
+ rule %r/\w+/, Name::Attribute
+ rule %r/=/, Punctuation
+ rule %r/(["']).*?(\1)/, Str
end
- state :jsx_element do
- rule %r/#{id}=/, Name::Attribute, :jsx_attribute
- mixin :jsx_tag
- rule %r/>/ do token Punctuation; goto :jsx_internal end
- rule %r(/>), Punctuation, :pop!
+ state :element_name do
+ rule %r/[A-Z]\w*/, Name::Class
+ rule %r/\w+/, Name::Tag
+ rule %r/\./, Punctuation
+ rule(//) { pop! }
end
- state :jsx_attribute do
- rule %r/"(\\[\\"]|[^"])*"/, Str::Double, :pop!
- rule %r/'(\\[\\']|[^'])*'/, Str::Single, :pop!
+ state :interpol do
+ rule %r/}/, Str::Interpol, :pop!
rule %r/{/ do
- token Str::Interpol
- pop!
- start_embed!
+ token Punctuation
+ push :interpol_inner
+ push :statement
end
+ mixin :root
end
- state :jsx_embed_root do
- rule %r/[.][.][.]/, Punctuation
- rule %r/}/, Str::Interpol, :pop!
- mixin :jsx_embed
- end
-
- state :jsx_embed do
- rule %r/{/ do delegate @embed; push :jsx_embed end
- rule %r/}/ do delegate @embed; pop! end
- rule %r/[^{}]+/ do
- delegate @embed
+ state :interpol_inner do
+ rule %r/}/ do
+ token Punctuation
+ goto :statement
end
+ mixin :root
end
end
end
end