private static bool HandleExternalLinkUrlTokenInText( ParsingContext context, WikiTextToken token, ref TextParsingMode parsingMode, ref Uri externalLinkUrl) { if (parsingMode != TextParsingMode.ExternalLinkUrl) { context.ReportError("Token {0} is not allowed here".Fmt(token.Text)); return(false); } string uriString = token.Text.Trim(); try { externalLinkUrl = new Uri(uriString); } catch (UriFormatException ex) { context.ReportError("Invalid external link URL '{0}': {1}".Fmt(uriString, ex.Message)); return(false); } parsingMode = TextParsingMode.ExternalLinkDescription; return(true); }
private static bool HandleDoubleSquareBracketsCloseTokenInText( DocumentDefBuilder docBuilder, ParsingContext context, ref TextParsingMode parsingMode, WikiTextToken token, InternalLinkIdBuilder linkIdBuilder, StringBuilder internalLinkDescription) { Contract.Requires(docBuilder != null); Contract.Requires(context != null); Contract.Requires(token != null); Contract.Requires(linkIdBuilder != null); if (parsingMode != TextParsingMode.InternalLinkPageName && parsingMode != TextParsingMode.InternalLinkDescription) { context.ReportError("Token {0} is not allowed here".Fmt(token.Text)); return(false); } parsingMode = TextParsingMode.RegularText; bool result = AddInternalLink(docBuilder, context, linkIdBuilder, internalLinkDescription); linkIdBuilder.Clear(); if (internalLinkDescription != null) { internalLinkDescription.Clear(); } return(result); }
private static bool HandleExternalLinkUrlLeadingSpaceTokenInText( ParsingContext context, WikiTextToken token, TextParsingMode parsingMode) { if (parsingMode != TextParsingMode.ExternalLinkUrl) { context.ReportError("Token {0} is not allowed here".Fmt(token.Text)); return(false); } return(true); }
private static bool HandleSingleSquareBracketsOpenTokenInText( ParsingContext context, WikiTextToken token, ref TextParsingMode parsingMode) { Contract.Requires(context != null); Contract.Requires(token != null); if (parsingMode != TextParsingMode.RegularText) { context.ReportError("Token {0} is not allowed here".Fmt(token.Text)); return(false); } parsingMode = TextParsingMode.ExternalLinkUrl; return(true); }
private static bool HandleNamespaceSeparatorTokenInText( ParsingContext context, TextParsingMode parsingMode, InternalLinkIdBuilder linkIdBuilder, WikiTextToken token) { Contract.Requires(context != null); Contract.Requires(linkIdBuilder != null); Contract.Requires(token != null); if (parsingMode != TextParsingMode.InternalLinkPageName) { context.ReportError("Token {0} is not allowed here".Fmt(token.Text)); return(false); } linkIdBuilder.AddSeparator(); return(true); }
private static bool HandleSingleSquareBracketsCloseTokenInText( DocumentDefBuilder docBuilder, ParsingContext context, ref TextParsingMode parsingMode, WikiTextToken token, Uri externalLinkUrl, StringBuilder textBuilder) { if (parsingMode != TextParsingMode.ExternalLinkUrl && parsingMode != TextParsingMode.ExternalLinkDescription) { context.ReportError("Token {0} is not allowed here".Fmt(token.Text)); return(false); } parsingMode = TextParsingMode.RegularText; return(AddExternalLink(docBuilder, externalLinkUrl, textBuilder)); }
private static bool HandleTextTokenInText( DocumentDefBuilder docBuilder, TextParsingMode parsingMode, WikiTextToken token, bool isFirstElementOfContinuedLine, InternalLinkIdBuilder linkIdBuilder, ref StringBuilder textBuilder) { Contract.Requires(docBuilder != null); Contract.Requires(token != null); Contract.Requires(linkIdBuilder != null); switch (parsingMode) { case TextParsingMode.RegularText: docBuilder.AddTextToParagraph(token.Text, isFirstElementOfContinuedLine); return(true); case TextParsingMode.InternalLinkPageName: linkIdBuilder.AppendText(token.Text); return(true); case TextParsingMode.InternalLinkDescription: if (textBuilder == null) { textBuilder = new StringBuilder(); } textBuilder.Append(token.Text); return(true); case TextParsingMode.ExternalLinkDescription: if (textBuilder == null) { textBuilder = new StringBuilder(); } textBuilder.Append(token.Text); return(true); default: throw new NotImplementedException("todo next:"); } }
private static bool HandlePipeTokenInText(ParsingContext context, WikiTextToken token, ref TextParsingMode parsingMode) { Contract.Requires(context != null); Contract.Requires(token != null); if (parsingMode != TextParsingMode.InternalLinkPageName) { context.ReportError("Token {0} is not allowed here".Fmt(token.Text)); return(false); } parsingMode = TextParsingMode.InternalLinkDescription; return(true); }
private static void HandleText( DocumentDefBuilder docBuilder, ParsingContext context, TokenBuffer tokenBuffer) { Contract.Requires(docBuilder != null); Contract.Requires(context != null); Contract.Requires(tokenBuffer != null); TextParsingMode parsingMode = TextParsingMode.RegularText; InternalLinkIdBuilder internalLinkBuilder = new InternalLinkIdBuilder(); StringBuilder textBuilder = null; Uri externalLinkUrl = null; bool isFirstTextElementOfContinuedLine = true; bool processingSuccessful = tokenBuffer.ProcessUntilEnd( t => { bool flagCopy = isFirstTextElementOfContinuedLine; switch (t.Type) { case WikiTextToken.TokenType.BulletList: return(HandleBulletListTokenInText(docBuilder, t)); case WikiTextToken.TokenType.NumberedList: return(HandleNumberedListTokenInText(docBuilder, t)); case WikiTextToken.TokenType.Indent: return(HandleIndentTokenInText(docBuilder, t)); case WikiTextToken.TokenType.Text: { isFirstTextElementOfContinuedLine = false; return(HandleTextTokenInText( docBuilder, parsingMode, t, flagCopy, internalLinkBuilder, ref textBuilder)); } case WikiTextToken.TokenType.TripleApostrophe: return(HandleTripleApostropheTokenInText(docBuilder)); case WikiTextToken.TokenType.DoubleApostrophe: return(HandleDoubleApostropheTokenInText(docBuilder)); case WikiTextToken.TokenType.DoubleSquareBracketsOpen: return(HandleDoubleSquareBracketsOpenTokenInText(context, t, ref parsingMode)); case WikiTextToken.TokenType.NamespaceSeparator: return(HandleNamespaceSeparatorTokenInText(context, parsingMode, internalLinkBuilder, t)); case WikiTextToken.TokenType.Pipe: return(HandlePipeTokenInText(context, t, ref parsingMode)); case WikiTextToken.TokenType.DoubleSquareBracketsClose: return(HandleDoubleSquareBracketsCloseTokenInText( docBuilder, context, ref parsingMode, t, internalLinkBuilder, textBuilder)); case WikiTextToken.TokenType.SingleSquareBracketsOpen: return(HandleSingleSquareBracketsOpenTokenInText(context, t, ref parsingMode)); case WikiTextToken.TokenType.ExternalLinkUrlLeadingSpace: return(HandleExternalLinkUrlLeadingSpaceTokenInText(context, t, parsingMode)); case WikiTextToken.TokenType.ExternalLinkUrl: return(HandleExternalLinkUrlTokenInText(context, t, ref parsingMode, ref externalLinkUrl)); case WikiTextToken.TokenType.SingleSquareBracketsClose: return(HandleSingleSquareBracketsCloseTokenInText( docBuilder, context, ref parsingMode, t, externalLinkUrl, textBuilder)); default: throw new NotImplementedException("todo next: {0}".Fmt(t.Type)); } }); if (processingSuccessful) { switch (parsingMode) { case TextParsingMode.InternalLinkPageName: case TextParsingMode.InternalLinkDescription: context.ReportError("Missing token ']]'"); break; case TextParsingMode.ExternalLinkUrl: case TextParsingMode.ExternalLinkDescription: context.ReportError("Missing token ']'"); break; } } }