Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(200)

Side by Side Diff: pkg/polymer/lib/src/build/import_inliner.dart

Issue 421503004: Switch transformers over to source_span (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Code review changes Created 6 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « pkg/polymer/lib/src/build/common.dart ('k') | pkg/polymer/lib/src/build/linter.dart » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 /// Transfomer that inlines polymer-element definitions from html imports. 5 /// Transfomer that inlines polymer-element definitions from html imports.
6 library polymer.src.build.import_inliner; 6 library polymer.src.build.import_inliner;
7 7
8 import 'dart:async'; 8 import 'dart:async';
9 import 'dart:convert'; 9 import 'dart:convert';
10 10
11 import 'package:analyzer/analyzer.dart'; 11 import 'package:analyzer/analyzer.dart';
12 import 'package:analyzer/src/generated/ast.dart'; 12 import 'package:analyzer/src/generated/ast.dart';
13 import 'package:barback/barback.dart'; 13 import 'package:barback/barback.dart';
14 import 'package:code_transformers/assets.dart'; 14 import 'package:code_transformers/assets.dart';
15 import 'package:path/path.dart' as path; 15 import 'package:path/path.dart' as path;
16 import 'package:html5lib/dom.dart' show 16 import 'package:html5lib/dom.dart' show
17 Document, DocumentFragment, Element, Node; 17 Document, DocumentFragment, Element, Node;
18 import 'package:html5lib/dom_parsing.dart' show TreeVisitor; 18 import 'package:html5lib/dom_parsing.dart' show TreeVisitor;
19 import 'package:source_maps/refactor.dart' show TextEditTransaction; 19 import 'package:source_maps/refactor.dart' show TextEditTransaction;
20 import 'package:source_maps/span.dart'; 20 import 'package:source_span/source_span.dart';
21 21
22 import 'common.dart'; 22 import 'common.dart';
23 23
24 // TODO(sigmund): move to web_components package (dartbug.com/18037). 24 // TODO(sigmund): move to web_components package (dartbug.com/18037).
25 class _HtmlInliner extends PolymerTransformer { 25 class _HtmlInliner extends PolymerTransformer {
26 final TransformOptions options; 26 final TransformOptions options;
27 final Transform transform; 27 final Transform transform;
28 final TransformLogger logger; 28 final TransformLogger logger;
29 final AssetId docId; 29 final AssetId docId;
30 final seen = new Set<AssetId>(); 30 final seen = new Set<AssetId>();
(...skipping 337 matching lines...) Expand 10 before | Expand all | Expand 10 after
368 static final _QUOTE = new RegExp('["\']', multiLine: true); 368 static final _QUOTE = new RegExp('["\']', multiLine: true);
369 static final _BINDINGS = new RegExp(r'({{)|(\[\[)'); 369 static final _BINDINGS = new RegExp(r'({{)|(\[\[)');
370 370
371 /// Visit the CSS text and replace any relative URLs so we can inline it. 371 /// Visit the CSS text and replace any relative URLs so we can inline it.
372 // Ported from: 372 // Ported from:
373 // https://github.com/Polymer/vulcanize/blob/c14f63696797cda18dc3d372b78aa3378 acc691f/lib/vulcan.js#L149 373 // https://github.com/Polymer/vulcanize/blob/c14f63696797cda18dc3d372b78aa3378 acc691f/lib/vulcan.js#L149
374 // TODO(jmesserly): use csslib here instead? Parsing with RegEx is sadness. 374 // TODO(jmesserly): use csslib here instead? Parsing with RegEx is sadness.
375 // Maybe it's reliable enough for finding URLs in CSS? I'm not sure. 375 // Maybe it's reliable enough for finding URLs in CSS? I'm not sure.
376 String visitCss(String cssText) { 376 String visitCss(String cssText) {
377 var url = spanUrlFor(sourceId, transform); 377 var url = spanUrlFor(sourceId, transform);
378 var src = new SourceFile.text(url, cssText); 378 var src = new SourceFile(cssText, url: url);
379 return cssText.replaceAllMapped(_URL, (match) { 379 return cssText.replaceAllMapped(_URL, (match) {
380 // Extract the URL, without any surrounding quotes. 380 // Extract the URL, without any surrounding quotes.
381 var span = src.span(match.start, match.end); 381 var span = src.span(match.start, match.end);
382 var href = match[1].replaceAll(_QUOTE, ''); 382 var href = match[1].replaceAll(_QUOTE, '');
383 href = _newUrl(href, span); 383 href = _newUrl(href, span);
384 return 'url($href)'; 384 return 'url($href)';
385 }); 385 });
386 } 386 }
387 387
388 String visitInlineDart(String code) { 388 String visitInlineDart(String code) {
389 var unit = parseDirectives(code, suppressErrors: true); 389 var unit = parseDirectives(code, suppressErrors: true);
390 var file = new SourceFile.text(spanUrlFor(sourceId, transform), code); 390 var file = new SourceFile(code, url: spanUrlFor(sourceId, transform));
391 var output = new TextEditTransaction(code, file); 391 var output = new TextEditTransaction(code, file);
392 var foundLibraryDirective = false; 392 var foundLibraryDirective = false;
393 for (Directive directive in unit.directives) { 393 for (Directive directive in unit.directives) {
394 if (directive is UriBasedDirective) { 394 if (directive is UriBasedDirective) {
395 var uri = directive.uri.stringValue; 395 var uri = directive.uri.stringValue;
396 var span = _getSpan(file, directive.uri); 396 var span = _getSpan(file, directive.uri);
397 397
398 var id = uriToAssetId(sourceId, uri, transform.logger, span, 398 var id = uriToAssetId(sourceId, uri, transform.logger, span,
399 errorOnAbsolute: false); 399 errorOnAbsolute: false);
400 if (id == null) continue; 400 if (id == null) continue;
(...skipping 11 matching lines...) Expand all
412 if (!foundLibraryDirective) { 412 if (!foundLibraryDirective) {
413 // Ensure all inline scripts also have a library name. 413 // Ensure all inline scripts also have a library name.
414 var libName = _libraryNameFor(sourceId, _count++); 414 var libName = _libraryNameFor(sourceId, _count++);
415 output.edit(0, 0, "library $libName;\n"); 415 output.edit(0, 0, "library $libName;\n");
416 } 416 }
417 417
418 if (!output.hasEdits) return code; 418 if (!output.hasEdits) return code;
419 419
420 // TODO(sigmund): emit source maps when barback supports it (see 420 // TODO(sigmund): emit source maps when barback supports it (see
421 // dartbug.com/12340) 421 // dartbug.com/12340)
422 return (output.commit()..build(file.url)).text; 422 return (output.commit()..build(file.url.toString())).text;
423 } 423 }
424 424
425 String _newUrl(String href, Span span) { 425 String _newUrl(String href, SourceSpan span) {
426 // Uri.parse blows up on invalid characters (like {{). Encoding the uri 426 // Uri.parse blows up on invalid characters (like {{). Encoding the uri
427 // allows it to be parsed, which does the correct thing in the general case. 427 // allows it to be parsed, which does the correct thing in the general case.
428 // This uri not used to build the new uri, so it never needs to be decoded. 428 // This uri not used to build the new uri, so it never needs to be decoded.
429 var uri = Uri.parse(Uri.encodeFull(href)); 429 var uri = Uri.parse(Uri.encodeFull(href));
430 if (uri.isAbsolute) return href; 430 if (uri.isAbsolute) return href;
431 if (!uri.scheme.isEmpty) return href; 431 if (!uri.scheme.isEmpty) return href;
432 if (!uri.host.isEmpty) return href; 432 if (!uri.host.isEmpty) return href;
433 if (uri.path.isEmpty) return href; // Implies standalone ? or # in URI. 433 if (uri.path.isEmpty) return href; // Implies standalone ? or # in URI.
434 if (path.isAbsolute(href)) return href; 434 if (path.isAbsolute(href)) return href;
435 435
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
480 /// When inlining <link rel="stylesheet"> tags copy over all attributes to the 480 /// When inlining <link rel="stylesheet"> tags copy over all attributes to the
481 /// style tag except these ones. 481 /// style tag except these ones.
482 const IGNORED_LINKED_STYLE_ATTRS = 482 const IGNORED_LINKED_STYLE_ATTRS =
483 const ['charset', 'href', 'href-lang', 'rel', 'rev']; 483 const ['charset', 'href', 'href-lang', 'rel', 'rev'];
484 484
485 /// Global RegExp objects for validating generated library names. 485 /// Global RegExp objects for validating generated library names.
486 final INVALID_LIB_CHARS_REGEX = new RegExp('[^a-z0-9_]'); 486 final INVALID_LIB_CHARS_REGEX = new RegExp('[^a-z0-9_]');
487 final NUM_REGEX = new RegExp('[0-9]'); 487 final NUM_REGEX = new RegExp('[0-9]');
488 488
489 _getSpan(SourceFile file, AstNode node) => file.span(node.offset, node.end); 489 _getSpan(SourceFile file, AstNode node) => file.span(node.offset, node.end);
OLDNEW
« no previous file with comments | « pkg/polymer/lib/src/build/common.dart ('k') | pkg/polymer/lib/src/build/linter.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698