tangram
Version:
WebGL Maps for Vector Tiles
200 lines (173 loc) • 5.67 kB
JavaScript
import log from './log';
// Adds a base origin to relative URLs
export function addBaseURL (url, base) {
if (!url || !isRelativeURL(url)) {
return url;
}
var relative_path = (url[0] !== '/');
var base_info;
if (base) {
base_info = document.createElement('a'); // use a temporary element to parse URL
base_info.href = base;
}
else {
base_info = window.location;
}
if (relative_path) {
let path = pathForURL(base_info.href);
url = path + url;
}
else {
let origin = base_info.origin;
if (!origin) {
origin = base_info.protocol + '//' + base_info.host; // IE11 doesn't have origin property
}
url = origin + url;
}
return url;
}
export function pathForURL (url) {
if (typeof url === 'string' && url.search(/^(data|blob):/) === -1) {
let qs = url.indexOf('?');
if (qs > -1) {
url = url.substr(0, qs);
}
let hash = url.indexOf('#');
if (hash > -1) {
url = url.substr(0, hash);
}
return url.substr(0, url.lastIndexOf('/') + 1) || '';
}
return '';
}
export function extensionForURL (url) {
url = url.split('/').pop();
let last_dot = url.lastIndexOf('.');
if (last_dot > -1) {
return url.substring(last_dot + 1);
}
}
export function isLocalURL (url) {
if (typeof url !== 'string') {
return;
}
return (url.search(/^(data|blob):/) > -1);
}
export function isRelativeURL (url) {
if (typeof url !== 'string') {
return;
}
return !(url.search(/^(http|https|data|blob):/) > -1 || url.substr(0, 2) === '//');
}
// Resolves './' and '../' components from relative path, to get a "flattened" path
export function flattenRelativeURL (url) {
let dirs = (url || '').split('/');
for (let d = 1; d < dirs.length; d++) {
if (dirs[d] === '.') {
dirs.splice(d, 1);
d--;
}
else if (dirs[d] === '..') {
d = d + 0;
dirs.splice(d-1, 2);
d--;
}
}
return dirs.join('/');
}
// Add a set of query string params to a URL
// params: hash of key/value pairs of query string parameters
// returns array of: [modified URL, array of duplicate param name and values]
export function addParamsToURL (url, params) {
if (!params || Object.keys(params).length === 0) {
return [url, []];
}
var qs_index = url.indexOf('?');
var hash_index = url.indexOf('#');
// Save and trim hash
var hash = '';
if (hash_index > -1) {
hash = url.slice(hash_index);
url = url.slice(0, hash_index);
}
// Start query string
if (qs_index === -1) {
qs_index = url.length;
url += '?';
}
qs_index++; // advanced past '?'
// Build query string params
var url_params = '';
var dupes = [];
for (var p in params) {
if (getURLParameter(p, url) !== '') {
dupes.push([p, params[p]]);
continue;
}
url_params += `${p}=${params[p]}&`;
}
// Insert new query string params and restore hash
url = url.slice(0, qs_index) + url_params + url.slice(qs_index) + hash;
return [url, dupes];
}
// Polyfill (for Safari compatibility)
let _createObjectURL;
export function createObjectURL (url) {
if (_createObjectURL === undefined) {
_createObjectURL = (window.URL && window.URL.createObjectURL) || (window.webkitURL && window.webkitURL.createObjectURL);
if (typeof _createObjectURL !== 'function') {
_createObjectURL = null;
log('warn', 'window.URL.createObjectURL (or vendor prefix) not found, unable to create local blob URLs');
}
}
if (_createObjectURL) {
return _createObjectURL(url);
}
else {
return url;
}
}
let _revokeObjectURL;
export function revokeObjectURL (url) {
if (_revokeObjectURL === undefined) {
_revokeObjectURL = (window.URL && window.URL.revokeObjectURL) || (window.webkitURL && window.webkitURL.revokeObjectURL);
if (typeof _revokeObjectURL !== 'function') {
_revokeObjectURL = null;
log('warn', 'window.URL.revokeObjectURL (or vendor prefix) not found, unable to create local blob URLs');
}
}
if (_revokeObjectURL) {
return _revokeObjectURL(url);
}
else {
return url;
}
}
// Get URL that the current script was loaded from
// If currentScript is not available, loops through <script> elements searching for a list of provided paths
// e.g. findCurrentURL('tangram.debug.js', 'tangram.min.js');
export function findCurrentURL (...paths) {
// Find currently executing script
var script = document.currentScript;
if (script) {
return script.src;
}
else if (Array.isArray(paths)) {
// Fallback on looping through <script> elements if document.currentScript is not supported
var scripts = document.getElementsByTagName('script');
for (var s=0; s < scripts.length; s++) {
for (let p=0; p < paths.length; p++) {
if (scripts[s].src.indexOf(paths[p]) > -1) {
return scripts[s].src;
}
}
}
}
}
// Via https://davidwalsh.name/query-string-javascript
function getURLParameter (name, url) {
name = name.replace(/[[]/, '\\[').replace(/[\]]/, '\\]');
var regex = new RegExp('[\\?&]' + name + '=([^&#]*)');
var results = regex.exec(url);
return results === null ? '' : decodeURIComponent(results[1].replace(/\+/g, ' '));
}