Index: lib/build/import_crawler.dart |
diff --git a/lib/build/import_crawler.dart b/lib/build/import_crawler.dart |
index 5566efbd3da4639afb6cc5395651f22e4bbe9ebf..c655efc7aece41ee5fa0c9a46c2f402d50caa8b6 100644 |
--- a/lib/build/import_crawler.dart |
+++ b/lib/build/import_crawler.dart |
@@ -30,7 +30,12 @@ class ImportCrawler { |
final BuildLogger _logger; |
final AssetId _primaryInputId; |
- ImportCrawler(this._transform, this._primaryInputId, this._logger); |
+ // Optional parsed document for the primary id if available. |
+ final Document _primaryDocument; |
+ |
+ ImportCrawler(this._transform, this._primaryInputId, this._logger, |
+ {Document primaryDocument}) |
+ : _primaryDocument = primaryDocument; |
/// Returns a post-ordered map of [AssetId]'s to [ImportData]. The [AssetId]'s |
/// represent an asset which was discovered via an html import, and the |
@@ -40,13 +45,11 @@ class ImportCrawler { |
var documents = new LinkedHashMap<AssetId, ImportData>(); |
var seen = new Set<AssetId>(); |
- Future doCrawl(AssetId assetId, [Element import]) { |
+ Future doCrawl(AssetId assetId, [Element import, Document document]) { |
if (seen.contains(assetId)) return null; |
seen.add(assetId); |
- return _transform.readInputAsString(assetId).then((html) { |
- var document = parseHtml(html, assetId.path); |
- |
+ Future crawlImports(Document document) { |
var imports = document.querySelectorAll('link[rel="import"]'); |
var done = |
Future.forEach(imports, (i) => doCrawl(_importId(assetId, i), i)); |
@@ -55,14 +58,23 @@ class ImportCrawler { |
return done.then((_) { |
documents[assetId] = new ImportData(document, import); |
}); |
- }).catchError((error) { |
- var span; |
- if (import != null) span = import.sourceSpan; |
- _logger.error(inlineImportFail.create({'error': error}), span: span); |
- }); |
+ } |
+ |
+ if (document != null) { |
+ return crawlImports(document); |
+ } else { |
+ return _transform.readInputAsString(assetId).then((html) { |
+ return crawlImports(parseHtml(html, assetId.path)); |
+ }).catchError((error) { |
+ var span; |
+ if (import != null) span = import.sourceSpan; |
+ _logger.error(inlineImportFail.create({'error': error}), span: span); |
+ }); |
+ } |
} |
- return doCrawl(_primaryInputId).then((_) => documents); |
+ return |
+ doCrawl(_primaryInputId, null, _primaryDocument).then((_) => documents); |
} |
AssetId _importId(AssetId source, Element import) { |