| OLD | NEW |
| 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 Loading... |
| 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 Loading... |
| 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 } |
| OLD | NEW |