anchor.diff:    ///
     /// This is extracted to save memory during the check; be careful not to hang
     /// on to anything referencing the full file and doc tree.
  -  Tuple2<Iterable<String>, String?>? _getStringLinksAndHref(String fullPath) {
  +  _PageLinks? _getLinksAndBaseHref(String fullPath) {
       final file = _config.resourceProvider.getFile(fullPath);
       if (!file.exists) {
         return null;
  
positive.code:   void _collectLinks(String pathToCheck, [String? source, String? fullPath]) {
      fullPath ??= p.join(_origin, pathToCheck);
  
      final stringLinksAndHref = _getStringLinksAndHref(fullPath);
      if (stringLinksAndHref == null) {
        _warn(PackageWarning.brokenLink, pathToCheck, _origin,
            referredFrom: source);
        _onCheckProgress.add(pathToCheck);
  
negative.code:     final stringLinks = links
          .map((link) => link.attributes['href'])
          .whereType<String>()
          .where((href) =>
              href.isNotEmpty &&
              !href.startsWith('https:') &&
              !href.startsWith('http:') &&
              !href.startsWith('mailto:') &&
              !href.startsWith('ftp:'))
          .toSet();
  
      return _PageLinks(stringLinks, baseHref);
    }
  
    /// Warns on erroneous file paths.
  