You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
54 lines
1.0 KiB
JavaScript
54 lines
1.0 KiB
JavaScript
'use strict';
|
|
|
|
const defaultValue = require("default-value");
|
|
|
|
const validateSync = require("./validate-sync");
|
|
|
|
let originAliases = {
|
|
top: 0,
|
|
left: 0,
|
|
center: "50%",
|
|
bottom: "100%",
|
|
right: "100%"
|
|
}
|
|
|
|
function tryAlias(value) {
|
|
if (originAliases[value] != null) {
|
|
return originAliases[value];
|
|
} else {
|
|
return value;
|
|
}
|
|
}
|
|
|
|
function calculateOffset(value, origin) {
|
|
if (typeof origin === "number") {
|
|
return -origin;
|
|
} else {
|
|
let match = /^(-?[0-9]+(?:\.[0-9]+)?)%$/.exec(origin);
|
|
|
|
if (match == null) {
|
|
throw new Error(`Encountered invalid origin value: ${origin}`);
|
|
} else {
|
|
let percentage = match[1];
|
|
return -(value * (parseFloat(percentage) / 100));
|
|
}
|
|
}
|
|
}
|
|
|
|
module.exports = function calculateOriginOffsets(options) {
|
|
validateSync(options, {
|
|
width: "required",
|
|
height: "required",
|
|
originX: "required",
|
|
originY: "required"
|
|
});
|
|
|
|
let originX = tryAlias(options.originX);
|
|
let originY = tryAlias(options.originY);
|
|
|
|
return {
|
|
x: calculateOffset(options.width, originX),
|
|
y: calculateOffset(options.height, originY)
|
|
}
|
|
}
|