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

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

Issue 148913003: Improve how we handle packages/ HTML imports. This resolves better any valid (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 6 years, 10 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
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 /** Common methods used by transfomers. */ 5 /** Common methods used by transfomers. */
6 library polymer.src.build.common; 6 library polymer.src.build.common;
7 7
8 import 'dart:async'; 8 import 'dart:async';
9 import 'dart:math' show min, max;
9 10
10 import 'package:barback/barback.dart'; 11 import 'package:barback/barback.dart';
11 import 'package:html5lib/dom.dart' show Document; 12 import 'package:html5lib/dom.dart' show Document;
12 import 'package:html5lib/parser.dart' show HtmlParser; 13 import 'package:html5lib/parser.dart' show HtmlParser;
13 import 'package:path/path.dart' as path; 14 import 'package:path/path.dart' as path;
14 import 'package:source_maps/span.dart' show Span; 15 import 'package:source_maps/span.dart' show Span;
15 16
16 /** 17 /**
17 * Parses an HTML file [contents] and returns a DOM-like tree. Adds emitted 18 * Parses an HTML file [contents] and returns a DOM-like tree. Adds emitted
18 * error/warning to [logger]. 19 * error/warning to [logger].
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after
120 // TODO(sigmund): delete once this is part of barback (dartbug.com/12610) 121 // TODO(sigmund): delete once this is part of barback (dartbug.com/12610)
121 AssetId resolve(AssetId source, String url, TransformLogger logger, Span span) { 122 AssetId resolve(AssetId source, String url, TransformLogger logger, Span span) {
122 if (url == null || url == '') return null; 123 if (url == null || url == '') return null;
123 var uri = Uri.parse(url); 124 var uri = Uri.parse(url);
124 var urlBuilder = path.url; 125 var urlBuilder = path.url;
125 if (uri.host != '' || uri.scheme != '' || urlBuilder.isAbsolute(url)) { 126 if (uri.host != '' || uri.scheme != '' || urlBuilder.isAbsolute(url)) {
126 logger.error('absolute paths not allowed: "$url"', span: span); 127 logger.error('absolute paths not allowed: "$url"', span: span);
127 return null; 128 return null;
128 } 129 }
129 130
130 var segments = urlBuilder.split(url);
131 var prefix = segments[0];
132 var entryFolder = !source.path.startsWith('lib/') &&
133 !source.path.startsWith('asset/');
134
135 // URLs of the form "packages/foo/bar" seen under entry folders (like web/,
136 // test/, example/, etc) are resolved as an asset in another package.
137 if (entryFolder && (prefix == 'packages' || prefix == 'assets')) {
138 return _extractOtherPackageId(0, segments, logger, span);
139 }
140
141 var targetPath = urlBuilder.normalize( 131 var targetPath = urlBuilder.normalize(
142 urlBuilder.join(urlBuilder.dirname(source.path), url)); 132 urlBuilder.join(urlBuilder.dirname(source.path), url));
133 var segments = urlBuilder.split(targetPath);
134 var sourceSegments = urlBuilder.split(source.path);
135 assert (sourceSegments.length > 0);
136 var topFolder = sourceSegments[0];
137 var entryFolder = topFolder != 'lib' && topFolder != 'asset';
143 138
144 // Relative URLs of the form "../../packages/foo/bar" in an asset under lib/ 139 // Find the first 'packages/' or 'assets/' segment:
145 // or asset/ are also resolved as an asset in another package. 140 var packagesIndex = segments.indexOf('packages');
146 segments = urlBuilder.split(targetPath); 141 var assetsIndex = segments.indexOf('assets');
147 if (!entryFolder && segments.length > 1 && segments[0] == '..' && 142 var index = (packagesIndex >= 0 && assetsIndex >= 0)
148 (segments[1] == 'packages' || segments[1] == 'assets')) { 143 ? min(packagesIndex, assetsIndex)
149 return _extractOtherPackageId(1, segments, logger, span); 144 : max(packagesIndex, assetsIndex);
145 if (index > -1) {
146 if (entryFolder) {
147 // URLs of the form "packages/foo/bar" seen under entry folders (like
148 // web/, test/, example/, etc) are resolved as an asset in another
149 // package. 'packages' can be used anywhere, there is no need to walk up
150 // where the entrypoint file was.
151 return _extractOtherPackageId(index, segments, logger, span);
152 } else if (index == 1 && segments[0] == '..') {
153 // Relative URLs of the form "../../packages/foo/bar" in an asset under
154 // lib/ or asset/ are also resolved as an asset in another package, but we
155 // check that the relative path goes all the way out where the packages
156 // folder lives (otherwise the app would not work in Dartium). Since
157 // [targetPath] has been normalized, "packages" or "assets" should be at
158 // index 1.
159 return _extractOtherPackageId(1, segments, logger, span);
160 } else {
161 var prefix = segments[index];
162 var fixedSegments = [];
163 fixedSegments.addAll(sourceSegments.map((_) => '..'));
164 fixedSegments.addAll(segments.sublist(index));
165 var fixedUrl = urlBuilder.joinAll(fixedSegments);
166 logger.error('Invalid url to reach to another package: $url. Path '
167 'reaching to other packages must first reach up all the '
168 'way to the $prefix folder. For example, try changing the url above '
169 'to: $fixedUrl', span: span);
170 return null;
171 }
150 } 172 }
151 173
152 // Otherwise, resolve as a path in the same package. 174 // Otherwise, resolve as a path in the same package.
153 return new AssetId(source.package, targetPath); 175 return new AssetId(source.package, targetPath);
154 } 176 }
155 177
156 AssetId _extractOtherPackageId(int index, List segments, 178 AssetId _extractOtherPackageId(int index, List segments,
157 TransformLogger logger, Span span) { 179 TransformLogger logger, Span span) {
158 if (index >= segments.length) return null; 180 if (index >= segments.length) return null;
159 var prefix = segments[index]; 181 var prefix = segments[index];
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
199 return builder.relative(builder.join('/', id.path), 221 return builder.relative(builder.join('/', id.path),
200 from: builder.join('/', builder.dirname(sourceId.path))); 222 from: builder.join('/', builder.dirname(sourceId.path)));
201 } 223 }
202 224
203 225
204 /** Convert system paths to asset paths (asset paths are posix style). */ 226 /** Convert system paths to asset paths (asset paths are posix style). */
205 String _systemToAssetPath(String assetPath) { 227 String _systemToAssetPath(String assetPath) {
206 if (path.Style.platform != path.Style.windows) return assetPath; 228 if (path.Style.platform != path.Style.windows) return assetPath;
207 return path.posix.joinAll(path.split(assetPath)); 229 return path.posix.joinAll(path.split(assetPath));
208 } 230 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698