| 6560 | } |
| 6561 | |
| 6562 | function extractUrlParts(url, baseUrl) { |
| 6563 | // urlParts[1] = protocol&hostname || / |
| 6564 | // urlParts[2] = / if path relative to host base |
| 6565 | // urlParts[3] = directories |
| 6566 | // urlParts[4] = filename |
| 6567 | // urlParts[5] = parameters |
| 6568 | |
| 6569 | var urlPartsRegex = /^((?:[a-z-]+:)?\/+?(?:[^\/\?#]*\/)|([\/\\]))?((?:[^\/\\\?#]*[\/\\])*)([^\/\\\?#]*)([#\?].*)?$/i, |
| 6570 | urlParts = url.match(urlPartsRegex), |
| 6571 | returner = {}, directories = [], i, baseUrlParts; |
| 6572 | |
| 6573 | if (!urlParts) { |
| 6574 | throw new Error("Could not parse sheet href - '"+url+"'"); |
| 6575 | } |
| 6576 | |
| 6577 | // Stylesheets in IE don't always return the full path |
| 6578 | if (!urlParts[1] || urlParts[2]) { |
| 6579 | baseUrlParts = baseUrl.match(urlPartsRegex); |
| 6580 | if (!baseUrlParts) { |
| 6581 | throw new Error("Could not parse page url - '"+baseUrl+"'"); |
| 6582 | } |
| 6583 | urlParts[1] = urlParts[1] || baseUrlParts[1] || ""; |
| 6584 | if (!urlParts[2]) { |
| 6585 | urlParts[3] = baseUrlParts[3] + urlParts[3]; |
| 6586 | } |
| 6587 | } |
| 6588 | |
| 6589 | if (urlParts[3]) { |
| 6590 | directories = urlParts[3].replace(/\\/g, "/").split("/"); |
| 6591 | |
| 6592 | // extract out . before .. so .. doesn't absorb a non-directory |
| 6593 | for(i = 0; i < directories.length; i++) { |
| 6594 | if (directories[i] === ".") { |
| 6595 | directories.splice(i, 1); |
| 6596 | i -= 1; |
| 6597 | } |
| 6598 | } |
| 6599 | |
| 6600 | for(i = 0; i < directories.length; i++) { |
| 6601 | if (directories[i] === ".." && i > 0) { |
| 6602 | directories.splice(i-1, 2); |
| 6603 | i -= 2; |
| 6604 | } |
| 6605 | } |
| 6606 | } |
| 6607 | |
| 6608 | returner.hostPart = urlParts[1]; |
| 6609 | returner.directories = directories; |
| 6610 | returner.path = urlParts[1] + directories.join("/"); |
| 6611 | returner.fileUrl = returner.path + (urlParts[4] || ""); |
| 6612 | returner.url = returner.fileUrl + (urlParts[5] || ""); |
| 6613 | return returner; |
| 6614 | } |
| 6615 | |
| 6616 | function pathDiff(url, baseUrl) { |
| 6617 | // diff between two paths to create a relative path |