2025-05-25 16:29:57 +02:00
|
|
|
/**
|
|
|
|
* 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}
|
|
|
|
*/
|
2023-06-01 18:28:22 +02:00
|
|
|
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
|
|
|
|
}
|
|
|
|
|
2025-05-25 16:29:57 +02:00
|
|
|
/**
|
|
|
|
* 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}
|
|
|
|
*/
|
2025-04-01 16:15:20 +02:00
|
|
|
export const translateStrings = (list, translations = {}) => {
|
2023-06-01 18:28:22 +02:00
|
|
|
let translated = ''
|
2025-04-01 16:15:20 +02:00
|
|
|
if (!list) return translated
|
2023-06-01 18:28:22 +02:00
|
|
|
for (const string of list) {
|
2025-04-01 16:15:20 +02:00
|
|
|
if (Array.isArray(string)) translated += translateStrings(string, translations)
|
|
|
|
else if (string) {
|
|
|
|
if (translations[string]) {
|
|
|
|
translated += `${translations[string]}`.replace(/"/g, '"') + ' '
|
2025-05-18 09:44:18 +00:00
|
|
|
} else translated += `${string}` + ' '
|
2025-04-01 16:15:20 +02:00
|
|
|
}
|
2023-06-01 18:28:22 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
return translated
|
|
|
|
}
|
2025-05-25 16:29:57 +02:00
|
|
|
|
|
|
|
/**
|
|
|
|
* 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
|