private static bool ProcessHeadingAnchor(ParsingContext context, TokenBuffer tokenBuffer, out string anchorId) { Contract.Requires(context != null); Contract.Requires(tokenBuffer != null); anchorId = null; if (!tokenBuffer.EndOfTokens) { WikiTextToken token = tokenBuffer.Token; if (token.Type == WikiTextToken.TokenType.HeadingAnchor) { tokenBuffer.MoveToNextToken(); if (!FetchHeadingAnchor(context, tokenBuffer, out anchorId)) { return(false); } } else { context.ReportError("Unexpected tokens after ending heading token"); return(false); } } return(true); }
private static bool FetchHeadingAnchor(ParsingContext context, TokenBuffer tokenBuffer, out string anchorId) { Contract.Requires(context != null); Contract.Requires(tokenBuffer != null); anchorId = null; WikiTextToken token = tokenBuffer.ExpectToken(context, WikiTextToken.TokenType.Text); if (token == null) { return(false); } string potentialAnchorId = token.Text; if (!ValidateAnchor(potentialAnchorId)) { context.ReportError("Invalid heading anchor ID: '{0}'".Fmt(potentialAnchorId)); return(false); } anchorId = token.Text; tokenBuffer.MoveToNextToken(); return(true); }
private static void HandleHeadingLine(DocumentDefBuilder docBuilder, ParsingContext context, TokenBuffer tokenBuffer) { Contract.Requires(docBuilder != null); Contract.Requires(context != null); Contract.Requires(tokenBuffer != null); WikiTextToken firstToken = tokenBuffer.Token; WikiTextToken.TokenType endingTokenNeeded; int headingLevel; switch (firstToken.Type) { case WikiTextToken.TokenType.Heading1Start: headingLevel = 1; endingTokenNeeded = WikiTextToken.TokenType.Heading1End; break; case WikiTextToken.TokenType.Heading2Start: headingLevel = 2; endingTokenNeeded = WikiTextToken.TokenType.Heading2End; break; case WikiTextToken.TokenType.Heading3Start: headingLevel = 3; endingTokenNeeded = WikiTextToken.TokenType.Heading3End; break; case WikiTextToken.TokenType.Heading4Start: headingLevel = 4; endingTokenNeeded = WikiTextToken.TokenType.Heading4End; break; case WikiTextToken.TokenType.Heading5Start: headingLevel = 5; endingTokenNeeded = WikiTextToken.TokenType.Heading5End; break; case WikiTextToken.TokenType.Heading6Start: headingLevel = 6; endingTokenNeeded = WikiTextToken.TokenType.Heading6End; break; default: throw new InvalidOperationException("BUG"); } tokenBuffer.MoveToNextToken(); StringBuilder headingText = new StringBuilder(); if (!ProcessHeadingText(context, tokenBuffer, endingTokenNeeded, headingText)) { return; } HeadingElement headingEl = new HeadingElement(headingText.ToString().Trim(), headingLevel); docBuilder.AddRootChild(headingEl); tokenBuffer.MoveToNextToken(); string anchorId; if (!ProcessHeadingAnchor(context, tokenBuffer, out anchorId)) { return; } tokenBuffer.ProcessUntilEnd( t => { context.ReportError("Unexpected token at the end of heading"); return(false); }); headingEl.AnchorId = anchorId; }