StackGenVis: Alignment of Data, Algorithms, and Models for Stacking Ensemble Learning Using Performance Metrics
https://doi.org/10.1109/TVCG.2020.3030352
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
144 lines
4.6 KiB
144 lines
4.6 KiB
4 years ago
|
import { isArray, isNull, isPlainObject, isString, isUndefined } from './inspect';
|
||
|
import { keys } from './object';
|
||
|
import { toString } from './string';
|
||
|
var ANCHOR_TAG = 'a'; // Precompile RegExp
|
||
|
|
||
|
var commaRE = /%2C/g;
|
||
|
var encodeReserveRE = /[!'()*]/g;
|
||
|
var plusRE = /\+/g;
|
||
|
var queryStartRE = /^(\?|#|&)/; // Method to replace reserved chars
|
||
|
|
||
|
var encodeReserveReplacer = function encodeReserveReplacer(c) {
|
||
|
return '%' + c.charCodeAt(0).toString(16);
|
||
|
}; // Fixed encodeURIComponent which is more conformant to RFC3986:
|
||
|
// - escapes [!'()*]
|
||
|
// - preserve commas
|
||
|
|
||
|
|
||
|
var encode = function encode(str) {
|
||
|
return encodeURIComponent(toString(str)).replace(encodeReserveRE, encodeReserveReplacer).replace(commaRE, ',');
|
||
|
};
|
||
|
|
||
|
var decode = decodeURIComponent; // Stringifies an object of query parameters
|
||
|
// See: https://github.com/vuejs/vue-router/blob/dev/src/util/query.js
|
||
|
|
||
|
export var stringifyQueryObj = function stringifyQueryObj(obj) {
|
||
|
if (!isPlainObject(obj)) {
|
||
|
return '';
|
||
|
}
|
||
|
|
||
|
var query = keys(obj).map(function (key) {
|
||
|
var val = obj[key];
|
||
|
|
||
|
if (isUndefined(val)) {
|
||
|
return '';
|
||
|
} else if (isNull(val)) {
|
||
|
return encode(key);
|
||
|
} else if (isArray(val)) {
|
||
|
return val.reduce(function (results, val2) {
|
||
|
if (isNull(val2)) {
|
||
|
results.push(encode(key));
|
||
|
} else if (!isUndefined(val2)) {
|
||
|
// Faster than string interpolation
|
||
|
results.push(encode(key) + '=' + encode(val2));
|
||
|
}
|
||
|
|
||
|
return results;
|
||
|
}, []).join('&');
|
||
|
} // Faster than string interpolation
|
||
|
|
||
|
|
||
|
return encode(key) + '=' + encode(val);
|
||
|
})
|
||
|
/* must check for length, as we only want to filter empty strings, not things that look falsey! */
|
||
|
.filter(function (x) {
|
||
|
return x.length > 0;
|
||
|
}).join('&');
|
||
|
return query ? "?".concat(query) : '';
|
||
|
};
|
||
|
export var parseQuery = function parseQuery(query) {
|
||
|
var parsed = {};
|
||
|
query = toString(query).trim().replace(queryStartRE, '');
|
||
|
|
||
|
if (!query) {
|
||
|
return parsed;
|
||
|
}
|
||
|
|
||
|
query.split('&').forEach(function (param) {
|
||
|
var parts = param.replace(plusRE, ' ').split('=');
|
||
|
var key = decode(parts.shift());
|
||
|
var val = parts.length > 0 ? decode(parts.join('=')) : null;
|
||
|
|
||
|
if (isUndefined(parsed[key])) {
|
||
|
parsed[key] = val;
|
||
|
} else if (isArray(parsed[key])) {
|
||
|
parsed[key].push(val);
|
||
|
} else {
|
||
|
parsed[key] = [parsed[key], val];
|
||
|
}
|
||
|
});
|
||
|
return parsed;
|
||
|
};
|
||
|
export var isRouterLink = function isRouterLink(tag) {
|
||
|
return toString(tag).toLowerCase() !== ANCHOR_TAG;
|
||
|
};
|
||
|
export var computeTag = function computeTag() {
|
||
|
var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
|
||
|
to = _ref.to,
|
||
|
disabled = _ref.disabled;
|
||
|
|
||
|
var thisOrParent = arguments.length > 1 ? arguments[1] : undefined;
|
||
|
return thisOrParent.$router && to && !disabled ? thisOrParent.$nuxt ? 'nuxt-link' : 'router-link' : ANCHOR_TAG;
|
||
|
};
|
||
|
export var computeRel = function computeRel() {
|
||
|
var _ref2 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
|
||
|
target = _ref2.target,
|
||
|
rel = _ref2.rel;
|
||
|
|
||
|
if (target === '_blank' && isNull(rel)) {
|
||
|
return 'noopener';
|
||
|
}
|
||
|
|
||
|
return rel || null;
|
||
|
};
|
||
|
export var computeHref = function computeHref() {
|
||
|
var _ref3 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
|
||
|
href = _ref3.href,
|
||
|
to = _ref3.to;
|
||
|
|
||
|
var tag = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ANCHOR_TAG;
|
||
|
var fallback = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '#';
|
||
|
var toFallback = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : '/';
|
||
|
|
||
|
// We've already checked the $router in computeTag(), so isRouterLink() indicates a live router.
|
||
|
// When deferring to Vue Router's router-link, don't use the href attribute at all.
|
||
|
// We return null, and then remove href from the attributes passed to router-link
|
||
|
if (isRouterLink(tag)) {
|
||
|
return null;
|
||
|
} // Return `href` when explicitly provided
|
||
|
|
||
|
|
||
|
if (href) {
|
||
|
return href;
|
||
|
} // Reconstruct `href` when `to` used, but no router
|
||
|
|
||
|
|
||
|
if (to) {
|
||
|
// Fallback to `to` prop (if `to` is a string)
|
||
|
if (isString(to)) {
|
||
|
return to || toFallback;
|
||
|
} // Fallback to `to.path + to.query + to.hash` prop (if `to` is an object)
|
||
|
|
||
|
|
||
|
if (isPlainObject(to) && (to.path || to.query || to.hash)) {
|
||
|
var path = toString(to.path);
|
||
|
var query = stringifyQueryObj(to.query);
|
||
|
var hash = toString(to.hash);
|
||
|
hash = !hash || hash.charAt(0) === '#' ? hash : "#".concat(hash);
|
||
|
return "".concat(path).concat(query).concat(hash) || toFallback;
|
||
|
}
|
||
|
} // If nothing is provided return the fallback
|
||
|
|
||
|
|
||
|
return fallback;
|
||
|
};
|