Skip to content

Commit 96b5f3f

Browse files
fperradehuelsmann
andauthored
Add markdown support for Perl (#399)
Co-authored-by: Erik Huelsmann <[email protected]>
1 parent 2f86882 commit 96b5f3f

13 files changed

+472
-11
lines changed

CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@ This project adheres to [Semantic Versioning](http://semver.org).
77
This document is formatted according to the principles of [Keep A CHANGELOG](http://keepachangelog.com).
88

99
## [Unreleased]
10+
### Added
11+
- [Perl] Support for Gherkin in Markdown format (MDG)
12+
1013
### Fixed
1114
- [C] Prefer the longest step keyword ([#417](https://github.com/cucumber/gherkin/pull/417))
1215
- [cpp] Actually allow comment inside descriptions ([#414](https://github.com/cucumber/gherkin/pull/414))

perl/Makefile

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@ SOURCE_FILES = $(shell find lib -name "*.pm" | grep -v $(GHERKIN_PARSER) | grep
88
GHERKIN = bin/gherkin
99
GHERKIN_GENERATE_TOKENS = bin/gherkin-generate-tokens
1010

11-
GOOD_FEATURE_FILES = $(shell find ../testdata/good -name "*.feature")
12-
BAD_FEATURE_FILES = $(shell find ../testdata/bad -name "*.feature")
11+
GOOD_FEATURE_FILES = $(shell find ../testdata/good -name "*.feature" -o -name "*.feature.md")
12+
BAD_FEATURE_FILES = $(shell find ../testdata/bad -name "*.feature" -o -name "*.feature.md")
1313

1414
TOKENS = $(patsubst ../testdata/%,acceptance/testdata/%.tokens,$(GOOD_FEATURE_FILES))
1515
ASTS = $(patsubst ../testdata/%,acceptance/testdata/%.ast.ndjson,$(GOOD_FEATURE_FILES))

perl/bin/gherkin-generate-tokens

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,16 +6,23 @@ use lib 'Gherkin-latest/lib';
66

77
use Gherkin::Parser;
88
use Gherkin::TokenFormatterBuilder;
9+
use Gherkin::TokenMatcher;
10+
use Gherkin::MarkdownTokenMatcher;
911

1012
package App::GherkinGenerateTokens;
1113

1214
sub run {
1315
my ( $class, $fh, @file_list ) = @_;
1416

15-
my $parser
16-
= Gherkin::Parser->new( Gherkin::TokenFormatterBuilder->new() );
17-
18-
print $fh join "\n", @{ $parser->parse($_) } for @file_list;
17+
print $fh join "\n",
18+
@{ Gherkin::Parser->new(
19+
Gherkin::TokenFormatterBuilder->new(),
20+
/\.md$/
21+
? Gherkin::MarkdownTokenMatcher->new()
22+
: Gherkin::TokenMatcher->new()
23+
)->parse($_)
24+
}
25+
for @file_list;
1926
print $fh "\n";
2027

2128
}

perl/lib/Gherkin.pm

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ use Cucumber::Messages;
1010
use Gherkin::AstBuilder;
1111
use Gherkin::Parser;
1212
use Gherkin::Pickles::Compiler;
13+
use Gherkin::TokenMatcher;
14+
use Gherkin::MarkdownTokenMatcher;
1315

1416

1517
use Class::XSAccessor accessors =>
@@ -55,8 +57,10 @@ sub from_paths {
5557
source => Cucumber::Messages::Source->new(
5658
uri => $path,
5759
data => $content,
58-
media_type => Cucumber::Messages::Source::MEDIATYPE_TEXT_X_CUCUMBER_GHERKIN_PLAIN,
59-
)
60+
media_type => $path =~ m/\.md$/
61+
? Cucumber::Messages::Source::MEDIATYPE_TEXT_X_CUCUMBER_GHERKIN_MARKDOWN
62+
: Cucumber::Messages::Source::MEDIATYPE_TEXT_X_CUCUMBER_GHERKIN_PLAIN,
63+
)
6064
),
6165
$id_generator,
6266
$sink);
@@ -113,8 +117,11 @@ sub from_source {
113117
if ($self->include_ast or $self->include_pickles) {
114118
my $source = $envelope->source;
115119
my $parser = Gherkin::Parser->new(
116-
Gherkin::AstBuilder->new($id_generator)
117-
);
120+
Gherkin::AstBuilder->new($id_generator),
121+
$source->media_type eq Cucumber::Messages::Source::MEDIATYPE_TEXT_X_CUCUMBER_GHERKIN_MARKDOWN
122+
? Gherkin::MarkdownTokenMatcher->new()
123+
: Gherkin::TokenMatcher->new()
124+
);
118125
my $data = $source->data;
119126

120127
local $@;

perl/lib/Gherkin/Dialect.pm

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,8 @@ one to be used for keyword translation lookup. Out of the box, Gherkin comes
9696
with actual translations, such as C<Afrikaans> as well as 'slang-like'
9797
translations such as "Pirate English".
9898
99-
This module is used by the L<token matcher|Gherkin::TokenMatcher> to identify
99+
This module is used by the L<token matcher|Gherkin::TokenMatcher> and
100+
the L<Markdown token matcher|Gherkin::MarkdownTokenMatcher> to identify
100101
the type of token (input line) passed to the scanner.
101102
102103
=head1 METHODS

0 commit comments

Comments
 (0)