// Copyright 2020 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

import 'dart:io';

import 'package:markdown/markdown.dart';
import 'package:meta/meta.dart';

/// Holds the src and alt attributes for an image.
class ImageData {
  String src;
  String alt;
}

/// Scrapes image sources and alt text in a markdown document.
class ImageScraper {
  /// Extracts links from the given [file].
  Iterable<ImageData> scrape(String file) {
    return scrapeLines(File(file).readAsLinesSync());
  }

  /// Extracts links from the given list of [lines].
  @visibleForTesting
  Iterable<ImageData> scrapeLines(List<String> lines) {
    final List<Node> nodes = Document().parseLines(lines);
    final _Visitor visitor = _Visitor();
    for (Node node in nodes) {
      node.accept(visitor);
    }
    return visitor.images;
  }
}

class _Visitor implements NodeVisitor {
  static const String _imgAlt = 'alt';
  static const String _imgSrc = 'src';
  static const String _imgTag = 'img';

  final Set<ImageData> images = <ImageData>{};

  @override
  bool visitElementBefore(Element element) {
    if (element.tag == _imgTag && element.attributes.containsKey(_imgSrc)) {
      var img = ImageData()
        ..alt = element.attributes[_imgAlt]
        ..src = element.attributes[_imgSrc];
      images.add(img);
    }
    return true;
  }

  @override
  void visitElementAfter(Element element) {}

  @override
  void visitText(Text text) {}
}
