Add first pass
This commit is contained in:
25
README.md
Normal file
25
README.md
Normal file
@@ -0,0 +1,25 @@
|
||||
# Admonition Block Formatter
|
||||
|
||||
This is the code that formats admonition blocks for Exercism.
|
||||
It ensures that blocks always use four tildes.
|
||||
|
||||
For example: it converts
|
||||
````
|
||||
```exercism/note
|
||||
something
|
||||
```
|
||||
````
|
||||
|
||||
to
|
||||
|
||||
```
|
||||
~~~~exercism/note
|
||||
something
|
||||
~~~~
|
||||
```
|
||||
|
||||
## Tests
|
||||
|
||||
The code requires Ruby, but no other dependencies.
|
||||
|
||||
Run the tests by running `rake`.
|
||||
11
Rakefile
Normal file
11
Rakefile
Normal file
@@ -0,0 +1,11 @@
|
||||
require "rake/testtask"
|
||||
|
||||
Rake::TestTask.new(:test) do |t|
|
||||
t.libs << "test"
|
||||
t.libs << "lib"
|
||||
t.warning = false
|
||||
t.test_files = FileList["test/**/*_test.rb"]
|
||||
end
|
||||
|
||||
task default: :test
|
||||
|
||||
29
lib/admonition_block_formatter.rb
Normal file
29
lib/admonition_block_formatter.rb
Normal file
@@ -0,0 +1,29 @@
|
||||
class AdmonitionBlockFormatter
|
||||
def self.format(code)
|
||||
[:format_four, :format_three].each do |meth|
|
||||
while code != (new_code = send(meth, code))
|
||||
code = new_code
|
||||
end
|
||||
end
|
||||
|
||||
code
|
||||
end
|
||||
|
||||
def self.format_three(code)
|
||||
matches = THREE_TILDE_REGEX.match(code)
|
||||
return code unless matches
|
||||
|
||||
matches['before'] + "~~~~" + matches['type'] + matches['admonition'] + "~~~~" + matches['after']
|
||||
end
|
||||
|
||||
def self.format_four(code)
|
||||
matches = FOUR_TILDE_REGEX.match(code)
|
||||
return code unless matches
|
||||
|
||||
matches['before'] + "~~~~" + matches['type'] + matches['admonition'] + "~~~~" + matches['after']
|
||||
end
|
||||
|
||||
THREE_TILDE_REGEX = /(?<before>[\s\S]*)(?<start>```)(?<type>exercism\/[a-z]+)(?<admonition>[\s\S]*?)(?<end>```)(?<after>[\s\S]*)/.freeze
|
||||
FOUR_TILDE_REGEX = /(?<before>[\s\S]*)(?<start>````)(?<type>exercism\/[a-z]+)(?<admonition>[\s\S]*?)(?<end>````)(?<after>[\s\S]*)/.freeze
|
||||
end
|
||||
|
||||
124
test/four_tildes_test.rb
Normal file
124
test/four_tildes_test.rb
Normal file
@@ -0,0 +1,124 @@
|
||||
require 'test_helper'
|
||||
|
||||
class FourTildesTest < Minitest::Test
|
||||
def test_basic
|
||||
input = <<~INPUT
|
||||
````exercism/note
|
||||
something
|
||||
````
|
||||
INPUT
|
||||
|
||||
output = <<~OUTPUT
|
||||
~~~~exercism/note
|
||||
something
|
||||
~~~~
|
||||
OUTPUT
|
||||
|
||||
assert_equal output, AdmonitionBlockFormatter.format(input)
|
||||
end
|
||||
|
||||
def test_fuller
|
||||
input = <<~INPUT
|
||||
something
|
||||
|
||||
````exercism/note
|
||||
some code
|
||||
with a `variable` here
|
||||
some other code
|
||||
````
|
||||
|
||||
endstuff
|
||||
INPUT
|
||||
|
||||
output = <<~OUTPUT
|
||||
something
|
||||
|
||||
~~~~exercism/note
|
||||
some code
|
||||
with a `variable` here
|
||||
some other code
|
||||
~~~~
|
||||
|
||||
endstuff
|
||||
OUTPUT
|
||||
|
||||
assert_equal output, AdmonitionBlockFormatter.format(input)
|
||||
end
|
||||
|
||||
def test_multiple
|
||||
input = <<~INPUT
|
||||
something
|
||||
|
||||
````exercism/note
|
||||
some code
|
||||
````
|
||||
|
||||
else
|
||||
|
||||
````exercism/note
|
||||
other code
|
||||
````
|
||||
|
||||
endstuff
|
||||
INPUT
|
||||
|
||||
output = <<~OUTPUT
|
||||
something
|
||||
|
||||
~~~~exercism/note
|
||||
some code
|
||||
~~~~
|
||||
|
||||
else
|
||||
|
||||
~~~~exercism/note
|
||||
other code
|
||||
~~~~
|
||||
|
||||
endstuff
|
||||
OUTPUT
|
||||
|
||||
assert_equal output, AdmonitionBlockFormatter.format(input)
|
||||
end
|
||||
|
||||
def test_nested
|
||||
input = <<~INPUT
|
||||
````exercism/note
|
||||
before
|
||||
```ruby
|
||||
code1
|
||||
```
|
||||
middle
|
||||
```
|
||||
code2
|
||||
```
|
||||
after
|
||||
````
|
||||
|
||||
```
|
||||
code3
|
||||
```
|
||||
INPUT
|
||||
|
||||
output = <<~OUTPUT
|
||||
~~~~exercism/note
|
||||
before
|
||||
```ruby
|
||||
code1
|
||||
```
|
||||
middle
|
||||
```
|
||||
code2
|
||||
```
|
||||
after
|
||||
~~~~
|
||||
|
||||
```
|
||||
code3
|
||||
```
|
||||
OUTPUT
|
||||
|
||||
assert_equal output, AdmonitionBlockFormatter.format(input)
|
||||
end
|
||||
end
|
||||
|
||||
85
test/mixed_test.rb
Normal file
85
test/mixed_test.rb
Normal file
@@ -0,0 +1,85 @@
|
||||
require 'test_helper'
|
||||
|
||||
class MixedTest < Minitest::Test
|
||||
def test_three_then_four_then_three
|
||||
input = <<~INPUT
|
||||
something
|
||||
|
||||
```exercism/note
|
||||
code 1
|
||||
```
|
||||
|
||||
````exercism/note
|
||||
code 2
|
||||
````
|
||||
|
||||
```exercism/note
|
||||
code 3
|
||||
```
|
||||
|
||||
end bit
|
||||
INPUT
|
||||
|
||||
output = <<~OUTPUT
|
||||
something
|
||||
|
||||
~~~~exercism/note
|
||||
code 1
|
||||
~~~~
|
||||
|
||||
~~~~exercism/note
|
||||
code 2
|
||||
~~~~
|
||||
|
||||
~~~~exercism/note
|
||||
code 3
|
||||
~~~~
|
||||
|
||||
end bit
|
||||
OUTPUT
|
||||
|
||||
assert_equal output, AdmonitionBlockFormatter.format(input)
|
||||
end
|
||||
|
||||
def test_four_then_three_then_four
|
||||
input = <<~INPUT
|
||||
something
|
||||
|
||||
````exercism/note
|
||||
code 1
|
||||
````
|
||||
|
||||
```exercism/note
|
||||
code 2
|
||||
```
|
||||
|
||||
````exercism/note
|
||||
code 3
|
||||
````
|
||||
|
||||
end bit
|
||||
INPUT
|
||||
|
||||
output = <<~OUTPUT
|
||||
something
|
||||
|
||||
~~~~exercism/note
|
||||
code 1
|
||||
~~~~
|
||||
|
||||
~~~~exercism/note
|
||||
code 2
|
||||
~~~~
|
||||
|
||||
~~~~exercism/note
|
||||
code 3
|
||||
~~~~
|
||||
|
||||
end bit
|
||||
OUTPUT
|
||||
|
||||
assert_equal output, AdmonitionBlockFormatter.format(input)
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
8
test/test_helper.rb
Normal file
8
test/test_helper.rb
Normal file
@@ -0,0 +1,8 @@
|
||||
# gem "minitest"
|
||||
require "minitest/autorun"
|
||||
# require "minitest/pride"
|
||||
# require "minitest/mock"
|
||||
# require "mocha/minitest"
|
||||
|
||||
$LOAD_PATH.unshift File.expand_path('lib', __dir__)
|
||||
require "admonition_block_formatter"
|
||||
83
test/three_tildes_test.rb
Normal file
83
test/three_tildes_test.rb
Normal file
@@ -0,0 +1,83 @@
|
||||
require 'test_helper'
|
||||
|
||||
class ThreeTildesTest < Minitest::Test
|
||||
def test_basic
|
||||
input = <<~INPUT
|
||||
```exercism/note
|
||||
something
|
||||
```
|
||||
INPUT
|
||||
|
||||
output = <<~OUTPUT
|
||||
~~~~exercism/note
|
||||
something
|
||||
~~~~
|
||||
OUTPUT
|
||||
|
||||
assert_equal output, AdmonitionBlockFormatter.format(input)
|
||||
end
|
||||
|
||||
def test_fuller
|
||||
input = <<~INPUT
|
||||
something
|
||||
|
||||
```exercism/note
|
||||
some code
|
||||
with a `variable` here
|
||||
some other code
|
||||
```
|
||||
|
||||
endstuff
|
||||
INPUT
|
||||
|
||||
output = <<~OUTPUT
|
||||
something
|
||||
|
||||
~~~~exercism/note
|
||||
some code
|
||||
with a `variable` here
|
||||
some other code
|
||||
~~~~
|
||||
|
||||
endstuff
|
||||
OUTPUT
|
||||
|
||||
assert_equal output, AdmonitionBlockFormatter.format(input)
|
||||
end
|
||||
|
||||
def test_multiple
|
||||
input = <<~INPUT
|
||||
something
|
||||
|
||||
```exercism/note
|
||||
some code
|
||||
```
|
||||
|
||||
else
|
||||
|
||||
```exercism/note
|
||||
other code
|
||||
```
|
||||
|
||||
endstuff
|
||||
INPUT
|
||||
|
||||
output = <<~OUTPUT
|
||||
something
|
||||
|
||||
~~~~exercism/note
|
||||
some code
|
||||
~~~~
|
||||
|
||||
else
|
||||
|
||||
~~~~exercism/note
|
||||
other code
|
||||
~~~~
|
||||
|
||||
endstuff
|
||||
OUTPUT
|
||||
|
||||
assert_equal output, AdmonitionBlockFormatter.format(input)
|
||||
end
|
||||
end
|
||||
Reference in New Issue
Block a user