public override BlockState TryOpen(BlockProcessor processor) { if (processor.IsCodeIndent) { return(BlockState.None); } var slice = processor.Line; if (ExtensionsHelper.IsEscaped(slice)) { return(BlockState.None); } var column = processor.Column; var sourcePosition = processor.Start; var colonCount = 0; var c = slice.CurrentChar; while (c == Colon) { c = slice.NextChar(); colonCount++; } if (colonCount < 3) { return(BlockState.None); } ExtensionsHelper.SkipSpaces(ref slice); if (!ExtensionsHelper.MatchStart(ref slice, StartString, false)) { return(BlockState.None); } processor.NewBlocks.Push(new RowBlock(this) { ColonCount = colonCount, Column = column, Span = new SourceSpan(sourcePosition, slice.End), }); return(BlockState.ContinueDiscard); }
public override BlockState TryOpen(BlockProcessor processor) { var slice = processor.Line; var column = processor.Column; var sourcePosition = processor.Start; if (processor.IsCodeIndent || ExtensionsHelper.IsEscaped(slice) || !ExtensionsHelper.MatchStart(ref slice, ":::")) { return(BlockState.None); } ExtensionsHelper.SkipSpaces(ref slice); var extensionName = "triple-colon"; ITripleColonExtensionInfo extension; IDictionary <string, string> attributes; HtmlAttributes htmlAttributes; Action <string> logError = (string message) => _context.LogError($"invalid-{extensionName}", $"Invalid {extensionName} on line {processor.LineIndex}. \"{slice.Text}\" is invalid. {message}", line: processor.LineIndex); if (!TryMatchIdentifier(ref slice, out extensionName) || !_extensions.TryGetValue(extensionName, out extension) || !extension.TryValidateAncestry(processor.CurrentContainer, logError) || !TryMatchAttributes(ref slice, out attributes, extensionName, logError) || !extension.TryProcessAttributes(attributes, out htmlAttributes, logError)) { return(BlockState.None); } var block = new TripleColonBlock(this) { Column = column, Span = new SourceSpan(sourcePosition, slice.End), Extension = extension }; if (htmlAttributes != null) { block.SetData(typeof(HtmlAttributes), htmlAttributes); } processor.NewBlocks.Push(block); return(BlockState.ContinueDiscard); }
public override BlockState TryOpen(BlockProcessor processor) { if (processor.IsCodeIndent) { return(BlockState.None); } var slice = processor.Line; if (ExtensionsHelper.IsEscaped(slice)) { return(BlockState.None); } var column = processor.Column; var sourcePosition = processor.Start; var colonCount = 0; var c = slice.CurrentChar; while (c == Colon) { c = slice.NextChar(); colonCount++; } if (colonCount < 3) { return(BlockState.None); } ExtensionsHelper.SkipSpaces(ref slice); if (!ExtensionsHelper.MatchStart(ref slice, "moniker", false)) { return(BlockState.None); } ExtensionsHelper.SkipSpaces(ref slice); if (!ExtensionsHelper.MatchStart(ref slice, "range=\"", false)) { return(BlockState.None); } var range = StringBuilderCache.Local(); c = slice.CurrentChar; while (c != '\0' && c != '"') { range.Append(c); c = slice.NextChar(); } if (c != '"') { return(BlockState.None); } c = slice.NextChar(); while (c.IsSpace()) { c = slice.NextChar(); } if (!c.IsZero()) { Logger.LogWarning($"MonikerRange have some invalid chars in the starting."); } processor.NewBlocks.Push(new MonikerRangeBlock(this) { MonikerRange = range.ToString(), ColonCount = colonCount, Column = column, Span = new SourceSpan(sourcePosition, slice.End), }); return(BlockState.ContinueDiscard); }
public override BlockState TryOpen(BlockProcessor processor) { if (processor.IsBlankLine) { return(BlockState.Continue); } var slice = processor.Line; if (ExtensionsHelper.IsEscaped(slice)) { return(BlockState.None); } var column = processor.Column; var sourcePosition = processor.Start; var colonCount = 0; ExtensionsHelper.SkipSpaces(ref slice); var columnWidth = StringBuilderCache.Local(); var c = slice.CurrentChar; while (c == Colon) { c = slice.NextChar(); colonCount++; } if (colonCount < 3) { return(BlockState.None); } ExtensionsHelper.SkipSpaces(ref slice); if (!ExtensionsHelper.MatchStart(ref slice, StartString, false)) { return(BlockState.None); } ExtensionsHelper.SkipSpaces(ref slice); if (ExtensionsHelper.MatchStart(ref slice, "span=\"", false)) { c = slice.CurrentChar; while (c != '"') { columnWidth.Append(c); c = slice.NextChar(); } if (!ExtensionsHelper.MatchStart(ref slice, "\"", false)) { return(BlockState.None); } } else { columnWidth.Append("1"); // default span is one } while (c.IsSpace()) { c = slice.NextChar(); } if (!ExtensionsHelper.MatchStart(ref slice, ":::", false)) //change { return(BlockState.None); } if (!c.IsZero()) { Logger.LogWarning($"NestedColumn have some invalid chars in the starting."); } processor.NewBlocks.Push(new NestedColumnBlock(this) { ColumnWidth = columnWidth.ToString(), ColonCount = colonCount, Column = column, Span = new SourceSpan(sourcePosition, slice.End), }); return(BlockState.ContinueDiscard); }
public override BlockState TryOpen(BlockProcessor processor) { if (processor.IsCodeIndent) { return(BlockState.None); } var slice = processor.Line; if (ExtensionsHelper.IsEscaped(slice)) { return(BlockState.None); } var column = processor.Column; var sourcePosition = processor.Start; var colonCount = 0; var c = slice.CurrentChar; while (c == Colon) { c = slice.NextChar(); colonCount++; } if (colonCount < 3) { return(BlockState.None); } ExtensionsHelper.SkipSpaces(ref slice); if (!ExtensionsHelper.MatchStart(ref slice, StartString, false)) { return(BlockState.None); } ExtensionsHelper.SkipSpaces(ref slice); if (!ExtensionsHelper.MatchStart(ref slice, "render=\"", false)) { return(BlockState.None); } var range = StringBuilderCache.Local(); c = slice.CurrentChar; while (c != '\0' && c != '"') { range.Append(c); c = slice.NextChar(); } if (c != '"') { _context.LogWarning("invalid-render-zone", "Zone render does not have ending character (\")."); return(BlockState.None); } c = slice.NextChar(); while (c.IsSpace()) { c = slice.NextChar(); } if (!c.IsZero()) { _context.LogWarning("invalid-render-zone", $"Zone render has some invalid chars in the beginning."); } // Check the blockprocessor context to see if we are already inside of a zone // container. If so, break. var containerBlock = processor.CurrentContainer; do { if (processor.CurrentContainer.GetType() == typeof(RenderZoneBlock)) { _context.LogError("invalid-render-zone", "Zone render cannot be nested."); return(BlockState.None); } containerBlock = containerBlock.Parent; } while (containerBlock != null); processor.NewBlocks.Push(new RenderZoneBlock(this) { Closed = false, ColonCount = colonCount, Column = column, Span = new SourceSpan(sourcePosition, slice.End), Target = range.ToString(), }); return(BlockState.ContinueDiscard); }