1
0
Fork 0
freesewing/packages/react/components/Pattern/utils.mjs

120 lines
3.5 KiB
JavaScript
Raw Normal View History

/**
* A method to generated an ID for an object part of a FreeSewing pattern
*
* @public
* @param {object} parameters - All parameters passed as an object
* @param {object} [parameters.settings = {}] - The pattern settings
* @param {string} [parameters.stackName = false] - An optional stack name
* @param {string} [parameters.partName = false] - An optional part name
* @param {string} [parameters.pathName = false] - An optional path name
* @param {string} [parameters.pointName = false] - An optional point name
* @param {string} [parameters.snippetName = false] - An optional snippet name
* @param {string} [parameters.name = false] - An optional name
* @param {Part} parameters.part - The part to check the point against
* @returns {string}
*/
export const getId = ({
settings = {},
stackName = false,
partName = false,
pathName = false,
pointName = false,
snippetName = false,
name = false,
}) => {
let id = settings.idPrefix || ''
if (stackName) id += `${stackName}-`
if (partName) id += `${partName}-`
if (pathName) id += `${pathName}-`
if (pointName) id += `${pointName}-`
if (snippetName) id += `${snippetName}-`
if (name) id += name
return id
}
/**
* A method to extract React props from an classic object
*
* @public
* @param {object} obj - The object to extract props from
* @returns {object}
*/
export const getProps = (obj) => {
/** I can't believe it but there seems to be no method on NPM todo this */
const cssKey = (key) => {
let chunks = key.split('-')
if (chunks.length > 1) {
key = chunks.shift()
for (let s of chunks) key += s.charAt(0).toUpperCase() + s.slice(1)
}
return key
}
const convert = (css) => {
let style = {}
let rules = css.split(';')
for (let rule of rules) {
let chunks = rule.split(':')
if (chunks.length === 2) style[cssKey(chunks[0].trim())] = chunks[1].trim()
}
return style
}
let rename = {
class: 'className',
'marker-start': 'markerStart',
'marker-end': 'markerEnd',
}
let props = {}
for (let key in obj.attributes.list) {
if (key === 'style') props[key] = convert(obj.attributes.list[key].join(' '))
if (Object.keys(rename).indexOf(key) !== -1)
props[rename[key]] = obj.attributes.list[key].join(' ')
else if (key !== 'style') props[key] = obj.attributes.list[key].join(' ')
}
return props
}
/**
* A method to translate strings for a FreeSewing pattern
*
* @public
* @param {object} [settings = {}] - The pattern settings
* @param {array} list - An array with strings (or arrays of strings) to translate
* @param {object} [translations = {}] - An object holding translations
* @returns {string}
*/
export const translateStrings = (list, translations = {}) => {
let translated = ''
if (!list) return translated
for (const string of list) {
if (Array.isArray(string)) translated += translateStrings(string, translations)
else if (string) {
if (translations[string]) {
translated += `${translations[string]}`.replace(/"/g, '"') + ' '
} else translated += `${string}` + ' '
}
}
return translated
}
/**
* A method to determine whether a FreeSewing point is within the bounding box of a FreeSewing part
*
* @public
* @param {Point} point - The point to check
* @param {Part} part - The part to check the point against
* @returns {boolean}
*/
export const withinPartBounds = (point, part) =>
point.x >= part.topLeft.x &&
point.x <= part.bottomRight.x &&
point.y >= part.topLeft.y &&
point.y <= part.bottomRight.y
? true
: false