diff --git a/shirelang/src/main/grammar/ShireLexer.flex b/shirelang/src/main/grammar/ShireLexer.flex index ff7f6b25f..d6f8770d2 100644 --- a/shirelang/src/main/grammar/ShireLexer.flex +++ b/shirelang/src/main/grammar/ShireLexer.flex @@ -110,6 +110,7 @@ AFTER_STREAMING =afterStreaming private boolean isInsideShireTemplate = false; private boolean isInsideFunctionBlock = false; private boolean isInsideFrontMatter = false; + private boolean hasFrontMatter = false; private boolean patternActionBraceStart = false; private int patternActionBraceLevel = 0; %} @@ -217,7 +218,16 @@ AFTER_STREAMING =afterStreaming %% { - "---" { isInsideFrontMatter = true; yybegin(FRONT_MATTER_BLOCK); return FRONTMATTER_START; } + "---" { + if (hasFrontMatter | isCodeStart) { + return CODE_CONTENT; + } else { + isInsideFrontMatter = true; + yybegin(FRONT_MATTER_BLOCK); + return FRONTMATTER_START; + } + } + {CODE_CONTENT} { return content(); } {NEWLINE} { return NEWLINE; } "[" { yypushback(yylength()); yybegin(COMMENT_BLOCK); } @@ -242,7 +252,8 @@ AFTER_STREAMING =afterStreaming {INDENT} { yybegin(FRONT_MATTER_VAL_OBJECT); return INDENT; } {NEWLINE} { return NEWLINE; } - "---" { isInsideFrontMatter = false; yybegin(YYINITIAL); return FRONTMATTER_END; } + + "---" { isInsideFrontMatter = false; hasFrontMatter = true; yybegin(YYINITIAL); return FRONTMATTER_END; } [^] { yypushback(yylength()); yybegin(YYINITIAL); } } diff --git a/shirelang/src/test/testData/parser/MarkdownCompatible.txt b/shirelang/src/test/testData/parser/MarkdownCompatible.txt index b1c4e6f6d..9e30c031c 100644 --- a/shirelang/src/test/testData/parser/MarkdownCompatible.txt +++ b/shirelang/src/test/testData/parser/MarkdownCompatible.txt @@ -25,7 +25,6 @@ ShireFile PsiElement(ShireTokenType.NEWLINE)('\n') PsiElement(ShireTokenType.CODE_CONTENT)('onStreamingEnd: { parseCode | patch($codepath, $output) }') PsiElement(ShireTokenType.NEWLINE)('\n') - PsiErrorElement:, ShireTokenType.#, ShireTokenType.CODE_BLOCK_END, ShireTokenType.CODE_BLOCK_START, ShireTokenType.CODE_CONTENT, ShireTokenType.COMMENTS, ShireTokenType.NEWLINE or ShireTokenType.TEXT_SEGMENT expected, got '---' - PsiElement(ShireTokenType.FRONTMATTER_START)('---') - PsiElement(ShireTokenType.NEWLINE)('\n') - PsiElement(ShireTokenType.CODE_BLOCK_END)('```') \ No newline at end of file + PsiElement(ShireTokenType.CODE_CONTENT)('---') + PsiElement(ShireTokenType.NEWLINE)('\n') + PsiElement(ShireTokenType.CODE_BLOCK_END)('```') \ No newline at end of file