public override BlockState TryOpen(BlockProcessor processor) { if (processor.IsCodeIndent) { return(BlockState.None); } // Sample: [!code-javascript[Main](../jquery.js?name=testsnippet#tag "title")] var slice = processor.Line; if (!ExtensionsHelper.MatchStart(ref slice, StartString, false)) { return(BlockState.None); } var codeSnippet = new CodeSnippet(this); MatchLanguage(processor, ref slice, ref codeSnippet); if (!MatchName(processor, ref slice, ref codeSnippet)) { return(BlockState.None); } if (!MatchPath(processor, ref slice, ref codeSnippet)) { return(BlockState.None); } MatchQuery(processor, ref slice, ref codeSnippet); MatchTitle(processor, ref slice, ref codeSnippet); ExtensionsHelper.SkipWhitespace(ref slice); if (slice.CurrentChar == ')') { slice.NextChar(); ExtensionsHelper.SkipWhitespace(ref slice); if (slice.CurrentChar == ']') { var codeSnippetEnd = slice.Start; slice.NextChar(); ExtensionsHelper.SkipWhitespace(ref slice); if (slice.CurrentChar == '\0') { // slice finished its task, re-use it for Raw content slice.Start = processor.Line.Start; slice.End = codeSnippetEnd; codeSnippet.Raw = slice.ToString(); codeSnippet.Column = processor.Column; codeSnippet.Line = processor.LineIndex; processor.NewBlocks.Push(codeSnippet); return(BlockState.BreakDiscard); } } } return(BlockState.None); }
private bool MatchPath(BlockProcessor processor, ref StringSlice slice, ref CodeSnippet codeSnippet) { ExtensionsHelper.SkipWhitespace(ref slice); if (slice.CurrentChar != '(') { return(false); } var c = slice.NextChar(); var bracketNeedToMatch = 0; var path = StringBuilderCache.Local(); var hasEscape = false; while (c != '\0' && (hasEscape || (c != '#' && c != '?' && c != '"' && (c != ')' || bracketNeedToMatch > 0)))) { if (c == '\\' && !hasEscape) { hasEscape = true; } else { if (c == '(' && !hasEscape) { bracketNeedToMatch++; } if (c == ')' && !hasEscape) { bracketNeedToMatch--; } path.Append(c); hasEscape = false; } c = slice.NextChar(); } codeSnippet.CodePath = path.ToString().Trim(); return(true); }