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.

861 lines
22 KiB

/**
* jQuery asGradient v0.3.3
* https://github.com/amazingSurge/jquery-asGradient
*
* Copyright (c) amazingSurge
* Released under the LGPL-3.0 license
*/
(function (global, factory) {
if (typeof define === "function" && define.amd) {
define("AsGradient", ["exports", "jquery", "jquery-asColor"], factory);
} else if (typeof exports !== "undefined") {
factory(exports, require("jquery"), require("jquery-asColor"));
} else {
var mod = {
exports: {},
};
factory(mod.exports, global.jQuery, global.AsColor);
global.AsGradient = mod.exports;
}
})(this, function (exports, _jquery, _jqueryAsColor) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true,
});
var _jquery2 = _interopRequireDefault(_jquery);
var _jqueryAsColor2 = _interopRequireDefault(_jqueryAsColor);
function _interopRequireDefault(obj) {
return obj && obj.__esModule
? obj
: {
default: obj,
};
}
var _typeof =
typeof Symbol === "function" && typeof Symbol.iterator === "symbol"
? function (obj) {
return typeof obj;
}
: function (obj) {
return obj &&
typeof Symbol === "function" &&
obj.constructor === Symbol &&
obj !== Symbol.prototype
? "symbol"
: typeof obj;
};
function _classCallCheck(instance, Constructor) {
if (!(instance instanceof Constructor)) {
throw new TypeError("Cannot call a class as a function");
}
}
var _createClass = (function () {
function defineProperties(target, props) {
for (var i = 0; i < props.length; i++) {
var descriptor = props[i];
descriptor.enumerable = descriptor.enumerable || false;
descriptor.configurable = true;
if ("value" in descriptor) descriptor.writable = true;
Object.defineProperty(target, descriptor.key, descriptor);
}
}
return function (Constructor, protoProps, staticProps) {
if (protoProps) defineProperties(Constructor.prototype, protoProps);
if (staticProps) defineProperties(Constructor, staticProps);
return Constructor;
};
})();
var DEFAULTS = {
prefixes: ["-webkit-", "-moz-", "-ms-", "-o-"],
forceStandard: true,
angleUseKeyword: true,
emptyString: "",
degradationFormat: false,
cleanPosition: true,
color: {
format: false, // rgb, rgba, hsl, hsla, hex
hexUseName: false,
reduceAlpha: true,
shortenHex: true,
zeroAlphaAsTransparent: false,
invalidValue: {
r: 0,
g: 0,
b: 0,
a: 1,
},
},
};
/* eslint no-extend-native: "off" */
if (!String.prototype.includes) {
String.prototype.includes = function (search, start) {
"use strict";
if (typeof start !== "number") {
start = 0;
}
if (start + search.length > this.length) {
return false;
}
return this.indexOf(search, start) !== -1;
};
}
function getPrefix() {
var ua = window.navigator.userAgent;
var prefix = "";
if (/MSIE/g.test(ua)) {
prefix = "-ms-";
} else if (/Firefox/g.test(ua)) {
prefix = "-moz-";
} else if (/(WebKit)/i.test(ua)) {
prefix = "-webkit-";
} else if (/Opera/g.test(ua)) {
prefix = "-o-";
}
return prefix;
}
function flip(o) {
var flipped = {};
for (var i in o) {
if (o.hasOwnProperty(i)) {
flipped[o[i]] = i;
}
}
return flipped;
}
function reverseDirection(direction) {
var mapping = {
top: "bottom",
right: "left",
bottom: "top",
left: "right",
"right top": "left bottom",
"top right": "bottom left",
"bottom right": "top left",
"right bottom": "left top",
"left bottom": "right top",
"bottom left": "top right",
"top left": "bottom right",
"left top": "right bottom",
};
return mapping.hasOwnProperty(direction) ? mapping[direction] : direction;
}
function isDirection(n) {
var reg = /^(top|left|right|bottom)$/i;
return reg.test(n);
}
var keywordAngleMap = {
"to top": 0,
"to right": 90,
"to bottom": 180,
"to left": 270,
"to right top": 45,
"to top right": 45,
"to bottom right": 135,
"to right bottom": 135,
"to left bottom": 225,
"to bottom left": 225,
"to top left": 315,
"to left top": 315,
};
var angleKeywordMap = flip(keywordAngleMap);
var RegExpStrings = (function () {
var color =
/(?:rgba|rgb|hsla|hsl)\s*\([\s\d\.,%]+\)|#[a-z0-9]{3,6}|[a-z]+/i;
var position = /\d{1,3}%/i;
var angle = /(?:to ){0,1}(?:(?:top|left|right|bottom)\s*){1,2}|\d+deg/i;
var stop = new RegExp(
"(" + color.source + ")\\s*(" + position.source + "){0,1}",
"i"
);
var stops = new RegExp(stop.source, "gi");
var parameters = new RegExp(
"(?:(" + angle.source + ")){0,1}\\s*,{0,1}\\s*(.*?)\\s*",
"i"
);
var full = new RegExp(
"^(-webkit-|-moz-|-ms-|-o-){0,1}(linear|radial|repeating-linear)-gradient\\s*\\(\\s*(" +
parameters.source +
")\\s*\\)$",
"i"
);
return {
FULL: full,
ANGLE: angle,
COLOR: color,
POSITION: position,
STOP: stop,
STOPS: stops,
PARAMETERS: new RegExp("^" + parameters.source + "$", "i"),
};
})();
var GradientString = {
matchString: function matchString(string) {
var matched = this.parseString(string);
if (
matched &&
matched.value &&
matched.value.stops &&
matched.value.stops.length > 1
) {
return true;
}
return false;
},
parseString: function parseString(string) {
string = _jquery2.default.trim(string);
var matched = void 0;
if ((matched = RegExpStrings.FULL.exec(string)) !== null) {
var value = this.parseParameters(matched[3]);
return {
prefix: typeof matched[1] === "undefined" ? null : matched[1],
type: matched[2],
value: value,
};
} else {
return false;
}
},
parseParameters: function parseParameters(string) {
var matched = void 0;
if ((matched = RegExpStrings.PARAMETERS.exec(string)) !== null) {
var stops = this.parseStops(matched[2]);
return {
angle: typeof matched[1] === "undefined" ? 0 : matched[1],
stops: stops,
};
} else {
return false;
}
},
parseStops: function parseStops(string) {
var _this = this;
var matched = void 0;
var result = [];
if ((matched = string.match(RegExpStrings.STOPS)) !== null) {
_jquery2.default.each(matched, function (i, item) {
var stop = _this.parseStop(item);
if (stop) {
result.push(stop);
}
});
return result;
} else {
return false;
}
},
formatStops: function formatStops(stops, cleanPosition) {
var stop = void 0;
var output = [];
var positions = [];
var colors = [];
var position = void 0;
for (var i = 0; i < stops.length; i++) {
stop = stops[i];
if (typeof stop.position === "undefined" || stop.position === null) {
if (i === 0) {
position = 0;
} else if (i === stops.length - 1) {
position = 1;
} else {
position = undefined;
}
} else {
position = stop.position;
}
positions.push(position);
colors.push(stop.color.toString());
}
positions = (function (data) {
var start = null;
var average = void 0;
for (var _i = 0; _i < data.length; _i++) {
if (isNaN(data[_i])) {
if (start === null) {
start = _i;
continue;
}
} else if (start) {
average = (data[_i] - data[start - 1]) / (_i - start + 1);
for (var j = start; j < _i; j++) {
data[j] = data[start - 1] + (j - start + 1) * average;
}
start = null;
}
}
return data;
})(positions);
for (var x = 0; x < stops.length; x++) {
if (
cleanPosition &&
((x === 0 && positions[x] === 0) ||
(x === stops.length - 1 && positions[x] === 1))
) {
position = "";
} else {
position = " " + this.formatPosition(positions[x]);
}
output.push(colors[x] + position);
}
return output.join(", ");
},
parseStop: function parseStop(string) {
var matched = void 0;
if ((matched = RegExpStrings.STOP.exec(string)) !== null) {
var position = this.parsePosition(matched[2]);
return {
color: matched[1],
position: position,
};
} else {
return false;
}
},
parsePosition: function parsePosition(string) {
if (typeof string === "string" && string.substr(-1) === "%") {
string = parseFloat(string.slice(0, -1) / 100);
}
if (typeof string !== "undefined" && string !== null) {
return parseFloat(string, 10);
} else {
return null;
}
},
formatPosition: function formatPosition(value) {
return parseInt(value * 100, 10) + "%";
},
parseAngle: function parseAngle(string, notStandard) {
if (typeof string === "string" && string.includes("deg")) {
string = string.replace("deg", "");
}
if (!isNaN(string)) {
if (notStandard) {
string = this.fixOldAngle(string);
}
}
if (typeof string === "string") {
var directions = string.split(" ");
var filtered = [];
for (var i in directions) {
if (isDirection(directions[i])) {
filtered.push(directions[i].toLowerCase());
}
}
var keyword = filtered.join(" ");
if (!string.includes("to ")) {
keyword = reverseDirection(keyword);
}
keyword = "to " + keyword;
if (keywordAngleMap.hasOwnProperty(keyword)) {
string = keywordAngleMap[keyword];
}
}
var value = parseFloat(string, 10);
if (value > 360) {
value %= 360;
} else if (value < 0) {
value %= -360;
if (value !== 0) {
value += 360;
}
}
return value;
},
fixOldAngle: function fixOldAngle(value) {
value = parseFloat(value);
value = Math.abs(450 - value) % 360;
value = parseFloat(value.toFixed(3));
return value;
},
formatAngle: function formatAngle(value, notStandard, useKeyword) {
value = parseInt(value, 10);
if (useKeyword && angleKeywordMap.hasOwnProperty(value)) {
value = angleKeywordMap[value];
if (notStandard) {
value = reverseDirection(value.substr(3));
}
} else {
if (notStandard) {
value = this.fixOldAngle(value);
}
value = value + "deg";
}
return value;
},
};
var ColorStop = (function () {
function ColorStop(color, position, gradient) {
_classCallCheck(this, ColorStop);
this.color = (0, _jqueryAsColor2.default)(color, gradient.options.color);
this.position = GradientString.parsePosition(position);
this.id = ++gradient._stopIdCount;
this.gradient = gradient;
}
_createClass(ColorStop, [
{
key: "setPosition",
value: function setPosition(string) {
var position = GradientString.parsePosition(string);
if (this.position !== position) {
this.position = position;
this.gradient.reorder();
}
},
},
{
key: "setColor",
value: function setColor(string) {
this.color.fromString(string);
},
},
{
key: "remove",
value: function remove() {
this.gradient.removeById(this.id);
},
},
]);
return ColorStop;
})();
var GradientTypes = {
LINEAR: {
parse: function parse(result) {
return {
r:
result[1].substr(-1) === "%"
? parseInt(result[1].slice(0, -1) * 2.55, 10)
: parseInt(result[1], 10),
g:
result[2].substr(-1) === "%"
? parseInt(result[2].slice(0, -1) * 2.55, 10)
: parseInt(result[2], 10),
b:
result[3].substr(-1) === "%"
? parseInt(result[3].slice(0, -1) * 2.55, 10)
: parseInt(result[3], 10),
a: 1,
};
},
to: function to(gradient, instance, prefix) {
if (gradient.stops.length === 0) {
return instance.options.emptyString;
}
if (gradient.stops.length === 1) {
return gradient.stops[0].color.to(instance.options.degradationFormat);
}
var standard = instance.options.forceStandard;
var _prefix = instance._prefix;
if (!_prefix) {
standard = true;
}
if (
prefix &&
-1 !== _jquery2.default.inArray(prefix, instance.options.prefixes)
) {
standard = false;
_prefix = prefix;
}
var angle = GradientString.formatAngle(
gradient.angle,
!standard,
instance.options.angleUseKeyword
);
var stops = GradientString.formatStops(
gradient.stops,
instance.options.cleanPosition
);
var output = "linear-gradient(" + angle + ", " + stops + ")";
if (standard) {
return output;
} else {
return _prefix + output;
}
},
},
};
var AsGradient = (function () {
function AsGradient(string, options) {
_classCallCheck(this, AsGradient);
if (
(typeof string === "undefined" ? "undefined" : _typeof(string)) ===
"object" &&
typeof options === "undefined"
) {
options = string;
string = undefined;
}
this.value = {
angle: 0,
stops: [],
};
this.options = _jquery2.default.extend(true, {}, DEFAULTS, options);
this._type = "LINEAR";
this._prefix = null;
this.length = this.value.stops.length;
this.current = 0;
this._stopIdCount = 0;
this.init(string);
}
_createClass(
AsGradient,
[
{
key: "init",
value: function init(string) {
if (string) {
this.fromString(string);
}
},
},
{
key: "val",
value: function val(value) {
if (typeof value === "undefined") {
return this.toString();
} else {
this.fromString(value);
return this;
}
},
},
{
key: "angle",
value: function angle(value) {
if (typeof value === "undefined") {
return this.value.angle;
} else {
this.value.angle = GradientString.parseAngle(value);
return this;
}
},
},
{
key: "append",
value: function append(color, position) {
return this.insert(color, position, this.length);
},
},
{
key: "reorder",
value: function reorder() {
if (this.length < 2) {
return;
}
this.value.stops = this.value.stops.sort(function (a, b) {
return a.position - b.position;
});
},
},
{
key: "insert",
value: function insert(color, position, index) {
if (typeof index === "undefined") {
index = this.current;
}
var stop = new ColorStop(color, position, this);
this.value.stops.splice(index, 0, stop);
this.length = this.length + 1;
this.current = index;
return stop;
},
},
{
key: "getById",
value: function getById(id) {
if (this.length > 0) {
for (var i in this.value.stops) {
if (id === this.value.stops[i].id) {
return this.value.stops[i];
}
}
}
return false;
},
},
{
key: "removeById",
value: function removeById(id) {
var index = this.getIndexById(id);
if (index) {
this.remove(index);
}
},
},
{
key: "getIndexById",
value: function getIndexById(id) {
var index = 0;
for (var i in this.value.stops) {
if (id === this.value.stops[i].id) {
return index;
}
index++;
}
return false;
},
},
{
key: "getCurrent",
value: function getCurrent() {
return this.value.stops[this.current];
},
},
{
key: "setCurrentById",
value: function setCurrentById(id) {
var index = 0;
for (var i in this.value.stops) {
if (this.value.stops[i].id !== id) {
index++;
} else {
this.current = index;
}
}
},
},
{
key: "get",
value: function get(index) {
if (typeof index === "undefined") {
index = this.current;
}
if (index >= 0 && index < this.length) {
this.current = index;
return this.value.stops[index];
} else {
return false;
}
},
},
{
key: "remove",
value: function remove(index) {
if (typeof index === "undefined") {
index = this.current;
}
if (index >= 0 && index < this.length) {
this.value.stops.splice(index, 1);
this.length = this.length - 1;
this.current = index - 1;
}
},
},
{
key: "empty",
value: function empty() {
this.value.stops = [];
this.length = 0;
this.current = 0;
},
},
{
key: "reset",
value: function reset() {
this.value._angle = 0;
this.empty();
this._prefix = null;
this._type = "LINEAR";
},
},
{
key: "type",
value: function type(_type) {
if (
typeof _type === "string" &&
(_type = _type.toUpperCase()) &&
typeof GradientTypes[_type] !== "undefined"
) {
this._type = _type;
return this;
} else {
return this._type;
}
},
},
{
key: "fromString",
value: function fromString(string) {
var _this2 = this;
this.reset();
var result = GradientString.parseString(string);
if (result) {
this._prefix = result.prefix;
this.type(result.type);
if (result.value) {
this.value.angle = GradientString.parseAngle(
result.value.angle,
this._prefix !== null
);
_jquery2.default.each(result.value.stops, function (i, stop) {
_this2.append(stop.color, stop.position);
});
}
}
},
},
{
key: "toString",
value: function toString(prefix) {
if (prefix === true) {
prefix = getPrefix();
}
return GradientTypes[this.type()].to(this.value, this, prefix);
},
},
{
key: "matchString",
value: function matchString(string) {
return GradientString.matchString(string);
},
},
{
key: "toStringWithAngle",
value: function toStringWithAngle(angle, prefix) {
var value = _jquery2.default.extend(true, {}, this.value);
value.angle = GradientString.parseAngle(angle);
if (prefix === true) {
prefix = getPrefix();
}
return GradientTypes[this.type()].to(value, this, prefix);
},
},
{
key: "getPrefixedStrings",
value: function getPrefixedStrings() {
var strings = [];
for (var i in this.options.prefixes) {
if (Object.hasOwnProperty.call(this.options.prefixes, i)) {
strings.push(this.toString(this.options.prefixes[i]));
}
}
return strings;
},
},
],
[
{
key: "setDefaults",
value: function setDefaults(options) {
_jquery2.default.extend(
true,
DEFAULTS,
_jquery2.default.isPlainObject(options) && options
);
},
},
]
);
return AsGradient;
})();
var info = {
version: "0.3.3",
};
var OtherAsGradient = _jquery2.default.asGradient;
var jQueryAsGradient = function jQueryAsGradient() {
for (
var _len = arguments.length, args = Array(_len), _key = 0;
_key < _len;
_key++
) {
args[_key] = arguments[_key];
}
return new (Function.prototype.bind.apply(
AsGradient,
[null].concat(args)
))();
};
_jquery2.default.asGradient = jQueryAsGradient;
_jquery2.default.asGradient.Constructor = AsGradient;
_jquery2.default.extend(
_jquery2.default.asGradient,
{
setDefaults: AsGradient.setDefaults,
noConflict: function noConflict() {
_jquery2.default.asGradient = OtherAsGradient;
return jQueryAsGradient;
},
},
GradientString,
info
);
var main = _jquery2.default.asGradient;
exports.default = main;
});