Skip to content

Commit

Permalink
v0.4.13
Browse files Browse the repository at this point in the history
  • Loading branch information
daengdaengLee committed Sep 23, 2020
2 parents bf1b328 + 4906cce commit 327e61e
Show file tree
Hide file tree
Showing 12 changed files with 653 additions and 470 deletions.
5 changes: 0 additions & 5 deletions doc/API.md
Original file line number Diff line number Diff line change
Expand Up @@ -239,11 +239,6 @@
- [source](../src/mergeTranslateTransform/mergeTranslateTransform.index.js)
- [detail](../src/mergeTranslateTransform/README.md)

## \$\$isValidPathData

- [source](../src/parsePathData/parsePathData.index.js)
- [detail](../src/parsePathData/parsePathData.spec.js)

## \$\$splitPathDataByCommandL

- [source](../src/parsePathData/parsePathData.index.js)
Expand Down
8 changes: 0 additions & 8 deletions doc/API_KR.md
Original file line number Diff line number Diff line change
Expand Up @@ -357,14 +357,6 @@ svg 엘리먼트에 가장 마지막으로 적용된 `SVGTransform` 이 `SVGTran
해당 `SVGTransform` 을 svg 엘리먼트의 `x`, `y` 속성 (혹은 그에 준하는 속성) 에 반영합니다.
svg 엘리먼트에 다른 `SVGTransform` 이 있는 경우 각 `SVGTransform` 을 업데이트합니다.

## \$\$isValidPathData

- [source](../src/parsePathData/parsePathData.index.js)
- [detail](../src/parsePathData/parsePathData.spec.js)

유효한 path data 문자열인지 여부를 판단합니다.
SVG 스펙과는 다르게 FxSVG 에서는 좌표 사이에 "COMMA_OR_WHITESPACE" 구분자가 필수입니다.

## \$\$splitPathDataByCommandL

- [source](../src/parsePathData/parsePathData.index.js)
Expand Down
2 changes: 1 addition & 1 deletion package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "fxsvg",
"version": "0.4.12",
"version": "0.4.13",
"description": "Functional SVG Handling Library",
"type": "module",
"main": "./src/index.js",
Expand Down
8 changes: 6 additions & 2 deletions src/fxsvg.js
Original file line number Diff line number Diff line change
@@ -1,8 +1,11 @@
import {
$append,
$appendTo,
$before,
$closest,
$contains,
$hide,
$insertBefore,
$off,
$on,
$qs,
Expand Down Expand Up @@ -64,7 +67,6 @@ import { $$mergeScaleTransform } from "./mergeScaleTransform/mergeScaleTransform
import { $$mergeScaleTransform2 } from "./mergeScaleTransform2/mergeScaleTransform2.index.js";
import { $$mergeTranslateTransform } from "./mergeTranslateTransform/mergeTranslateTransform.index.js";
import {
$$isValidPathData,
$$splitPathDataByCommandL,
$$parsePathCommandParameters,
$$convertPathCommandParametersRelativeToAbsoluteL,
Expand All @@ -82,8 +84,11 @@ import { $$updateTranslateTransform } from "./updateTranslateTransform/updateTra
export const FxSVG = {
append: $append,
appendTo: $appendTo,
before: $before,
closest: $closest,
contains: $contains,
hide: $hide,
insertBefore: $insertBefore,
off: $off,
on: $on,
qs: $qs,
Expand Down Expand Up @@ -142,7 +147,6 @@ export const FxSVG = {
mergeScaleTransform: $$mergeScaleTransform,
mergeScaleTransform2: $$mergeScaleTransform2,
mergeTranslateTransform: $$mergeTranslateTransform,
isValidPathData: $$isValidPathData,
splitPathDataByCommandL: $$splitPathDataByCommandL,
parsePathCommandParameters: $$parsePathCommandParameters,
convertPathCommandParametersRelativeToAbsoluteL: $$convertPathCommandParametersRelativeToAbsoluteL,
Expand Down
4 changes: 3 additions & 1 deletion src/index.js
Original file line number Diff line number Diff line change
@@ -1,8 +1,11 @@
export {
$append as $$append,
$appendTo as $$appendTo,
$before as $$before,
$closest as $$closest,
$contains as $$contains,
$hide as $$hide,
$insertBefore as $$insertBefore,
$off as $$off,
$on as $$on,
$qs as $$qs,
Expand Down Expand Up @@ -64,7 +67,6 @@ export { $$mergeScaleTransform } from "./mergeScaleTransform/mergeScaleTransform
export { $$mergeScaleTransform2 } from "./mergeScaleTransform2/mergeScaleTransform2.index.js";
export { $$mergeTranslateTransform } from "./mergeTranslateTransform/mergeTranslateTransform.index.js";
export {
$$isValidPathData,
$$splitPathDataByCommandL,
$$parsePathCommandParameters,
$$convertPathCommandParametersRelativeToAbsoluteL,
Expand Down
251 changes: 202 additions & 49 deletions src/joinPathData/joinPathData.index.js
Original file line number Diff line number Diff line change
@@ -1,32 +1,17 @@
import { deepFlatL, join, mapL, isArray } from "fxjs2";
import { InvalidArgumentsError } from "../Errors/InvalidArgumentsError.js";
import {
REGEXP_STR_DRAW_TO_COMMAND,
REGEXP_STR_SVG_PATH,
} from "../parsePathData/const.js";

const VALID_COMMAND_SET = new Set([
"M",
"m",
"L",
"l",
"H",
"h",
"V",
"v",
"C",
"c",
"S",
"s",
"Q",
"q",
"T",
"t",
"A",
"a",
"Z",
"z",
]);
join,
mapL,
isArray,
equals2,
go,
eachL,
not,
tap,
every,
toIter,
flatL,
} from "fxjs2";
import { InvalidArgumentsError } from "../Errors/InvalidArgumentsError.js";

/**
* @typedef {string} Command
Expand All @@ -43,45 +28,213 @@ const FN_PATH_TO_STRING_PATH_COMMAND_PARAMETERS = `$$toStringPathCommandParamete
*
* @param {Object} path_command_parameters
* @param {Command} path_command_parameters.command
* @param {Parameter|Array<Parameter>} path_command_parameters.parameters
* @param {Parameter} path_command_parameters.parameters
* @returns {string} SVG path + parameters path data string
* @throws {InvalidArgumentsError}
*/
export const $$toStringPathCommandParameters = ({ command, parameters }) => {
if (!VALID_COMMAND_SET.has(command)) {
throw new InvalidArgumentsError(
FN_PATH_TO_STRING_PATH_COMMAND_PARAMETERS,
"command"
if (
equals2(command.toLowerCase(), "m") ||
equals2(command.toLowerCase(), "l") ||
equals2(command.toLowerCase(), "t")
) {
return go(
parameters,
tap((l) => {
if (!isArray(l) || not(equals2(l.length, 2))) {
throw new InvalidArgumentsError(
FN_PATH_TO_STRING_PATH_COMMAND_PARAMETERS,
`"parameters"`,
JSON.stringify({ command, parameters })
);
}
}),
eachL((a) => {
if (!Number.isFinite(a)) {
throw new InvalidArgumentsError(
FN_PATH_TO_STRING_PATH_COMMAND_PARAMETERS,
`"parameters"`,
JSON.stringify({ command, parameters })
);
}
}),
join(" "),
(s) => `${command} ${s}`
);
}

if (
equals2(command.toLowerCase(), "h") ||
equals2(command.toLowerCase(), "v")
) {
if (!Number.isFinite(parameters)) {
throw new InvalidArgumentsError(
FN_PATH_TO_STRING_PATH_COMMAND_PARAMETERS,
`"parameters"`,
JSON.stringify({ command, parameters })
);
}
return `${command} ${parameters}`;
}

if (equals2(command.toLowerCase(), "c")) {
return go(
parameters,
tap((l) => {
if (!isArray(l) || not(equals2(l.length, 3))) {
throw new InvalidArgumentsError(
FN_PATH_TO_STRING_PATH_COMMAND_PARAMETERS,
`"parameters"`,
JSON.stringify({ command, parameters })
);
}
}),
eachL((pair) => {
if (!isArray(pair) || not(equals2(pair.length, 2))) {
throw new InvalidArgumentsError(
FN_PATH_TO_STRING_PATH_COMMAND_PARAMETERS,
`"parameters"`,
JSON.stringify({ command, parameters })
);
}
}),
flatL,
eachL((a) => {
if (!Number.isFinite(a)) {
throw new InvalidArgumentsError(
FN_PATH_TO_STRING_PATH_COMMAND_PARAMETERS,
`"parameters"`,
JSON.stringify({ command, parameters })
);
}
}),
join(" "),
(s) => `${command} ${s}`
);
}

const str = `${command} ${
isArray(parameters) ? join(" ", deepFlatL(parameters)) || "" : parameters
}`.trim();
if (!new RegExp(`^${REGEXP_STR_DRAW_TO_COMMAND}$`).test(str)) {
throw new InvalidArgumentsError(
FN_PATH_TO_STRING_PATH_COMMAND_PARAMETERS,
`"parameters"`
if (
equals2(command.toLowerCase(), "s") ||
equals2(command.toLowerCase(), "q")
) {
return go(
parameters,
tap((l) => {
if (!isArray(l) || not(equals2(l.length, 2))) {
throw new InvalidArgumentsError(
FN_PATH_TO_STRING_PATH_COMMAND_PARAMETERS,
`"parameters"`,
JSON.stringify({ command, parameters })
);
}
}),
eachL((pair) => {
if (!isArray(pair) || not(equals2(pair.length, 2))) {
throw new InvalidArgumentsError(
FN_PATH_TO_STRING_PATH_COMMAND_PARAMETERS,
`"parameters"`,
JSON.stringify({ command, parameters })
);
}
}),
flatL,
eachL((a) => {
if (!Number.isFinite(a)) {
throw new InvalidArgumentsError(
FN_PATH_TO_STRING_PATH_COMMAND_PARAMETERS,
`"parameters"`,
JSON.stringify({ command, parameters })
);
}
}),
join(" "),
(s) => `${command} ${s}`
);
}

return str;
if (equals2(command.toLowerCase(), "a")) {
if (!isArray(parameters) || not(equals2(parameters.length, 7))) {
throw new InvalidArgumentsError(
FN_PATH_TO_STRING_PATH_COMMAND_PARAMETERS,
`"parameters"`,
JSON.stringify({ command, parameters })
);
}
const [
rx,
ry,
x_axis_rotation,
large_arc_flag,
sweep_flag,
x,
y,
] = parameters;
if (
not(every(Number.isFinite, [rx, ry, x_axis_rotation, x, y])) ||
not(
every((flag) => equals2(0, flag) || equals2(1, flag), [
large_arc_flag,
sweep_flag,
])
)
) {
throw new InvalidArgumentsError(
FN_PATH_TO_STRING_PATH_COMMAND_PARAMETERS,
`"parameters"`,
JSON.stringify({ command, parameters })
);
}
return `${command} ${rx} ${ry} ${x_axis_rotation} ${large_arc_flag} ${sweep_flag} ${x} ${y}`;
}

if (equals2(command.toLowerCase(), "z")) {
if (!isArray(parameters) || parameters.length > 0) {
throw new InvalidArgumentsError(
FN_PATH_TO_STRING_PATH_COMMAND_PARAMETERS,
`"parameters"`,
JSON.stringify({ command, parameters })
);
}
return command;
}

throw new InvalidArgumentsError(
FN_PATH_TO_STRING_PATH_COMMAND_PARAMETERS,
`"command"`,
JSON.stringify({ command, parameters })
);
};

const FN_PATH_JOIN_PATH_DATA = `$$joinPathData`;
/**
* Make SVG path data string of the input list of command + parameters object.
* The return string is for "d" attributes of a SVG element.
*
* @param {Array<{command: Command, parameters: Parameter|Array<Parameter>}>} path_data
* @param {Array<{command: Command, parameters: Parameter}>} path_data
* @returns {string}
* @throws {InvalidArgumentsError}
*/
export const $$joinPathData = (path_data = []) => {
const str = join(" ", mapL($$toStringPathCommandParameters, path_data));
if (!new RegExp(REGEXP_STR_SVG_PATH).test(str)) {
throw new InvalidArgumentsError(FN_PATH_JOIN_PATH_DATA, `"path_data"`);
}
export const $$joinPathData = (path_data = []) =>
go(
path_data,
toIter,
function* (iter) {
const { value, done } = iter.next();
if (done) {
return;
}

return str;
};
if (not(equals2(value.command.toLowerCase(), "m"))) {
throw new InvalidArgumentsError(
FN_PATH_JOIN_PATH_DATA,
`"path_data"`,
`The first command is not one of "M" and "m".`
);
}

yield value;
yield* iter;
},
mapL($$toStringPathCommandParameters),
join(" ")
);
Loading

0 comments on commit 327e61e

Please sign in to comment.