repper 1.0.0 → 1.1.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 +4 -4
- data/CHANGELOG.md +15 -1
- data/README.md +26 -16
- data/exe/repper +5 -0
- data/lib/repper/codemod.rb +68 -0
- data/lib/repper/command.rb +39 -0
- data/lib/repper/core_ext/regexp.rb +2 -0
- data/lib/repper/format/annotated.rb +3 -2
- data/lib/repper/format/extended.rb +41 -0
- data/lib/repper/format/inline.rb +3 -2
- data/lib/repper/format/plain.rb +3 -2
- data/lib/repper/format/structured.rb +3 -2
- data/lib/repper/format/tabulo_style.rb +1 -1
- data/lib/repper/format.rb +2 -1
- data/lib/repper/{element.rb → token.rb} +15 -2
- data/lib/repper/{parser.rb → tokenizer.rb} +13 -10
- data/lib/repper/version.rb +1 -1
- data/lib/repper.rb +12 -10
- data/repper.gemspec +1 -1
- metadata +11 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6493f978abbb5042a52adf386b6222ed571ba0de09b0926e0fb16104a3b60ad4
|
4
|
+
data.tar.gz: 52604ae6ebccc88a5608de1b57c7e8e0de85ba55aaf1704a2e066c6ae4fe93b5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0306346ad34c63bec6558c6ef9516e675e6a8c6b5caa59d92c3ded9fee74687c74cb69e293df474552e8c9204f0c6dfb78d9fd35d03a7b4c9aa8b86edfd2c28c
|
7
|
+
data.tar.gz: 2c3ebb13aa9795f4992057da6cb318a2bc16b571ad15c52a4117f27c88e4803526a15a06dd0ce0d62eb1a5cd4133dc6a7ebee6ac03e2cd0e4f611571681b8309
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,19 @@
|
|
1
1
|
## [Unreleased]
|
2
2
|
|
3
|
-
|
3
|
+
...
|
4
|
+
|
5
|
+
## [1.1.0] - 2022-05-29
|
6
|
+
|
7
|
+
### Added
|
8
|
+
|
9
|
+
- codemod capability and corresponding `exe/repper` executable
|
10
|
+
- new format `Repper::Format::Extended`
|
11
|
+
- `Regexp#original_inspect` when using `Regexp#inspect` override
|
12
|
+
|
13
|
+
### Fixed
|
14
|
+
|
15
|
+
- use the more appropriate `:inline` format when passing `format: nil | false`
|
16
|
+
|
17
|
+
## [1.0.0] - 2022-05-09
|
4
18
|
|
5
19
|
- Initial release
|
data/README.md
CHANGED
@@ -1,9 +1,8 @@
|
|
1
|
-
<
|
2
|
-
Repper
|
3
|
-
<img alt='Rapper necklace with dollar pendant' src='https://user-images.githubusercontent.com/10758879/167485870-5c49284d-a783-453e-8be0-a3597c2ef97c.png' height='46' align='right' />
|
4
|
-
</h1>
|
1
|
+
<img alt='Rapper necklace with dollar pendant' src='https://user-images.githubusercontent.com/10758879/167485870-5c49284d-a783-453e-8be0-a3597c2ef97c.png' height='64' align='right' />
|
5
2
|
|
6
|
-
Repper
|
3
|
+
# Repper
|
4
|
+
|
5
|
+
Repper is a regular expression pretty printer and formatter for Ruby.
|
7
6
|
|
8
7
|
## Installation
|
9
8
|
|
@@ -11,20 +10,28 @@ Repper is a regular expression pretty printer for Ruby.
|
|
11
10
|
|
12
11
|
## Usage
|
13
12
|
|
14
|
-
`repper` can be integrated into the REPL (e.g. IRB) through core extensions or
|
13
|
+
`repper` can be integrated into the REPL (e.g. IRB) through core extensions for Regexp pretty-printing, integrated into editors to format Regexps, or called manually.
|
15
14
|
|
16
15
|
There are also a few customization options.
|
17
16
|
|
18
|
-
###
|
17
|
+
### REPL integration
|
18
|
+
|
19
|
+
#### Via Regexp#inspect (recommended)
|
19
20
|
|
20
21
|
`require 'repper/core_ext/regexp'` in your `~/.irbrc` or `~/.pryrc` to override `Regexp#inspect` and automatically use `repper` to display Regexps:
|
21
22
|
|
22
|
-
<img width="
|
23
|
+
<img width="475" alt="screenshot1" src="https://user-images.githubusercontent.com/10758879/167719748-60f4013a-c8d4-4a62-843a-d9f27057bcd3.png">
|
23
24
|
|
24
|
-
|
25
|
+
#### Via Kernel#pp
|
25
26
|
|
26
27
|
Alternatively, `require 'repper/core_ext/kernel'` to make the `pp` command give nicer output for Regexps (which will look like above by default).
|
27
28
|
|
29
|
+
### Editor integration
|
30
|
+
|
31
|
+
Use [vscode-repper](https://github.com/jaynetics/vscode-repper) to format Regexps in VSCode.
|
32
|
+
|
33
|
+

|
34
|
+
|
28
35
|
### Using Repper manually
|
29
36
|
|
30
37
|
```ruby
|
@@ -36,11 +43,13 @@ Repper.render(/foo/) # returns the pretty print String
|
|
36
43
|
|
37
44
|
#### Customizing the format
|
38
45
|
|
39
|
-
|
40
|
-
|
41
|
-
If you want to see the indented structure without annotations, use the `:structured` format.
|
46
|
+
Multiple formats are available out of the box:
|
42
47
|
|
43
|
-
|
48
|
+
- `:annotated` is the default, verbose format, shown above
|
49
|
+
- `:inline` adds only colorization and does not restructure the Regexp
|
50
|
+
- `:structured` is like `:annotated`, just without annotations
|
51
|
+
- `:x` (or `:extended`) returns a lightly formatted but equivalent Regexp
|
52
|
+
- this format is used for the repper executable and [vscode-repper](https://github.com/jaynetics/vscode-repper)
|
44
53
|
|
45
54
|
You can change the format globally:
|
46
55
|
|
@@ -50,14 +59,14 @@ Repper.format = :structured
|
|
50
59
|
|
51
60
|
Or pick a format on a case-by-case basis:
|
52
61
|
|
53
|
-
<img width="
|
62
|
+
<img width="711" alt="screenshot2" src="https://user-images.githubusercontent.com/10758879/167719567-ae8ee42f-839e-4ce4-af56-a139044d3436.png">
|
54
63
|
|
55
64
|
Or create your own format:
|
56
65
|
|
57
66
|
```ruby
|
58
67
|
require 'csv'
|
59
68
|
|
60
|
-
csv_format = ->(
|
69
|
+
csv_format = ->(tokens, _theme) { tokens.map(&:text).to_csv }
|
61
70
|
Repper.render(/re[\p{pe}\r]$/, format: csv_format)
|
62
71
|
=> "/,re,[,\\p{pe},\\r,],$,/\n"
|
63
72
|
```
|
@@ -69,7 +78,8 @@ The color theme can also be set globally or passed on call:
|
|
69
78
|
```ruby
|
70
79
|
Repper.theme = :monokai # a nicer theme, if the terminal supports it
|
71
80
|
```
|
72
|
-
|
81
|
+
|
82
|
+
<img width="478" alt="screenshot3" src="https://user-images.githubusercontent.com/10758879/167719807-9170ba92-48d1-4669-a05d-a72f962b961d.png">
|
73
83
|
|
74
84
|
```ruby
|
75
85
|
Repper.call(/foo/, theme: nil) # render without colors
|
data/exe/repper
ADDED
@@ -0,0 +1,68 @@
|
|
1
|
+
module Repper
|
2
|
+
# Formatter for Ruby code containing Regexp literals
|
3
|
+
module Codemod
|
4
|
+
module_function
|
5
|
+
|
6
|
+
def call(code)
|
7
|
+
formatted_code = code.dup
|
8
|
+
|
9
|
+
regexp_locations(code).reverse.each do |loc|
|
10
|
+
beg_idx = code[/\A(.*\n){#{loc.beg_line}}/].size + loc.beg_char
|
11
|
+
end_idx = code[/\A(.*\n){#{loc.end_line}}/].size + loc.end_char
|
12
|
+
range = beg_idx..end_idx
|
13
|
+
|
14
|
+
/\A(?<start>\/|%r.)(?<source>.*)(?<stop>[^a-z])(?<flags>[a-z]*)\z/m =~
|
15
|
+
code[range]
|
16
|
+
|
17
|
+
tokens = Tokenizer.call(source, delimiters: [start, stop], flags: flags)
|
18
|
+
formatted_regexp = Format::Extended.call(tokens, Theme::Plain)
|
19
|
+
|
20
|
+
# indent consistently by applying leading line indentation to all lines
|
21
|
+
lead_indentation = code.lines[loc.beg_line][/^ */]
|
22
|
+
formatted_regexp.gsub!("\n", "\n#{lead_indentation}")
|
23
|
+
|
24
|
+
formatted_code[range] = formatted_regexp
|
25
|
+
end
|
26
|
+
|
27
|
+
formatted_code
|
28
|
+
end
|
29
|
+
|
30
|
+
require 'ripper'
|
31
|
+
|
32
|
+
def regexp_locations(code)
|
33
|
+
embed_level = 0
|
34
|
+
beg_tokens = {}
|
35
|
+
|
36
|
+
Ripper.lex(code).each.with_object([]) do |token, acc|
|
37
|
+
case token[1]
|
38
|
+
when :on_regexp_beg
|
39
|
+
beg_tokens[embed_level] = token
|
40
|
+
# nested regexp literals are not supported a.t.m., so if we're
|
41
|
+
# in an embed, discard the location of the surrounding regexp.
|
42
|
+
beg_tokens[embed_level - 1] = nil
|
43
|
+
when :on_regexp_end
|
44
|
+
next unless beg_token = beg_tokens[embed_level]
|
45
|
+
|
46
|
+
acc << Location.new(
|
47
|
+
beg_line: beg_token[0][0] - 1, # note: using 0-indexed line values
|
48
|
+
beg_char: beg_token[0][1],
|
49
|
+
end_line: token[0][0] - 1,
|
50
|
+
end_char: token[0][1] + (token[2].length - 1), # lex includes flags
|
51
|
+
)
|
52
|
+
when :on_embexpr_beg # embedded expression a.k.a. interpolation (#{...})
|
53
|
+
embed_level += 1
|
54
|
+
when :on_embexpr_end
|
55
|
+
embed_level -= 1
|
56
|
+
when :on_const, :on_ident
|
57
|
+
# OK when embedded - Regexp::Parser will treat them as literals
|
58
|
+
else
|
59
|
+
# other embedded expressions are not supported
|
60
|
+
beg_tokens[embed_level - 1] = nil
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
Location = Struct.new(:beg_line, :beg_char, :end_line, :end_char,
|
66
|
+
keyword_init: true)
|
67
|
+
end
|
68
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
module Repper
|
2
|
+
# Service object for exe/repper
|
3
|
+
module Command
|
4
|
+
module_function
|
5
|
+
|
6
|
+
PARSE_ERROR_EXIT_STATUS = 1
|
7
|
+
|
8
|
+
def call(argv)
|
9
|
+
if argv.count == 0
|
10
|
+
format_stdio
|
11
|
+
else
|
12
|
+
format_files(argv)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def format_stdio
|
17
|
+
input = STDIN.read
|
18
|
+
output = format(input)
|
19
|
+
print output
|
20
|
+
end
|
21
|
+
|
22
|
+
def format(string)
|
23
|
+
Codemod.call(string)
|
24
|
+
rescue Repper::Error => e
|
25
|
+
warn "Parsing failed: #{e.class} - #{e.message}"
|
26
|
+
exit PARSE_ERROR_EXIT_STATUS
|
27
|
+
end
|
28
|
+
|
29
|
+
def format_files(paths)
|
30
|
+
paths.grep(/\.rb\z/).each { |path| format_file(path) }
|
31
|
+
end
|
32
|
+
|
33
|
+
def format_file(path)
|
34
|
+
code = File.read(path)
|
35
|
+
formatted_code = format(code)
|
36
|
+
File.write(path, formatted_code)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -1,7 +1,8 @@
|
|
1
1
|
module Repper
|
2
2
|
module Format
|
3
|
-
|
4
|
-
|
3
|
+
# A structured and colorized format with annotations about token types.
|
4
|
+
Annotated = ->(tokens, theme) do
|
5
|
+
table = Tabulo::Table.new(tokens.reject(&:whitespace?), **TABULO_STYLE)
|
5
6
|
table.add_column(
|
6
7
|
:indented_text,
|
7
8
|
styler: ->(_, string, cell) { theme.colorize(string, cell.source.type) }
|
@@ -0,0 +1,41 @@
|
|
1
|
+
module Repper
|
2
|
+
module Format
|
3
|
+
# A lightly structured format that retains parsability
|
4
|
+
# and functional equivalence, for use in code.
|
5
|
+
Extended = ->(tokens, theme) do
|
6
|
+
run_types = %i[escape literal nonposixclass nonproperty
|
7
|
+
posixclass property set type]
|
8
|
+
forms_run = ->(el){ run_types.include?(el.type) || el.subtype == :dot }
|
9
|
+
prev = nil
|
10
|
+
|
11
|
+
tokens.each.with_object(''.dup) do |tok, acc|
|
12
|
+
# drop existing x-mode whitespace, if any
|
13
|
+
if tok.whitespace?
|
14
|
+
next
|
15
|
+
# keep some tokens in line:
|
16
|
+
# - option switches and conditions for syntactic correctness
|
17
|
+
# - quantifiers and codepoint runs for conciseness
|
18
|
+
elsif tok.type == :quantifier ||
|
19
|
+
tok.subtype == :options_switch && tok.text == ')' ||
|
20
|
+
tok.subtype == :condition ||
|
21
|
+
prev && forms_run.call(prev) && forms_run.call(tok)
|
22
|
+
acc << theme.colorize(tok.inlined_text, tok.type)
|
23
|
+
# keep comments in line, too, but with padding
|
24
|
+
elsif tok.comment?
|
25
|
+
acc << " #{theme.colorize(tok.inlined_text, tok.type)}"
|
26
|
+
# render root start as wtokl as empty root end in same line
|
27
|
+
elsif tok.subtype == :root && (prev.nil? || prev.subtype == :root)
|
28
|
+
acc << theme.colorize(tok.text, tok.type)
|
29
|
+
# tokse, if root is not empty, ensure x-flag is present at end
|
30
|
+
elsif tok.subtype == :root
|
31
|
+
acc << "\n#{theme.colorize(tok.text.sub(/x?\z/, 'x'), tok.type)}"
|
32
|
+
# render other tokens on their own lines for an indented structure,
|
33
|
+
# e.g. groups, alternations, anchors, assertions, ...
|
34
|
+
else
|
35
|
+
acc << "\n#{theme.colorize(tok.indented_text, tok.type)}"
|
36
|
+
end
|
37
|
+
prev = tok
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
data/lib/repper/format/inline.rb
CHANGED
@@ -1,7 +1,8 @@
|
|
1
1
|
module Repper
|
2
2
|
module Format
|
3
|
-
|
4
|
-
|
3
|
+
# A format that only adds color but does not change structure.
|
4
|
+
Inline = ->(tokens, theme) do
|
5
|
+
tokens.map { |tok| theme.colorize(tok.text, tok.type) }.join
|
5
6
|
end
|
6
7
|
end
|
7
8
|
end
|
data/lib/repper/format/plain.rb
CHANGED
@@ -1,7 +1,8 @@
|
|
1
1
|
module Repper
|
2
2
|
module Format
|
3
|
-
|
4
|
-
|
3
|
+
# A structured format with colorization.
|
4
|
+
Structured = ->(tokens, theme) do
|
5
|
+
table = Tabulo::Table.new(tokens.reject(&:whitespace?), **TABULO_STYLE)
|
5
6
|
table.add_column(
|
6
7
|
:indented_text,
|
7
8
|
styler: ->(_, string, cell) { theme.colorize(string, cell.source.type) }
|
data/lib/repper/format.rb
CHANGED
@@ -3,8 +3,9 @@ module Repper
|
|
3
3
|
def self.cast(arg)
|
4
4
|
case arg
|
5
5
|
when ::Proc then arg
|
6
|
+
when :x then Format::Extended
|
6
7
|
when ::Symbol, ::String then Format.const_get(arg.capitalize) rescue nil
|
7
|
-
when false, nil then Format::
|
8
|
+
when false, nil then Format::Inline
|
8
9
|
end || raise(Repper::ArgumentError, "unknown format #{arg.inspect}")
|
9
10
|
end
|
10
11
|
end
|
@@ -1,14 +1,27 @@
|
|
1
1
|
module Repper
|
2
|
-
|
2
|
+
Token = Struct.new(:type, :subtype, :level, :text, :id, keyword_init: true) do
|
3
3
|
def indented_text
|
4
|
-
inlined_text = text.gsub(/[\n\r\t\v]/) { |ws| ws.inspect.delete(?") }
|
5
4
|
"#{' ' * level}#{inlined_text}"
|
6
5
|
end
|
7
6
|
|
7
|
+
def inlined_text
|
8
|
+
if comment?
|
9
|
+
text.strip
|
10
|
+
else
|
11
|
+
text
|
12
|
+
.gsub(/(?<!\\) /, '\\ ')
|
13
|
+
.gsub(/[\n\r\t\v]/) { |ws| ws.inspect.delete(?") }
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
8
17
|
def whitespace?
|
9
18
|
subtype == :whitespace
|
10
19
|
end
|
11
20
|
|
21
|
+
def comment?
|
22
|
+
subtype == :comment
|
23
|
+
end
|
24
|
+
|
12
25
|
def annotation
|
13
26
|
case [type, subtype]
|
14
27
|
in [_, :root]
|
@@ -1,28 +1,28 @@
|
|
1
1
|
require 'regexp_parser'
|
2
2
|
|
3
3
|
module Repper
|
4
|
-
module
|
4
|
+
module Tokenizer
|
5
5
|
module_function
|
6
6
|
|
7
|
-
def call(regexp)
|
8
|
-
tree =
|
9
|
-
flatten(tree)
|
7
|
+
def call(regexp, delimiters: ['/', '/'], flags: nil)
|
8
|
+
tree = Regexp::Parser.parse(regexp, options: flags =~ /x/ && Regexp::EXTENDED)
|
9
|
+
flatten(tree, delimiters: delimiters, flags: flags)
|
10
10
|
rescue ::Regexp::Parser::Error => e
|
11
11
|
raise e.extend(Repper::Error)
|
12
12
|
end
|
13
13
|
|
14
14
|
# Turn Regexp::Parser AST back into a flat Array of visual elements
|
15
15
|
# that match the Regexp notation.
|
16
|
-
def flatten(exp, acc = [])
|
16
|
+
def flatten(exp, acc = [], delimiters: nil, flags: nil)
|
17
17
|
# Add opening entry.
|
18
|
-
exp.is?(:root) && acc <<
|
18
|
+
exp.is?(:root) && acc << make_token(exp, delimiters[0])
|
19
19
|
|
20
20
|
# Ignore nesting of invisible intermediate branches for better visuals.
|
21
21
|
exp.is?(:sequence) && exp.nesting_level -= 1
|
22
22
|
|
23
23
|
exp.parts.each do |part|
|
24
24
|
if part.instance_of?(::String)
|
25
|
-
acc <<
|
25
|
+
acc << make_token(exp, part)
|
26
26
|
else # part.is_a?(Regexp::Expression::Base)
|
27
27
|
flatten(part, acc)
|
28
28
|
end
|
@@ -31,13 +31,16 @@ module Repper
|
|
31
31
|
exp.quantified? && flatten(exp.quantifier, acc)
|
32
32
|
|
33
33
|
# Add closing entry.
|
34
|
-
exp.is?(:root) &&
|
34
|
+
exp.is?(:root) && begin
|
35
|
+
flags ||= exp.options.keys.join
|
36
|
+
acc << make_token(exp, "#{delimiters[1]}#{flags.chars.uniq.sort.join}")
|
37
|
+
end
|
35
38
|
|
36
39
|
acc
|
37
40
|
end
|
38
41
|
|
39
|
-
def
|
40
|
-
|
42
|
+
def make_token(exp, text)
|
43
|
+
Token.new(
|
41
44
|
type: exp.type,
|
42
45
|
subtype: exp.token,
|
43
46
|
level: exp.nesting_level,
|
data/lib/repper/version.rb
CHANGED
data/lib/repper.rb
CHANGED
@@ -1,7 +1,9 @@
|
|
1
|
-
require_relative "repper/
|
1
|
+
require_relative "repper/codemod"
|
2
|
+
require_relative "repper/command"
|
2
3
|
require_relative "repper/errors"
|
3
4
|
require_relative "repper/format"
|
4
|
-
require_relative "repper/
|
5
|
+
require_relative "repper/token"
|
6
|
+
require_relative "repper/tokenizer"
|
5
7
|
require_relative "repper/theme"
|
6
8
|
require_relative "repper/version"
|
7
9
|
|
@@ -14,18 +16,18 @@ module Repper
|
|
14
16
|
end
|
15
17
|
|
16
18
|
def render(regexp, format: self.format, theme: self.theme)
|
17
|
-
|
18
|
-
format
|
19
|
-
theme
|
20
|
-
format.call(
|
19
|
+
tokens = Tokenizer.call(regexp)
|
20
|
+
format = Format.cast(format)
|
21
|
+
theme = Theme.cast(theme)
|
22
|
+
format.call(tokens, theme)
|
21
23
|
end
|
22
24
|
|
23
|
-
def
|
24
|
-
@
|
25
|
+
def format=(arg)
|
26
|
+
@format = Format.cast(arg)
|
25
27
|
end
|
26
28
|
|
27
|
-
def
|
28
|
-
@
|
29
|
+
def theme=(arg)
|
30
|
+
@theme = Theme.cast(arg)
|
29
31
|
end
|
30
32
|
end
|
31
33
|
|
data/repper.gemspec
CHANGED
@@ -6,7 +6,7 @@ Gem::Specification.new do |spec|
|
|
6
6
|
spec.authors = ["Janosch Müller"]
|
7
7
|
spec.email = ["janosch84@gmail.com"]
|
8
8
|
|
9
|
-
spec.summary = "Regexp pretty printer for Ruby"
|
9
|
+
spec.summary = "Regexp pretty printer and formatter for Ruby"
|
10
10
|
spec.homepage = "https://github.com/jaynetics/repper"
|
11
11
|
spec.license = "MIT"
|
12
12
|
spec.required_ruby_version = ">= 2.7.0"
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: repper
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Janosch Müller
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-05-
|
11
|
+
date: 2022-05-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rainbow
|
@@ -55,7 +55,8 @@ dependencies:
|
|
55
55
|
description:
|
56
56
|
email:
|
57
57
|
- janosch84@gmail.com
|
58
|
-
executables:
|
58
|
+
executables:
|
59
|
+
- repper
|
59
60
|
extensions: []
|
60
61
|
extra_rdoc_files: []
|
61
62
|
files:
|
@@ -65,24 +66,28 @@ files:
|
|
65
66
|
- LICENSE.txt
|
66
67
|
- README.md
|
67
68
|
- Rakefile
|
69
|
+
- exe/repper
|
68
70
|
- lib/repper.rb
|
71
|
+
- lib/repper/codemod.rb
|
72
|
+
- lib/repper/command.rb
|
69
73
|
- lib/repper/core_ext/kernel.rb
|
70
74
|
- lib/repper/core_ext/kernel_ext.rb
|
71
75
|
- lib/repper/core_ext/regexp.rb
|
72
76
|
- lib/repper/core_ext/regexp_ext.rb
|
73
|
-
- lib/repper/element.rb
|
74
77
|
- lib/repper/errors.rb
|
75
78
|
- lib/repper/format.rb
|
76
79
|
- lib/repper/format/annotated.rb
|
80
|
+
- lib/repper/format/extended.rb
|
77
81
|
- lib/repper/format/inline.rb
|
78
82
|
- lib/repper/format/plain.rb
|
79
83
|
- lib/repper/format/structured.rb
|
80
84
|
- lib/repper/format/tabulo_style.rb
|
81
|
-
- lib/repper/parser.rb
|
82
85
|
- lib/repper/theme.rb
|
83
86
|
- lib/repper/theme/default.rb
|
84
87
|
- lib/repper/theme/monokai.rb
|
85
88
|
- lib/repper/theme/plain.rb
|
89
|
+
- lib/repper/token.rb
|
90
|
+
- lib/repper/tokenizer.rb
|
86
91
|
- lib/repper/version.rb
|
87
92
|
- repper.gemspec
|
88
93
|
- repper.svg
|
@@ -112,5 +117,5 @@ requirements: []
|
|
112
117
|
rubygems_version: 3.4.0.dev
|
113
118
|
signing_key:
|
114
119
|
specification_version: 4
|
115
|
-
summary: Regexp pretty printer for Ruby
|
120
|
+
summary: Regexp pretty printer and formatter for Ruby
|
116
121
|
test_files: []
|