/// <summary> /// Checks if the reference dictionary contains a reference with the given label and returns it, /// otherwise returns <see langword="null"/>. /// Returns <see cref="Reference.InvalidReference"/> if the reference label is not valid. /// </summary> private static Reference LookupReference(DocumentData data, StringPart lab) { if (data?.ReferenceMap == null) return null; if (lab.Length > Reference.MaximumReferenceLabelLength) return Reference.InvalidReference; string label = NormalizeReference(lab); Reference r; if (data.ReferenceMap.TryGetValue(label, out r)) return r; return null; }
/// <summary> /// Walk through the block, its children and siblings, parsing string content into inline content where appropriate. /// </summary> /// <param name="block">The document level block from which to start the processing.</param> /// <param name="data">Document data.</param> /// <param name="settings">The settings that influence how the inline parsing is performed.</param> public static void ProcessInlines(Block block, DocumentData data, CommonMarkSettings settings) { Stack<Inline> inlineStack = null; var stack = new Stack<Block>(); var parsers = settings.InlineParsers; var specialCharacters = settings.InlineParserSpecialCharacters; var subj = new Subject(data); StringContent sc; int delta; while (block != null) { var tag = block.Tag; if (tag == BlockTag.Paragraph || tag == BlockTag.AtxHeading || tag == BlockTag.SetextHeading) { sc = block.StringContent; if (sc != null) { sc.FillSubject(subj); delta = subj.Position; block.InlineContent = InlineMethods.parse_inlines(subj, parsers, specialCharacters); block.StringContent = null; if (sc.PositionTracker != null) { sc.PositionTracker.AddBlockOffset(-delta); AdjustInlineSourcePosition(block.InlineContent, sc.PositionTracker, ref inlineStack); } } } if (block.FirstChild != null) { if (block.NextSibling != null) stack.Push(block.NextSibling); block = block.FirstChild; } else if (block.NextSibling != null) { block = block.NextSibling; } else if (stack.Count > 0) { block = stack.Pop(); } else { block = null; } } }
/// <summary> /// Initializes a new instance of the <see cref="Subject"/> class. /// </summary> /// <param name="buffer">String buffer.</param> /// <param name="documentData">Document data.</param> public Subject(string buffer, DocumentData documentData) { this.Buffer = buffer; this.Length = buffer.Length; this.DocumentData = documentData; }
/// <summary> /// Initializes a new instance of the <see cref="Subject"/> class. /// </summary> /// <param name="documentData">Document data.</param> public Subject(DocumentData documentData) { this.DocumentData = documentData; }