mirror of
https://github.com/penpot/penpot-exporter-figma-plugin.git
synced 2024-12-22 21:53:27 -05:00
48 lines
1.5 KiB
TypeScript
48 lines
1.5 KiB
TypeScript
import { PenpotFile } from '@ui/lib/types/penpotFile';
|
|
import { Paragraph, TextContent, TextNode, TextShape } from '@ui/lib/types/shapes/textShape';
|
|
import { parseFigmaId, typographies } from '@ui/parser';
|
|
import { symbolFills, symbolStrokes } from '@ui/parser/creators/symbols';
|
|
|
|
export const createText = (
|
|
file: PenpotFile,
|
|
{ type, figmaId, figmaRelatedId, ...shape }: TextShape
|
|
) => {
|
|
shape.id = parseFigmaId(file, figmaId);
|
|
shape.shapeRef = parseFigmaId(file, figmaRelatedId, true);
|
|
shape.content = parseContent(shape.content);
|
|
shape.strokes = symbolStrokes(shape.strokes);
|
|
|
|
file.createText(shape);
|
|
};
|
|
|
|
const parseContent = (content: TextContent | undefined): TextContent | undefined => {
|
|
if (!content) return;
|
|
|
|
content.children = content.children?.map(paragraphSet => {
|
|
paragraphSet.children = paragraphSet.children.map(paragraph => {
|
|
paragraph.children = paragraph.children.map(textNode => {
|
|
return parseTextStyle(textNode, textNode.textStyleId) as TextNode;
|
|
});
|
|
return parseTextStyle(paragraph, paragraph.textStyleId) as Paragraph;
|
|
});
|
|
return paragraphSet;
|
|
});
|
|
|
|
return content;
|
|
};
|
|
|
|
const parseTextStyle = (text: Paragraph | TextNode, textStyleId?: string): Paragraph | TextNode => {
|
|
let textStyle = text;
|
|
textStyle.fills = symbolFills(text.fillStyleId, text.fills);
|
|
|
|
const libraryStyle = textStyleId ? typographies.get(textStyleId) : undefined;
|
|
|
|
if (libraryStyle) {
|
|
textStyle = {
|
|
...libraryStyle.textStyle,
|
|
...textStyle
|
|
};
|
|
}
|
|
|
|
return textStyle;
|
|
};
|