import { DEVICE_ARRAY } from './Constants'; // タイポグラフィのcssプロパティ毎にデバイス(desktop,tablet,mobile)のデータを週出する. export function extractTypographyData(source: { [key: string]: string }, properties: string[]) { return properties.reduce((result: { [key: string]: { [key in device]: string } }, property: string) => { result[property] = { desktop: '', tablet: '', mobile: '' }; // 初期化 DEVICE_ARRAY.forEach((device: device) => { const key = device === 'desktop' ? property : `${device}_${property}`; // 正しいキー名を生成 if (source.hasOwnProperty(key)) { result[property][device] = source[key]; } }); return result; }, {}); } export function parseCssValue(cssValue: string|number): { value: number | null; unit: string } { if (typeof cssValue === 'number') { cssValue = cssValue.toString(); } const match = cssValue.match(/^(-?[\d.]+)?([a-z%]+)?$/i); // const match = cssValue.match(/^([\d.]+)(px|rem|em|%)$/i); if (!match) { throw new Error(`Invalid CSS value: ${cssValue}`); } const [_, value, unit] = match; return { value: parseFloat(value), // 数値部分を解析 unit: unit || '-', // 単位部分 }; } // 共通ロジック: unitData を取得 export const getUnitData = (value: any, units: unitData[]): unitData => value?.unit ? units.find((item) => item.value === value.unit) || { value: '' } : { value: '' }; // 値とデフォルトを生成 export const createDeviceValue = ( device: device, parsedValue: any, parsedDefaults: any, sizeUnits: unitData[] ): { value: RangeControlDeviceValue; default: RangeControlDeviceValue } => { const unitData = getUnitData(parsedValue, sizeUnits); const defaultUnitData = getUnitData(parsedDefaults, sizeUnits); return { value: { device, number: parsedValue?.value, unit: unitData.value, min: unitData?.min || 0, max: unitData?.max || 100, step: unitData?.step || 1, }, default: { device, number: parsedDefaults?.value, unit: defaultUnitData.value, // デフォルトにも同じユニットを適用 min: defaultUnitData?.min || 0, max: defaultUnitData?.max || 100, step: defaultUnitData?.step || 1, }, }; }; export const parseRangeToArray = (range: string): string[] => { if (!range) return []; // 入力文字列を ".." で分割 const rangeWithoutItalic = range.indexOf('italic') !== -1 ? range.replace('italic', '') : range; const [start, end] = rangeWithoutItalic.split("..").map(Number); // 範囲のチェック if (isNaN(start) || isNaN(end) || start > end) { return [range]; // throw new Error("Invalid range format. Make sure it follows '100..900'."); } // 配列を生成 const result = []; for (let i = start; i <= end; i += 100) { result.push(`${i}`); // 数値を文字列として追加 } return result; }