diff --git a/gherkin/java/src/main/java/gherkin/GherkinLanguageConstants.java b/gherkin/java/src/main/java/gherkin/GherkinLanguageConstants.java index 7b6c649d61..c646a73468 100644 --- a/gherkin/java/src/main/java/gherkin/GherkinLanguageConstants.java +++ b/gherkin/java/src/main/java/gherkin/GherkinLanguageConstants.java @@ -1,10 +1,14 @@ package gherkin; +import java.util.regex.Pattern; + public interface GherkinLanguageConstants { String TAG_PREFIX = "@"; String COMMENT_PREFIX = "#"; - String TITLE_KEYWORD_SEPARATOR = ":"; + Pattern TITLE_KEYWORD_SEPARATOR = Pattern.compile(":|:"); String TABLE_CELL_SEPARATOR = "|"; String DOCSTRING_SEPARATOR = "\"\"\""; String DOCSTRING_ALTERNATIVE_SEPARATOR = "```"; + + } diff --git a/gherkin/java/src/main/java/gherkin/GherkinLine.java b/gherkin/java/src/main/java/gherkin/GherkinLine.java index 2c7ba6763a..7931d7e924 100644 --- a/gherkin/java/src/main/java/gherkin/GherkinLine.java +++ b/gherkin/java/src/main/java/gherkin/GherkinLine.java @@ -3,6 +3,7 @@ import java.util.ArrayList; import java.util.List; import java.util.Scanner; +import java.util.regex.Matcher; import static gherkin.StringUtils.ltrim; import static gherkin.SymbolCounter.countSymbols; @@ -56,10 +57,14 @@ public List getTags() { @Override public boolean startsWithTitleKeyword(String text) { int textLength = text.length(); - return trimmedLineText.length() > textLength && - trimmedLineText.startsWith(text) && - trimmedLineText.substring(textLength, textLength + GherkinLanguageConstants.TITLE_KEYWORD_SEPARATOR.length()) - .equals(GherkinLanguageConstants.TITLE_KEYWORD_SEPARATOR); + if (trimmedLineText.length() > textLength && trimmedLineText.startsWith(text)) { + String rest = trimmedLineText.substring(textLength); + Matcher matcher = GherkinLanguageConstants.TITLE_KEYWORD_SEPARATOR.matcher(rest); + if(matcher.find() && matcher.start() == 0){ + return true; + } + } + return false; // TODO aslak: extract startsWithFrom method for clarity } diff --git a/gherkin/java/src/main/java/gherkin/TokenMatcher.java b/gherkin/java/src/main/java/gherkin/TokenMatcher.java index 63e0006b07..2a5ce4aac8 100644 --- a/gherkin/java/src/main/java/gherkin/TokenMatcher.java +++ b/gherkin/java/src/main/java/gherkin/TokenMatcher.java @@ -135,7 +135,7 @@ public boolean match_ExamplesLine(Token token) { private boolean matchTitleLine(Token token, TokenType tokenType, List keywords) { for (String keyword : keywords) { if (token.line.startsWithTitleKeyword(keyword)) { - String title = token.line.getRestTrimmed(keyword.length() + GherkinLanguageConstants.TITLE_KEYWORD_SEPARATOR.length()); + String title = token.line.getRestTrimmed(keyword.length() + 1); setTokenMatched(token, tokenType, title, keyword, null, null); return true; } diff --git a/gherkin/java/testdata/good/i18n_zh-cn.feature b/gherkin/java/testdata/good/i18n_zh-cn.feature new file mode 100644 index 0000000000..bf997ede8e --- /dev/null +++ b/gherkin/java/testdata/good/i18n_zh-cn.feature @@ -0,0 +1,5 @@ +#language: zh-CN +功能:汉语解析 + + 场景:冒号可以用在功能和场景中 + * 冒号 diff --git a/gherkin/java/testdata/good/i18n_zh-cn.feature.ast.ndjson b/gherkin/java/testdata/good/i18n_zh-cn.feature.ast.ndjson new file mode 100644 index 0000000000..c95ebc7fe6 --- /dev/null +++ b/gherkin/java/testdata/good/i18n_zh-cn.feature.ast.ndjson @@ -0,0 +1,42 @@ +{ + "document": { + "comments": [], + "feature": { + "children": [ + { + "keyword": "场景", + "location": { + "column": 3, + "line": 4 + }, + "name": "冒号可以用在功能和场景中", + "steps": [ + { + "keyword": "* ", + "location": { + "column": 5, + "line": 5 + }, + "text": "冒号", + "type": "Step" + } + ], + "tags": [], + "type": "Scenario" + } + ], + "keyword": "功能", + "language": "zh-CN", + "location": { + "column": 1, + "line": 2 + }, + "name": "汉语解析", + "tags": [], + "type": "Feature" + }, + "type": "GherkinDocument" + }, + "type": "gherkin-document", + "uri": "testdata/good/i18n_zh-cn.feature" +} \ No newline at end of file diff --git a/gherkin/java/testdata/good/i18n_zh-cn.feature.pickles.ndjson b/gherkin/java/testdata/good/i18n_zh-cn.feature.pickles.ndjson new file mode 100644 index 0000000000..ecd26ec47a --- /dev/null +++ b/gherkin/java/testdata/good/i18n_zh-cn.feature.pickles.ndjson @@ -0,0 +1,27 @@ +{ + "pickle": { + "language": "zh-CN", + "locations": [ + { + "column": 3, + "line": 4 + } + ], + "name": "冒号可以用在功能和场景中", + "steps": [ + { + "arguments": [], + "locations": [ + { + "column": 7, + "line": 5 + } + ], + "text": "冒号" + } + ], + "tags": [] + }, + "type": "pickle", + "uri": "testdata/good/i18n_zh-cn.feature" +} \ No newline at end of file diff --git a/gherkin/java/testdata/good/i18n_zh-cn.feature.source.ndjson b/gherkin/java/testdata/good/i18n_zh-cn.feature.source.ndjson new file mode 100644 index 0000000000..af9a1fe6ed --- /dev/null +++ b/gherkin/java/testdata/good/i18n_zh-cn.feature.source.ndjson @@ -0,0 +1,9 @@ +{ + "data": "#language: zh-CN\n功能:汉语解析\n\n 场景:冒号可以用在功能和场景中\n * 冒号\n", + "media": { + "encoding": "utf-8", + "type": "text/vnd.cucumber.gherkin+plain" + }, + "type": "source", + "uri": "testdata/good/i18n_zh-cn.feature" +} \ No newline at end of file diff --git a/gherkin/java/testdata/good/i18n_zh-cn.feature.tokens b/gherkin/java/testdata/good/i18n_zh-cn.feature.tokens new file mode 100644 index 0000000000..44db0d02e7 --- /dev/null +++ b/gherkin/java/testdata/good/i18n_zh-cn.feature.tokens @@ -0,0 +1,6 @@ +(1:1)Language:/zh-CN/ +(2:1)FeatureLine:功能/汉语解析/ +(3:1)Empty:// +(4:3)ScenarioLine:场景/冒号可以用在功能和场景中/ +(5:5)StepLine:* /冒号/ +EOF