private void CheckLink(ParseResult parseResult, Link link, string rootDirectory) { switch (link) { case AbsoluteLink _: if (_options.CheckLinks && !IsUrlAlive(link.Address)) { _logger.Warn( $"Absolute Link {link.Address} at {link.Node.LineColumnSpan} is probably broken"); } break; case RelativeLink _: string normalizedAddress = HeaderToLinkConverter.ConvertHeaderTitleToLink(link.Address, _options.InputMarkdownType); if (!parseResult.Anchors.ContainsKey(normalizedAddress)) { _logger.Error($"Relative link {link.Address} at {link.Node.LineColumnSpan} is broken"); } break; case LocalLink _: var fullPath = Path.Combine(rootDirectory, link.Address); if (!File.Exists(fullPath)) { var linkFileName = link.Node.File.Name; string suffix = linkFileName != parseResult.File.Name ? $" at {linkFileName}" : ""; _logger.Error($"Local file {fullPath} at {link.Node.LineColumnSpan}{suffix} does not exist"); } break; } }
public Parser(ProcessorOptions options, ILogger logger, TextFile file) { _options = options; _logger = logger; var builder = new MarkdownPipelineBuilder { PreciseSourceLocation = true }; builder.UseAutoLinks(); builder.UseGridTables().UsePipeTables(); _file = file; _links = new Dictionary <Node, Link>(); _linksMap = new Dictionary <Link, Link>(LinkAddressComparer.Instance); _anchors = new Dictionary <string, Anchor>(); _headerToLinkConverter = new HeaderToLinkConverter(_anchors); _markdownDocument = Markdown.Parse(_file.Data, builder.Build()); _endOfLine = GetEndOfLine(); }
public ConverterState() { NewAnchors = new Dictionary<string, Anchor>(); HeaderToLinkConverter = new HeaderToLinkConverter(NewAnchors); }