rouge 3.2.0 → 3.18.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +5 -5
- data/Gemfile +17 -3
- data/bin/rougify +1 -0
- data/lib/rouge.rb +67 -43
- data/lib/rouge/cli.rb +84 -17
- data/lib/rouge/demos/ada +26 -0
- data/lib/rouge/demos/apex +9 -0
- data/lib/rouge/demos/armasm +12 -0
- data/lib/rouge/demos/batchfile +3 -0
- data/lib/rouge/demos/bbcbasic +6 -0
- data/lib/rouge/demos/bpf +7 -0
- data/lib/rouge/demos/brainfuck +5 -0
- data/lib/rouge/demos/clean +6 -0
- data/lib/rouge/demos/cmhg +8 -0
- data/lib/rouge/demos/csvs +8 -0
- data/lib/rouge/demos/cuda +11 -0
- data/lib/rouge/demos/cypher +5 -0
- data/lib/rouge/demos/cython +6 -0
- data/lib/rouge/demos/datastudio +21 -0
- data/lib/rouge/demos/ecl +18 -0
- data/lib/rouge/demos/eex +1 -0
- data/lib/rouge/demos/epp +4 -0
- data/lib/rouge/demos/escape +3 -0
- data/lib/rouge/demos/freefem +16 -0
- data/lib/rouge/demos/gdscript +18 -0
- data/lib/rouge/demos/ghc-cmm +23 -0
- data/lib/rouge/demos/ghc-core +26 -0
- data/lib/rouge/demos/haxe +5 -0
- data/lib/rouge/demos/hocon +8 -0
- data/lib/rouge/demos/hql +5 -0
- data/lib/rouge/demos/isbl +4 -0
- data/lib/rouge/demos/jsl +3 -0
- data/lib/rouge/demos/jsp +29 -0
- data/lib/rouge/demos/liquid +0 -1
- data/lib/rouge/demos/lustre +6 -0
- data/lib/rouge/demos/lutin +18 -0
- data/lib/rouge/demos/m68k +16 -0
- data/lib/rouge/demos/magik +6 -0
- data/lib/rouge/demos/mason +22 -0
- data/lib/rouge/demos/mathematica +8 -0
- data/lib/rouge/demos/minizinc +23 -0
- data/lib/rouge/demos/msgtrans +4 -0
- data/lib/rouge/demos/nasm +6 -6
- data/lib/rouge/demos/nesasm +11 -0
- data/lib/rouge/demos/objective_cpp +17 -0
- data/lib/rouge/demos/openedge +4 -0
- data/lib/rouge/demos/opentype_feature_file +6 -0
- data/lib/rouge/demos/plist +1 -132
- data/lib/rouge/demos/powershell +12 -48
- data/lib/rouge/demos/q +6 -0
- data/lib/rouge/demos/reasonml +12 -0
- data/lib/rouge/demos/rego +8 -0
- data/lib/rouge/demos/robot_framework +27 -0
- data/lib/rouge/demos/sas +13 -0
- data/lib/rouge/demos/slice +10 -0
- data/lib/rouge/demos/solidity +13 -0
- data/lib/rouge/demos/sparql +6 -0
- data/lib/rouge/demos/sqf +14 -0
- data/lib/rouge/demos/supercollider +11 -0
- data/lib/rouge/demos/terraform +0 -15
- data/lib/rouge/demos/ttcn3 +6 -0
- data/lib/rouge/demos/vcl +12 -0
- data/lib/rouge/demos/xojo +14 -0
- data/lib/rouge/demos/xpath +2 -0
- data/lib/rouge/demos/xquery +22 -0
- data/lib/rouge/demos/yang +17 -0
- data/lib/rouge/formatter.rb +39 -2
- data/lib/rouge/formatters/html.rb +21 -2
- data/lib/rouge/formatters/html_inline.rb +1 -0
- data/lib/rouge/formatters/html_legacy.rb +1 -0
- data/lib/rouge/formatters/html_line_table.rb +53 -0
- data/lib/rouge/formatters/html_linewise.rb +7 -11
- data/lib/rouge/formatters/html_pygments.rb +2 -0
- data/lib/rouge/formatters/html_table.rb +21 -31
- data/lib/rouge/formatters/null.rb +1 -0
- data/lib/rouge/formatters/terminal256.rb +23 -5
- data/lib/rouge/formatters/terminal_truecolor.rb +37 -0
- data/lib/rouge/formatters/tex.rb +92 -0
- data/lib/rouge/guesser.rb +2 -0
- data/lib/rouge/guessers/disambiguation.rb +35 -0
- data/lib/rouge/guessers/filename.rb +2 -0
- data/lib/rouge/guessers/glob_mapping.rb +3 -1
- data/lib/rouge/guessers/mimetype.rb +2 -0
- data/lib/rouge/guessers/modeline.rb +3 -1
- data/lib/rouge/guessers/source.rb +3 -1
- data/lib/rouge/guessers/util.rb +2 -0
- data/lib/rouge/lexer.rb +71 -15
- data/lib/rouge/lexers/abap.rb +13 -11
- data/lib/rouge/lexers/actionscript.rb +35 -34
- data/lib/rouge/lexers/ada.rb +162 -0
- data/lib/rouge/lexers/apache.rb +13 -15
- data/lib/rouge/lexers/apache/keywords.rb +15 -0
- data/lib/rouge/lexers/apex.rb +126 -0
- data/lib/rouge/lexers/apiblueprint.rb +2 -0
- data/lib/rouge/lexers/apple_script.rb +17 -14
- data/lib/rouge/lexers/armasm.rb +145 -0
- data/lib/rouge/lexers/awk.rb +26 -25
- data/lib/rouge/lexers/batchfile.rb +164 -0
- data/lib/rouge/lexers/bbcbasic.rb +112 -0
- data/lib/rouge/lexers/biml.rb +6 -4
- data/lib/rouge/lexers/bpf.rb +118 -0
- data/lib/rouge/lexers/brainfuck.rb +53 -0
- data/lib/rouge/lexers/bsl.rb +13 -12
- data/lib/rouge/lexers/c.rb +35 -57
- data/lib/rouge/lexers/ceylon.rb +7 -34
- data/lib/rouge/lexers/cfscript.rb +27 -26
- data/lib/rouge/lexers/clean.rb +156 -0
- data/lib/rouge/lexers/clojure.rb +15 -14
- data/lib/rouge/lexers/cmake.rb +16 -14
- data/lib/rouge/lexers/cmhg.rb +34 -0
- data/lib/rouge/lexers/coffeescript.rb +90 -49
- data/lib/rouge/lexers/common_lisp.rb +39 -38
- data/lib/rouge/lexers/conf.rb +7 -6
- data/lib/rouge/lexers/console.rb +92 -38
- data/lib/rouge/lexers/coq.rb +27 -23
- data/lib/rouge/lexers/cpp.rb +24 -13
- data/lib/rouge/lexers/crystal.rb +71 -70
- data/lib/rouge/lexers/csharp.rb +29 -29
- data/lib/rouge/lexers/css.rb +24 -23
- data/lib/rouge/lexers/csvs.rb +44 -0
- data/lib/rouge/lexers/cuda.rb +35 -0
- data/lib/rouge/lexers/cypher.rb +108 -0
- data/lib/rouge/lexers/cython.rb +151 -0
- data/lib/rouge/lexers/d.rb +64 -63
- data/lib/rouge/lexers/dart.rb +34 -33
- data/lib/rouge/lexers/datastudio.rb +138 -0
- data/lib/rouge/lexers/diff.rb +10 -4
- data/lib/rouge/lexers/digdag.rb +3 -1
- data/lib/rouge/lexers/docker.rb +12 -11
- data/lib/rouge/lexers/dot.rb +19 -18
- data/lib/rouge/lexers/ecl.rb +175 -0
- data/lib/rouge/lexers/eex.rb +52 -0
- data/lib/rouge/lexers/eiffel.rb +21 -20
- data/lib/rouge/lexers/elixir.rb +52 -36
- data/lib/rouge/lexers/elm.rb +30 -29
- data/lib/rouge/lexers/epp.rb +51 -0
- data/lib/rouge/lexers/erb.rb +5 -4
- data/lib/rouge/lexers/erlang.rb +1 -0
- data/lib/rouge/lexers/escape.rb +58 -0
- data/lib/rouge/lexers/factor.rb +41 -40
- data/lib/rouge/lexers/fortran.rb +34 -32
- data/lib/rouge/lexers/freefem.rb +240 -0
- data/lib/rouge/lexers/fsharp.rb +33 -31
- data/lib/rouge/lexers/gdscript.rb +171 -0
- data/lib/rouge/lexers/ghc_cmm.rb +340 -0
- data/lib/rouge/lexers/ghc_core.rb +151 -0
- data/lib/rouge/lexers/gherkin.rb +17 -14
- data/lib/rouge/lexers/gherkin/keywords.rb +2 -0
- data/lib/rouge/lexers/glsl.rb +2 -5
- data/lib/rouge/lexers/go.rb +3 -2
- data/lib/rouge/lexers/gradle.rb +1 -0
- data/lib/rouge/lexers/graphql.rb +78 -60
- data/lib/rouge/lexers/groovy.rb +24 -25
- data/lib/rouge/lexers/hack.rb +2 -1
- data/lib/rouge/lexers/haml.rb +26 -29
- data/lib/rouge/lexers/handlebars.rb +32 -20
- data/lib/rouge/lexers/haskell.rb +67 -65
- data/lib/rouge/lexers/haxe.rb +246 -0
- data/lib/rouge/lexers/hcl.rb +26 -25
- data/lib/rouge/lexers/hocon.rb +86 -0
- data/lib/rouge/lexers/hql.rb +139 -0
- data/lib/rouge/lexers/html.rb +33 -31
- data/lib/rouge/lexers/http.rb +10 -9
- data/lib/rouge/lexers/hylang.rb +15 -14
- data/lib/rouge/lexers/idlang.rb +34 -32
- data/lib/rouge/lexers/igorpro.rb +32 -31
- data/lib/rouge/lexers/ini.rb +13 -12
- data/lib/rouge/lexers/io.rb +10 -9
- data/lib/rouge/lexers/irb.rb +6 -5
- data/lib/rouge/lexers/isbl.rb +97 -0
- data/lib/rouge/lexers/isbl/builtins.rb +17 -0
- data/lib/rouge/lexers/java.rb +29 -25
- data/lib/rouge/lexers/javascript.rb +58 -61
- data/lib/rouge/lexers/jinja.rb +39 -22
- data/lib/rouge/lexers/jsl.rb +55 -0
- data/lib/rouge/lexers/json.rb +54 -11
- data/lib/rouge/lexers/json_doc.rb +8 -5
- data/lib/rouge/lexers/jsonnet.rb +19 -18
- data/lib/rouge/lexers/jsp.rb +120 -0
- data/lib/rouge/lexers/jsx.rb +18 -16
- data/lib/rouge/lexers/julia.rb +182 -58
- data/lib/rouge/lexers/kotlin.rb +78 -26
- data/lib/rouge/lexers/lasso.rb +54 -58
- data/lib/rouge/lexers/lasso/keywords.rb +14 -0
- data/lib/rouge/lexers/liquid.rb +116 -118
- data/lib/rouge/lexers/literate_coffeescript.rb +3 -2
- data/lib/rouge/lexers/literate_haskell.rb +6 -5
- data/lib/rouge/lexers/llvm.rb +66 -49
- data/lib/rouge/lexers/lua.rb +43 -4
- data/lib/rouge/lexers/lua/builtins.rb +2 -0
- data/lib/rouge/lexers/lustre.rb +79 -0
- data/lib/rouge/lexers/lutin.rb +33 -0
- data/lib/rouge/lexers/m68k.rb +143 -0
- data/lib/rouge/lexers/magik.rb +127 -0
- data/lib/rouge/lexers/make.rb +57 -34
- data/lib/rouge/lexers/markdown.rb +67 -39
- data/lib/rouge/lexers/mason.rb +110 -0
- data/lib/rouge/lexers/mathematica.rb +96 -0
- data/lib/rouge/lexers/mathematica/builtins.rb +13 -0
- data/lib/rouge/lexers/matlab.rb +26 -17
- data/lib/rouge/lexers/matlab/builtins.rb +4 -4
- data/lib/rouge/lexers/minizinc.rb +87 -0
- data/lib/rouge/lexers/moonscript.rb +4 -3
- data/lib/rouge/lexers/mosel.rb +64 -63
- data/lib/rouge/lexers/msgtrans.rb +26 -0
- data/lib/rouge/lexers/mxml.rb +19 -18
- data/lib/rouge/lexers/nasm.rb +43 -169
- data/lib/rouge/lexers/nesasm.rb +78 -0
- data/lib/rouge/lexers/nginx.rb +15 -14
- data/lib/rouge/lexers/nim.rb +4 -2
- data/lib/rouge/lexers/nix.rb +44 -43
- data/lib/rouge/lexers/objective_c.rb +5 -178
- data/lib/rouge/lexers/objective_c/common.rb +184 -0
- data/lib/rouge/lexers/objective_cpp.rb +31 -0
- data/lib/rouge/lexers/ocaml.rb +29 -64
- data/lib/rouge/lexers/ocaml/common.rb +53 -0
- data/lib/rouge/lexers/openedge.rb +429 -0
- data/lib/rouge/lexers/opentype_feature_file.rb +113 -0
- data/lib/rouge/lexers/pascal.rb +6 -5
- data/lib/rouge/lexers/perl.rb +102 -67
- data/lib/rouge/lexers/php.rb +91 -53
- data/lib/rouge/lexers/php/builtins.rb +183 -174
- data/lib/rouge/lexers/plain_text.rb +2 -1
- data/lib/rouge/lexers/plist.rb +16 -14
- data/lib/rouge/lexers/pony.rb +21 -20
- data/lib/rouge/lexers/powershell.rb +190 -638
- data/lib/rouge/lexers/praat.rb +76 -75
- data/lib/rouge/lexers/prolog.rb +27 -19
- data/lib/rouge/lexers/prometheus.rb +32 -30
- data/lib/rouge/lexers/properties.rb +13 -12
- data/lib/rouge/lexers/protobuf.rb +23 -22
- data/lib/rouge/lexers/puppet.rb +33 -32
- data/lib/rouge/lexers/python.rb +124 -99
- data/lib/rouge/lexers/q.rb +17 -14
- data/lib/rouge/lexers/qml.rb +13 -12
- data/lib/rouge/lexers/r.rb +13 -13
- data/lib/rouge/lexers/racket.rb +47 -22
- data/lib/rouge/lexers/reasonml.rb +65 -0
- data/lib/rouge/lexers/rego.rb +45 -0
- data/lib/rouge/lexers/robot_framework.rb +249 -0
- data/lib/rouge/lexers/ruby.rb +88 -71
- data/lib/rouge/lexers/rust.rb +45 -44
- data/lib/rouge/lexers/sas.rb +563 -0
- data/lib/rouge/lexers/sass.rb +9 -8
- data/lib/rouge/lexers/sass/common.rb +41 -40
- data/lib/rouge/lexers/scala.rb +67 -40
- data/lib/rouge/lexers/scheme.rb +19 -18
- data/lib/rouge/lexers/scss.rb +4 -3
- data/lib/rouge/lexers/sed.rb +31 -30
- data/lib/rouge/lexers/shell.rb +67 -55
- data/lib/rouge/lexers/sieve.rb +10 -9
- data/lib/rouge/lexers/slice.rb +32 -0
- data/lib/rouge/lexers/slim.rb +27 -26
- data/lib/rouge/lexers/smalltalk.rb +34 -33
- data/lib/rouge/lexers/smarty.rb +20 -19
- data/lib/rouge/lexers/sml.rb +68 -67
- data/lib/rouge/lexers/solidity.rb +185 -0
- data/lib/rouge/lexers/sparql.rb +129 -0
- data/lib/rouge/lexers/sqf.rb +109 -0
- data/lib/rouge/lexers/sqf/commands.rb +15 -0
- data/lib/rouge/lexers/sql.rb +47 -26
- data/lib/rouge/lexers/supercollider.rb +116 -0
- data/lib/rouge/lexers/swift.rb +49 -44
- data/lib/rouge/lexers/tap.rb +22 -20
- data/lib/rouge/lexers/tcl.rb +28 -27
- data/lib/rouge/lexers/terraform.rb +37 -13
- data/lib/rouge/lexers/tex.rb +20 -19
- data/lib/rouge/lexers/toml.rb +59 -20
- data/lib/rouge/lexers/tsx.rb +1 -0
- data/lib/rouge/lexers/ttcn3.rb +119 -0
- data/lib/rouge/lexers/tulip.rb +38 -36
- data/lib/rouge/lexers/turtle.rb +36 -38
- data/lib/rouge/lexers/twig.rb +1 -0
- data/lib/rouge/lexers/typescript.rb +12 -0
- data/lib/rouge/lexers/typescript/common.rb +1 -0
- data/lib/rouge/lexers/vala.rb +19 -18
- data/lib/rouge/lexers/varnish.rb +168 -0
- data/lib/rouge/lexers/vb.rb +28 -27
- data/lib/rouge/lexers/verilog.rb +27 -28
- data/lib/rouge/lexers/vhdl.rb +12 -11
- data/lib/rouge/lexers/viml.rb +15 -14
- data/lib/rouge/lexers/viml/keywords.rb +2 -0
- data/lib/rouge/lexers/vue.rb +15 -10
- data/lib/rouge/lexers/wollok.rb +27 -26
- data/lib/rouge/lexers/xml.rb +18 -21
- data/lib/rouge/lexers/xojo.rb +61 -0
- data/lib/rouge/lexers/xpath.rb +332 -0
- data/lib/rouge/lexers/xquery.rb +145 -0
- data/lib/rouge/lexers/yaml.rb +64 -61
- data/lib/rouge/lexers/yang.rb +147 -0
- data/lib/rouge/plugins/redcarpet.rb +9 -2
- data/lib/rouge/regex_lexer.rb +27 -25
- data/lib/rouge/template_lexer.rb +1 -0
- data/lib/rouge/tex_theme_renderer.rb +132 -0
- data/lib/rouge/text_analyzer.rb +1 -0
- data/lib/rouge/theme.rb +5 -0
- data/lib/rouge/themes/base16.rb +1 -0
- data/lib/rouge/themes/bw.rb +41 -0
- data/lib/rouge/themes/colorful.rb +1 -0
- data/lib/rouge/themes/github.rb +1 -0
- data/lib/rouge/themes/gruvbox.rb +1 -0
- data/lib/rouge/themes/igor_pro.rb +1 -0
- data/lib/rouge/themes/magritte.rb +78 -0
- data/lib/rouge/themes/molokai.rb +1 -0
- data/lib/rouge/themes/monokai.rb +1 -0
- data/lib/rouge/themes/monokai_sublime.rb +4 -1
- data/lib/rouge/themes/pastie.rb +2 -1
- data/lib/rouge/themes/thankful_eyes.rb +2 -1
- data/lib/rouge/themes/tulip.rb +2 -1
- data/lib/rouge/token.rb +31 -22
- data/lib/rouge/util.rb +3 -2
- data/lib/rouge/version.rb +2 -1
- data/rouge.gemspec +6 -3
- metadata +130 -8
- data/lib/rouge/lexers/apache/keywords.yml +0 -764
- data/lib/rouge/lexers/lasso/keywords.yml +0 -446
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*- #
|
|
2
|
+
# frozen_string_literal: true
|
|
3
|
+
|
|
4
|
+
module Rouge
|
|
5
|
+
module Lexers
|
|
6
|
+
class SuperCollider < RegexLexer
|
|
7
|
+
tag 'supercollider'
|
|
8
|
+
filenames '*.sc', '*.scd'
|
|
9
|
+
|
|
10
|
+
title "SuperCollider"
|
|
11
|
+
desc 'A cross-platform interpreted programming language for sound synthesis, algorithmic composition, and realtime performance'
|
|
12
|
+
|
|
13
|
+
def self.keywords
|
|
14
|
+
@keywords ||= Set.new %w(
|
|
15
|
+
var arg classvar const super this
|
|
16
|
+
)
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
# these aren't technically keywords, but we treat
|
|
20
|
+
# them as such because it makes things clearer 99%
|
|
21
|
+
# of the time
|
|
22
|
+
def self.reserved
|
|
23
|
+
@reserved ||= Set.new %w(
|
|
24
|
+
case do for forBy loop if while new newCopyArgs
|
|
25
|
+
)
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def self.constants
|
|
29
|
+
@constants ||= Set.new %w(
|
|
30
|
+
true false nil inf thisThread
|
|
31
|
+
thisMethod thisFunction thisProcess
|
|
32
|
+
thisFunctionDef currentEnvironment
|
|
33
|
+
topEnvironment
|
|
34
|
+
)
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
state :whitespace do
|
|
38
|
+
rule %r/\s+/m, Text
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
state :comments do
|
|
42
|
+
rule %r(//.*?$), Comment::Single
|
|
43
|
+
rule %r(/[*]) do
|
|
44
|
+
token Comment::Multiline
|
|
45
|
+
push :nested_comment
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
state :nested_comment do
|
|
50
|
+
rule %r(/[*]), Comment::Multiline, :nested_comment
|
|
51
|
+
rule %r([*]/), Comment::Multiline, :pop!
|
|
52
|
+
rule %r([^*/]+)m, Comment::Multiline
|
|
53
|
+
rule %r/./, Comment::Multiline
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
state :root do
|
|
57
|
+
mixin :whitespace
|
|
58
|
+
mixin :comments
|
|
59
|
+
|
|
60
|
+
rule %r/[\-+]?0[xX]\h+/, Num::Hex
|
|
61
|
+
|
|
62
|
+
# radix float
|
|
63
|
+
rule %r/[\-+]?\d+r[0-9a-zA-Z]*(\.[0-9A-Z]*)?/, Num::Float
|
|
64
|
+
|
|
65
|
+
# normal float
|
|
66
|
+
rule %r/[\-+]?((\d+(\.\d+)?([eE][\-+]?\d+)?(pi)?)|pi)/, Num::Float
|
|
67
|
+
|
|
68
|
+
rule %r/[\-+]?\d+/, Num::Integer
|
|
69
|
+
|
|
70
|
+
rule %r/\$(\\.|.)/, Str::Char
|
|
71
|
+
|
|
72
|
+
rule %r/"([^\\"]|\\.)*"/, Str
|
|
73
|
+
|
|
74
|
+
# symbols (single-quote notation)
|
|
75
|
+
rule %r/'([^\\']|\\.)*'/, Str::Other
|
|
76
|
+
|
|
77
|
+
# symbols (backslash notation)
|
|
78
|
+
rule %r/\\\w+/, Str::Other
|
|
79
|
+
|
|
80
|
+
# symbol arg
|
|
81
|
+
rule %r/[A-Za-z_]\w*:/, Name::Label
|
|
82
|
+
|
|
83
|
+
rule %r/[A-Z]\w*/, Name::Class
|
|
84
|
+
|
|
85
|
+
# primitive
|
|
86
|
+
rule %r/_\w+/, Name::Function
|
|
87
|
+
|
|
88
|
+
# main identifiers section
|
|
89
|
+
rule %r/[a-z]\w*/ do |m|
|
|
90
|
+
if self.class.keywords.include? m[0]
|
|
91
|
+
token Keyword
|
|
92
|
+
elsif self.class.constants.include? m[0]
|
|
93
|
+
token Keyword::Constant
|
|
94
|
+
elsif self.class.reserved.include? m[0]
|
|
95
|
+
token Keyword::Reserved
|
|
96
|
+
else
|
|
97
|
+
token Name
|
|
98
|
+
end
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
# environment variables
|
|
102
|
+
rule %r/~\w+/, Name::Variable::Global
|
|
103
|
+
|
|
104
|
+
rule %r/[\{\}()\[\];,\.]/, Punctuation
|
|
105
|
+
|
|
106
|
+
# operators. treat # (array unpack) as an operator
|
|
107
|
+
rule %r/[\+\-\*\/&\|%<>=]+/, Operator
|
|
108
|
+
rule %r/[\^:#]/, Operator
|
|
109
|
+
|
|
110
|
+
# treat curry argument as a special operator
|
|
111
|
+
rule %r/\b_\b/, Name::Builtin
|
|
112
|
+
end
|
|
113
|
+
end
|
|
114
|
+
end
|
|
115
|
+
end
|
|
116
|
+
|
data/lib/rouge/lexers/swift.rb
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
# -*- coding: utf-8 -*- #
|
|
2
|
+
# frozen_string_literal: true
|
|
2
3
|
|
|
3
4
|
module Rouge
|
|
4
5
|
module Lexers
|
|
@@ -19,10 +20,12 @@ module Rouge
|
|
|
19
20
|
as dynamicType is new super self Self Type __COLUMN__ __FILE__ __FUNCTION__ __LINE__
|
|
20
21
|
|
|
21
22
|
associativity didSet get infix inout mutating none nonmutating operator override postfix precedence prefix set unowned weak willSet throws rethrows precedencegroup
|
|
23
|
+
|
|
24
|
+
#available #colorLiteral #column #else #elseif #endif #error #file #fileLiteral #function #if #imageLiteral #line #selector #sourceLocation #warning
|
|
22
25
|
)
|
|
23
26
|
|
|
24
27
|
declarations = Set.new %w(
|
|
25
|
-
class deinit enum extension final func import init internal lazy let optional private protocol public required static struct subscript typealias var dynamic indirect associatedtype open fileprivate
|
|
28
|
+
class deinit enum convenience extension final func import init internal lazy let optional private protocol public required static struct subscript typealias var dynamic indirect associatedtype open fileprivate some
|
|
26
29
|
)
|
|
27
30
|
|
|
28
31
|
constants = Set.new %w(
|
|
@@ -33,7 +36,7 @@ module Rouge
|
|
|
33
36
|
|
|
34
37
|
# beginning of line
|
|
35
38
|
state :bol do
|
|
36
|
-
rule /#.*/, Comment::Preproc
|
|
39
|
+
rule %r/#.*/, Comment::Preproc
|
|
37
40
|
|
|
38
41
|
mixin :inline_whitespace
|
|
39
42
|
|
|
@@ -41,12 +44,12 @@ module Rouge
|
|
|
41
44
|
end
|
|
42
45
|
|
|
43
46
|
state :inline_whitespace do
|
|
44
|
-
rule /\s+/m, Text
|
|
47
|
+
rule %r/\s+/m, Text
|
|
45
48
|
mixin :has_comments
|
|
46
49
|
end
|
|
47
50
|
|
|
48
51
|
state :whitespace do
|
|
49
|
-
rule /\n+/m, Text, :bol
|
|
52
|
+
rule %r/\n+/m, Text, :bol
|
|
50
53
|
rule %r(\/\/.*?$), Comment::Single, :bol
|
|
51
54
|
mixin :inline_whitespace
|
|
52
55
|
end
|
|
@@ -59,27 +62,28 @@ module Rouge
|
|
|
59
62
|
mixin :has_comments
|
|
60
63
|
rule %r([*]/), Comment::Multiline, :pop!
|
|
61
64
|
rule %r([^*/]+)m, Comment::Multiline
|
|
62
|
-
rule /./, Comment::Multiline
|
|
65
|
+
rule %r/./, Comment::Multiline
|
|
63
66
|
end
|
|
64
67
|
|
|
65
68
|
state :root do
|
|
66
69
|
mixin :whitespace
|
|
67
|
-
|
|
70
|
+
|
|
71
|
+
rule %r/\$(([1-9]\d*)?\d)/, Name::Variable
|
|
68
72
|
|
|
69
73
|
rule %r{[()\[\]{}:;,?\\]}, Punctuation
|
|
70
74
|
rule %r([-/=+*%<>!&|^.~]+), Operator
|
|
71
|
-
rule /@?"/, Str, :dq
|
|
72
|
-
rule /'(\\.|.)'/, Str::Char
|
|
73
|
-
rule /(\d
|
|
74
|
-
rule /\d+e[+-]?[0-9]+/i, Num::Float
|
|
75
|
-
rule /
|
|
76
|
-
rule /0x[0-9A-Fa-f]+(?:_[0-9A-Fa-f]+)
|
|
77
|
-
rule /0b[01]+(?:_[01]+)*/, Num::Bin
|
|
75
|
+
rule %r/@?"/, Str, :dq
|
|
76
|
+
rule %r/'(\\.|.)'/, Str::Char
|
|
77
|
+
rule %r/(\d+(?:_\d+)*\*|(?:\d+(?:_\d+)*)*\.\d+(?:_\d)*)(e[+-]?\d+(?:_\d)*)?/i, Num::Float
|
|
78
|
+
rule %r/\d+e[+-]?[0-9]+/i, Num::Float
|
|
79
|
+
rule %r/0o?[0-7]+(?:_[0-7]+)*/, Num::Oct
|
|
80
|
+
rule %r/0x[0-9A-Fa-f]+(?:_[0-9A-Fa-f]+)*((\.[0-9A-F]+(?:_[0-9A-F]+)*)?p[+-]?\d+)?/, Num::Hex
|
|
81
|
+
rule %r/0b[01]+(?:_[01]+)*/, Num::Bin
|
|
78
82
|
rule %r{[\d]+(?:_\d+)*}, Num::Integer
|
|
79
83
|
|
|
80
|
-
rule /@#{id}
|
|
84
|
+
rule %r/@#{id}/, Keyword::Declaration
|
|
81
85
|
|
|
82
|
-
rule /(private|internal)(\([ ]*)(\w+)([ ]*\))/ do |m|
|
|
86
|
+
rule %r/(private|internal)(\([ ]*)(\w+)([ ]*\))/ do |m|
|
|
83
87
|
if m[3] == 'set'
|
|
84
88
|
token Keyword::Declaration
|
|
85
89
|
else
|
|
@@ -87,43 +91,43 @@ module Rouge
|
|
|
87
91
|
end
|
|
88
92
|
end
|
|
89
93
|
|
|
90
|
-
rule /(unowned\([ ]*)(\w+)([ ]*\))/ do |m|
|
|
94
|
+
rule %r/(unowned\([ ]*)(\w+)([ ]*\))/ do |m|
|
|
91
95
|
if m[2] == 'safe' || m[2] == 'unsafe'
|
|
92
96
|
token Keyword::Declaration
|
|
93
97
|
else
|
|
94
98
|
groups Keyword::Declaration, Error, Keyword::Declaration
|
|
95
99
|
end
|
|
96
100
|
end
|
|
97
|
-
|
|
98
|
-
rule /#available\([^)]+\)/, Keyword::Declaration
|
|
99
|
-
|
|
100
|
-
rule /(#(?:selector|keyPath)\()([^)]+?(?:[(].*?[)])?)(\))/ do
|
|
101
|
+
|
|
102
|
+
rule %r/#available\([^)]+\)/, Keyword::Declaration
|
|
103
|
+
|
|
104
|
+
rule %r/(#(?:selector|keyPath)\()([^)]+?(?:[(].*?[)])?)(\))/ do
|
|
101
105
|
groups Keyword::Declaration, Name::Function, Keyword::Declaration
|
|
102
106
|
end
|
|
103
|
-
|
|
104
|
-
rule /#(line|file|column|function|dsohandle)/, Keyword::Declaration
|
|
105
107
|
|
|
106
|
-
rule
|
|
108
|
+
rule %r/#(line|file|column|function|dsohandle)/, Keyword::Declaration
|
|
109
|
+
|
|
110
|
+
rule %r/(let|var)\b(\s*)(#{id})/ do
|
|
107
111
|
groups Keyword, Text, Name::Variable
|
|
108
112
|
end
|
|
109
113
|
|
|
110
|
-
rule /(let|var)\b(\s*)([(])/ do
|
|
114
|
+
rule %r/(let|var)\b(\s*)([(])/ do
|
|
111
115
|
groups Keyword, Text, Punctuation
|
|
112
116
|
push :tuple
|
|
113
117
|
end
|
|
114
118
|
|
|
115
|
-
rule /(?!\b(if|while|for|private|internal|unowned|switch|case)\b)\b#{id}(?=(\?|!)?\s*[(])/ do |m|
|
|
119
|
+
rule %r/(?!\b(if|while|for|private|internal|unowned|switch|case)\b)\b#{id}(?=(\?|!)?\s*[(])/ do |m|
|
|
116
120
|
if m[0] =~ /^[[:upper:]]/
|
|
117
121
|
token Keyword::Type
|
|
118
122
|
else
|
|
119
123
|
token Name::Function
|
|
120
124
|
end
|
|
121
125
|
end
|
|
122
|
-
|
|
123
|
-
rule /as[?!]?(?=\s)/, Keyword
|
|
124
|
-
rule /try[!]?(?=\s)/, Keyword
|
|
125
126
|
|
|
126
|
-
rule /
|
|
127
|
+
rule %r/as[?!]?(?=\s)/, Keyword
|
|
128
|
+
rule %r/try[!]?(?=\s)/, Keyword
|
|
129
|
+
|
|
130
|
+
rule %r/(#?(?!default)(?![[:upper:]])#{id})(\s*)(:)/ do
|
|
127
131
|
groups Name::Variable, Text, Punctuation
|
|
128
132
|
end
|
|
129
133
|
|
|
@@ -141,39 +145,40 @@ module Rouge
|
|
|
141
145
|
end
|
|
142
146
|
end
|
|
143
147
|
|
|
144
|
-
rule /(`)(#{id})(`)/ do
|
|
148
|
+
rule %r/(`)(#{id})(`)/ do
|
|
145
149
|
groups Punctuation, Name::Variable, Punctuation
|
|
146
150
|
end
|
|
147
151
|
end
|
|
148
152
|
|
|
149
153
|
state :tuple do
|
|
150
|
-
rule /(#{id})/, Name::Variable
|
|
151
|
-
rule /(`)(#{id})(`)/ do
|
|
154
|
+
rule %r/(#{id})/, Name::Variable
|
|
155
|
+
rule %r/(`)(#{id})(`)/ do
|
|
152
156
|
groups Punctuation, Name::Variable, Punctuation
|
|
153
157
|
end
|
|
154
|
-
rule /,/, Punctuation
|
|
155
|
-
rule /[(]/, Punctuation, :push
|
|
156
|
-
rule /[)]/, Punctuation, :pop!
|
|
158
|
+
rule %r/,/, Punctuation
|
|
159
|
+
rule %r/[(]/, Punctuation, :push
|
|
160
|
+
rule %r/[)]/, Punctuation, :pop!
|
|
157
161
|
mixin :inline_whitespace
|
|
158
162
|
end
|
|
159
163
|
|
|
160
164
|
state :dq do
|
|
161
|
-
rule /\\[\\0tnr'"]/, Str::Escape
|
|
162
|
-
rule /\\[(]/, Str::Escape, :interp
|
|
163
|
-
rule /\\u\{\h{1,8}\}/, Str::Escape
|
|
164
|
-
rule /[^\\"]+/, Str
|
|
165
|
-
rule /"/, Str, :pop!
|
|
165
|
+
rule %r/\\[\\0tnr'"]/, Str::Escape
|
|
166
|
+
rule %r/\\[(]/, Str::Escape, :interp
|
|
167
|
+
rule %r/\\u\{\h{1,8}\}/, Str::Escape
|
|
168
|
+
rule %r/[^\\"]+/, Str
|
|
169
|
+
rule %r/"""/, Str, :pop!
|
|
170
|
+
rule %r/"/, Str, :pop!
|
|
166
171
|
end
|
|
167
172
|
|
|
168
173
|
state :interp do
|
|
169
|
-
rule /[(]/, Punctuation, :interp_inner
|
|
170
|
-
rule /[)]/, Str::Escape, :pop!
|
|
174
|
+
rule %r/[(]/, Punctuation, :interp_inner
|
|
175
|
+
rule %r/[)]/, Str::Escape, :pop!
|
|
171
176
|
mixin :root
|
|
172
177
|
end
|
|
173
178
|
|
|
174
179
|
state :interp_inner do
|
|
175
|
-
rule /[(]/, Punctuation, :push
|
|
176
|
-
rule /[)]/, Punctuation, :pop!
|
|
180
|
+
rule %r/[(]/, Punctuation, :push
|
|
181
|
+
rule %r/[)]/, Punctuation, :pop!
|
|
177
182
|
mixin :root
|
|
178
183
|
end
|
|
179
184
|
end
|
data/lib/rouge/lexers/tap.rb
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
module Rouge
|
|
2
4
|
module Lexers
|
|
3
5
|
class Tap < RegexLexer
|
|
@@ -11,72 +13,72 @@ module Rouge
|
|
|
11
13
|
|
|
12
14
|
state :root do
|
|
13
15
|
# A TAP version may be specified.
|
|
14
|
-
rule /^TAP version \d+\n/, Name::Namespace
|
|
16
|
+
rule %r/^TAP version \d+\n/, Name::Namespace
|
|
15
17
|
|
|
16
18
|
# Specify a plan with a plan line.
|
|
17
|
-
rule /^1\.\.\d+/, Keyword::Declaration, :plan
|
|
19
|
+
rule %r/^1\.\.\d+/, Keyword::Declaration, :plan
|
|
18
20
|
|
|
19
21
|
# A test failure
|
|
20
|
-
rule /^(not ok)([^\S\n]*)(\d*)/ do
|
|
22
|
+
rule %r/^(not ok)([^\S\n]*)(\d*)/ do
|
|
21
23
|
groups Generic::Error, Text, Literal::Number::Integer
|
|
22
24
|
push :test
|
|
23
25
|
end
|
|
24
26
|
|
|
25
27
|
# A test success
|
|
26
|
-
rule /^(ok)([^\S\n]*)(\d*)/ do
|
|
28
|
+
rule %r/^(ok)([^\S\n]*)(\d*)/ do
|
|
27
29
|
groups Keyword::Reserved, Text, Literal::Number::Integer
|
|
28
30
|
push :test
|
|
29
31
|
end
|
|
30
32
|
|
|
31
33
|
# Diagnostics start with a hash.
|
|
32
|
-
rule /^#.*\n/, Comment
|
|
34
|
+
rule %r/^#.*\n/, Comment
|
|
33
35
|
|
|
34
36
|
# TAP's version of an abort statement.
|
|
35
|
-
rule /^Bail out!.*\n/, Generic::Error
|
|
37
|
+
rule %r/^Bail out!.*\n/, Generic::Error
|
|
36
38
|
|
|
37
39
|
# # TAP ignores any unrecognized lines.
|
|
38
|
-
rule /^.*\n/, Text
|
|
40
|
+
rule %r/^.*\n/, Text
|
|
39
41
|
end
|
|
40
42
|
|
|
41
43
|
state :plan do
|
|
42
44
|
# Consume whitespace (but not newline).
|
|
43
|
-
rule /[^\S\n]+/, Text
|
|
45
|
+
rule %r/[^\S\n]+/, Text
|
|
44
46
|
|
|
45
47
|
# A plan may have a directive with it.
|
|
46
|
-
rule /#/, Comment, :directive
|
|
48
|
+
rule %r/#/, Comment, :directive
|
|
47
49
|
|
|
48
50
|
# Or it could just end.
|
|
49
|
-
rule /\n/, Comment, :pop!
|
|
51
|
+
rule %r/\n/, Comment, :pop!
|
|
50
52
|
|
|
51
53
|
# Anything else is wrong.
|
|
52
|
-
rule /.*\n/, Generic::Error, :pop!
|
|
54
|
+
rule %r/.*\n/, Generic::Error, :pop!
|
|
53
55
|
end
|
|
54
56
|
|
|
55
57
|
state :test do
|
|
56
58
|
# Consume whitespace (but not newline).
|
|
57
|
-
rule /[^\S\n]+/, Text
|
|
59
|
+
rule %r/[^\S\n]+/, Text
|
|
58
60
|
|
|
59
61
|
# A test may have a directive with it.
|
|
60
|
-
rule /#/, Comment, :directive
|
|
62
|
+
rule %r/#/, Comment, :directive
|
|
61
63
|
|
|
62
|
-
rule /\S+/, Text
|
|
64
|
+
rule %r/\S+/, Text
|
|
63
65
|
|
|
64
|
-
rule /\n/, Text, :pop!
|
|
66
|
+
rule %r/\n/, Text, :pop!
|
|
65
67
|
end
|
|
66
68
|
|
|
67
69
|
state :directive do
|
|
68
70
|
# Consume whitespace (but not newline).
|
|
69
|
-
rule /[^\S\n]+/, Comment
|
|
71
|
+
rule %r/[^\S\n]+/, Comment
|
|
70
72
|
|
|
71
73
|
# Extract todo items.
|
|
72
|
-
rule /(?i)\bTODO\b/, Comment::Preproc
|
|
74
|
+
rule %r/(?i)\bTODO\b/, Comment::Preproc
|
|
73
75
|
|
|
74
76
|
# Extract skip items.
|
|
75
|
-
rule /(?i)\bSKIP\S*/, Comment::Preproc
|
|
77
|
+
rule %r/(?i)\bSKIP\S*/, Comment::Preproc
|
|
76
78
|
|
|
77
|
-
rule /\S+/, Comment
|
|
79
|
+
rule %r/\S+/, Comment
|
|
78
80
|
|
|
79
|
-
rule /\n/ do
|
|
81
|
+
rule %r/\n/ do
|
|
80
82
|
token Comment
|
|
81
83
|
pop! 2
|
|
82
84
|
end
|
data/lib/rouge/lexers/tcl.rb
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
# -*- coding: utf-8 -*- #
|
|
2
|
+
# frozen_string_literal: true
|
|
2
3
|
|
|
3
4
|
module Rouge
|
|
4
5
|
module Lexers
|
|
@@ -38,33 +39,33 @@ module Rouge
|
|
|
38
39
|
CLOSE = %w| \) \] \} |
|
|
39
40
|
ALL = OPEN + CLOSE
|
|
40
41
|
END_LINE = CLOSE + %w(; \n)
|
|
41
|
-
END_WORD = END_LINE + %w(\
|
|
42
|
+
END_WORD = END_LINE + %w(\r \t \v)
|
|
42
43
|
|
|
43
44
|
CHARS = lambda { |list| Regexp.new %/[#{list.join}]/ }
|
|
44
45
|
NOT_CHARS = lambda { |list| Regexp.new %/[^#{list.join}]/ }
|
|
45
46
|
|
|
46
47
|
state :word do
|
|
47
|
-
rule /\{\*\}/, Keyword
|
|
48
|
+
rule %r/\{\*\}/, Keyword
|
|
48
49
|
|
|
49
50
|
mixin :brace_abort
|
|
50
51
|
mixin :interp
|
|
51
|
-
rule /\{/, Punctuation, :brace
|
|
52
|
-
rule /\(/, Punctuation, :paren
|
|
53
|
-
rule /"/, Str::Double, :string
|
|
54
|
-
rule /#{NOT_CHARS[END_WORD]}+?(?=#{CHARS[OPEN+['\\\\']]})/, Text
|
|
52
|
+
rule %r/\{/, Punctuation, :brace
|
|
53
|
+
rule %r/\(/, Punctuation, :paren
|
|
54
|
+
rule %r/"/, Str::Double, :string
|
|
55
|
+
rule %r/#{NOT_CHARS[END_WORD]}+?(?=#{CHARS[OPEN+['\\\\']]})/, Text
|
|
55
56
|
end
|
|
56
57
|
|
|
57
58
|
def self.gen_command_state(name='')
|
|
58
59
|
state(:"command#{name}") do
|
|
59
60
|
mixin :word
|
|
60
61
|
|
|
61
|
-
rule /##{NOT_CHARS[END_LINE]}+/, Comment::Single
|
|
62
|
+
rule %r/##{NOT_CHARS[END_LINE]}+/, Comment::Single
|
|
62
63
|
|
|
63
|
-
rule /(?=#{CHARS[END_WORD]})/ do
|
|
64
|
+
rule %r/(?=#{CHARS[END_WORD]})/ do
|
|
64
65
|
push :"params#{name}"
|
|
65
66
|
end
|
|
66
67
|
|
|
67
|
-
rule /#{NOT_CHARS[END_WORD]}+/ do |m|
|
|
68
|
+
rule %r/#{NOT_CHARS[END_WORD]}+/ do |m|
|
|
68
69
|
if KEYWORDS.include? m[0]
|
|
69
70
|
token Keyword
|
|
70
71
|
elsif BUILTINS.include? m[0]
|
|
@@ -115,7 +116,7 @@ module Rouge
|
|
|
115
116
|
# such things as [ abc" ] are a runtime error, but will still
|
|
116
117
|
# parse. Currently something like this will muck up the lex.
|
|
117
118
|
state :brace_abort do
|
|
118
|
-
rule /}/ do
|
|
119
|
+
rule %r/}/ do
|
|
119
120
|
if in_state? :brace
|
|
120
121
|
pop! until state? :brace
|
|
121
122
|
pop!
|
|
@@ -127,12 +128,12 @@ module Rouge
|
|
|
127
128
|
end
|
|
128
129
|
|
|
129
130
|
state :params do
|
|
130
|
-
rule /;/, Punctuation, :pop!
|
|
131
|
-
rule /\n/, Text, :pop!
|
|
132
|
-
rule /else|elseif|then/, Keyword
|
|
131
|
+
rule %r/;/, Punctuation, :pop!
|
|
132
|
+
rule %r/\n/, Text, :pop!
|
|
133
|
+
rule %r/else|elseif|then/, Keyword
|
|
133
134
|
mixin :word
|
|
134
135
|
mixin :whitespace
|
|
135
|
-
rule /#{NOT_CHARS[END_WORD]}+/, Text
|
|
136
|
+
rule %r/#{NOT_CHARS[END_WORD]}+/, Text
|
|
136
137
|
end
|
|
137
138
|
|
|
138
139
|
gen_delimiter_states :brace, /\}/, :strict => false
|
|
@@ -146,37 +147,37 @@ module Rouge
|
|
|
146
147
|
|
|
147
148
|
state :whitespace do
|
|
148
149
|
# not a multiline regex because we want to capture \n sometimes
|
|
149
|
-
rule /\s+/, Text
|
|
150
|
+
rule %r/\s+/, Text
|
|
150
151
|
end
|
|
151
152
|
|
|
152
153
|
state :interp do
|
|
153
|
-
rule /\[/, Punctuation, :bracket
|
|
154
|
-
rule /\$[a-z0-9.:-]+/, Name::Variable
|
|
155
|
-
rule /\$\{.*?\}/m, Name::Variable
|
|
156
|
-
rule /\$/, Text
|
|
154
|
+
rule %r/\[/, Punctuation, :bracket
|
|
155
|
+
rule %r/\$[a-z0-9.:-]+/, Name::Variable
|
|
156
|
+
rule %r/\$\{.*?\}/m, Name::Variable
|
|
157
|
+
rule %r/\$/, Text
|
|
157
158
|
|
|
158
159
|
# escape sequences
|
|
159
|
-
rule /\\[0-7]{3}/, Str::Escape
|
|
160
|
-
rule /\\x[0-9a-f]{2}/i, Str::Escape
|
|
161
|
-
rule /\\u[0-9a-f]{4}/i, Str::Escape
|
|
162
|
-
rule /\\./m, Str::Escape
|
|
160
|
+
rule %r/\\[0-7]{3}/, Str::Escape
|
|
161
|
+
rule %r/\\x[0-9a-f]{2}/i, Str::Escape
|
|
162
|
+
rule %r/\\u[0-9a-f]{4}/i, Str::Escape
|
|
163
|
+
rule %r/\\./m, Str::Escape
|
|
163
164
|
end
|
|
164
165
|
|
|
165
166
|
state :string do
|
|
166
|
-
rule /"/, Str::Double, :pop!
|
|
167
|
+
rule %r/"/, Str::Double, :pop!
|
|
167
168
|
mixin :interp
|
|
168
|
-
rule /[^\\\[\$"{}]+/m, Str::Double
|
|
169
|
+
rule %r/[^\\\[\$"{}]+/m, Str::Double
|
|
169
170
|
|
|
170
171
|
# strings have to keep count of their internal braces, to support
|
|
171
172
|
# for example { "{ }" }.
|
|
172
|
-
rule /{/ do
|
|
173
|
+
rule %r/{/ do
|
|
173
174
|
@brace_count ||= 0
|
|
174
175
|
@brace_count += 1
|
|
175
176
|
|
|
176
177
|
token Str::Double
|
|
177
178
|
end
|
|
178
179
|
|
|
179
|
-
rule /}/ do
|
|
180
|
+
rule %r/}/ do
|
|
180
181
|
if in_state? :brace and @brace_count.to_i == 0
|
|
181
182
|
pop! until state? :brace
|
|
182
183
|
pop!
|