Skip to content

Commit f47fdd9

Browse files
authored
👀 Fallback to sensible defaults when reading some fig node properties (#123)
* 👀 Fallback to sensible defaults when reading some node properties * ⚔️ Avoid division by zero
1 parent 6449c86 commit f47fdd9

File tree

6 files changed

+26
-24
lines changed

6 files changed

+26
-24
lines changed

src/converter/base.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -60,8 +60,8 @@ def base_layer(fig_node: dict) -> _BaseLayer:
6060
"exportOptions": export_options(fig_node.get("exportSettings", [])),
6161
**positioning.convert(fig_node), # type: ignore
6262
"isFixedToViewport": False,
63-
"isLocked": fig_node["locked"],
64-
"isVisible": fig_node["visible"],
63+
"isLocked": fig_node.get("locked", False),
64+
"isVisible": fig_node.get("visible", True),
6565
"layerListExpandedType": LayerListStatus.COLLAPSED,
6666
"nameIsFixed": False,
6767
"resizingConstraint": resizing_constraint(fig_node),
@@ -224,8 +224,8 @@ def export_scale(fig_constraint: dict) -> _ExportScale:
224224

225225

226226
def resizing_constraint(fig_node: dict) -> int:
227-
h = HORIZONTAL_CONSTRAINT[fig_node["horizontalConstraint"]]
228-
v = VERTICAL_CONSTRAINT[fig_node["verticalConstraint"]]
227+
h = HORIZONTAL_CONSTRAINT[fig_node.get("horizontalConstraint", "MIN")]
228+
v = VERTICAL_CONSTRAINT[fig_node.get("verticalConstraint", "MIN")]
229229
return h + v
230230

231231

src/converter/group.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ def convert(fig_group):
1818
def post_process_frame(fig_group: dict, sketch_group: Group) -> Group:
1919
convert_frame_style(fig_group, sketch_group)
2020

21-
if fig_group["resizeToFit"]:
21+
if fig_group.get("resizeToFit", False):
2222
adjust_group_resizing_constraint(fig_group, sketch_group)
2323
else:
2424
# For frames converted to groups, add clipmask, resize children, etc

src/converter/shape_path.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -350,14 +350,16 @@ def get_or_create_point(
350350

351351

352352
def points_marker_types(fig_vector: dict, start_point: dict, end_point: dict) -> _Markers:
353-
start_marker_type = STROKE_CAP_TO_MARKER_TYPE[fig_vector["strokeCap"]]
354-
end_marker_type = STROKE_CAP_TO_MARKER_TYPE[fig_vector["strokeCap"]]
353+
start_marker_type = STROKE_CAP_TO_MARKER_TYPE[fig_vector.get("strokeCap", "NONE")]
354+
end_marker_type = STROKE_CAP_TO_MARKER_TYPE[fig_vector.get("strokeCap", "NONE")]
355355

356356
if ("style" in start_point) and ("strokeCap" in start_point["style"]):
357-
start_marker_type = STROKE_CAP_TO_MARKER_TYPE[start_point["style"]["strokeCap"]]
357+
start_marker_type = STROKE_CAP_TO_MARKER_TYPE[
358+
start_point["style"].get("strokeCap", "NONE")
359+
]
358360

359361
if ("style" in end_point) and ("strokeCap" in end_point["style"]):
360-
end_marker_type = STROKE_CAP_TO_MARKER_TYPE[end_point["style"]["strokeCap"]]
362+
end_marker_type = STROKE_CAP_TO_MARKER_TYPE[end_point["style"].get("strokeCap", "NONE")]
361363

362364
if STROKE_CAP_TO_MARKER_TYPE["TRIANGLE_FILLED"] in [
363365
start_marker_type,

src/converter/style.py

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ def convert(fig_node: dict) -> Style:
6464
do_objectID=utils.gen_object_id(fig_node["guid"], b"style"),
6565
borderOptions=BorderOptions(
6666
lineCapStyle=(
67-
LINE_CAP_STYLE[fig_node["strokeCap"]]
67+
LINE_CAP_STYLE[fig_node.get("strokeCap", "NONE")]
6868
if "strokeCap" in fig_node
6969
else BorderOptions.__dict__["lineCapStyle"]
7070
),
@@ -160,10 +160,10 @@ def convert_crop_image_to_mask(fig_node: dict) -> None:
160160
"guid": old["guid"] + (0, 0),
161161
"size": old["size"],
162162
"transform": old["transform"],
163-
"locked": old["locked"],
164-
"visible": old["visible"],
165-
"horizontalConstraint": old["horizontalConstraint"],
166-
"verticalConstraint": old["verticalConstraint"],
163+
"locked": old.get("locked", False),
164+
"visible": old.get("visible", True),
165+
"horizontalConstraint": old.get("horizontalConstraint", "MIN"),
166+
"verticalConstraint": old.get("verticalConstraint", "MIN"),
167167
"blendMode": old["blendMode"],
168168
"opacity": old["opacity"],
169169
"resizeToFit": True,
@@ -186,25 +186,25 @@ def cropped_image_layer(fig_node: dict, fill: dict) -> dict:
186186

187187
iw = fill["originalImageWidth"]
188188
ih = fill["originalImageHeight"]
189-
image_scale = Matrix.scale(1.0 / iw, 1.0 / ih)
189+
image_scale = Matrix.scale(1.0 / iw if iw else 1, 1.0 / ih if ih else 1)
190190
layer_scale = Matrix.scale(fig_node["size"]["x"], fig_node["size"]["y"])
191191

192192
transform = layer_scale * invmat * image_scale
193193

194194
height = transform.dot2([0, ih]).length()
195195
width = transform.dot2([iw, 0]).length()
196196

197-
normalize_scale = Matrix.scale(iw / width, ih / height)
197+
normalize_scale = Matrix.scale(iw / width if iw else 1, ih / height if ih else 1)
198198

199199
image_layer = {
200200
"type": "RECTANGLE",
201201
"name": f'{fig_node["name"]} (cropped image)',
202202
"size": {"x": width, "y": height},
203203
"transform": transform * normalize_scale,
204-
"locked": fig_node["locked"],
205-
"visible": fig_node["visible"],
206-
"horizontalConstraint": fig_node["horizontalConstraint"],
207-
"verticalConstraint": fig_node["verticalConstraint"],
204+
"locked": fig_node.get("locked", False),
205+
"visible": fig_node.get("visible", True),
206+
"horizontalConstraint": fig_node.get("horizontalConstraint", "MIN"),
207+
"verticalConstraint": fig_node.get("verticalConstraint", "MIN"),
208208
"blendMode": fig_node["blendMode"],
209209
"opacity": fig_node["opacity"],
210210
"fillPaints": [fill],

src/converter/text.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -131,15 +131,15 @@ def text_style(fig_text):
131131
name=font_name, size=fig_text["fontSize"], featureSettings=font_features(fig_text)
132132
),
133133
MSAttributedStringColorAttribute=color,
134-
textStyleVerticalAlignmentKey=AlignVertical[fig_text["textAlignVertical"]],
134+
textStyleVerticalAlignmentKey=AlignVertical[fig_text.get("textAlignVertical", "TOP")],
135135
**text_decoration(fig_text),
136136
kerning=kerning(fig_text),
137137
paragraphStyle=ParagraphStyle(
138-
alignment=AlignHorizontal[fig_text["textAlignHorizontal"]],
138+
alignment=AlignHorizontal[fig_text.get("textAlignHorizontal", "LEFT")],
139139
**line_height(fig_text),
140140
),
141141
),
142-
verticalAlignment=AlignVertical[fig_text["textAlignVertical"]],
142+
verticalAlignment=AlignVertical[fig_text.get("textAlignVertical", "TOP")],
143143
)
144144

145145
if fig_text.get("paragraphSpacing", 0) != 0:

src/converter/tree.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ def get_node_type(fig_node: dict, parent_type: str) -> str:
9595
# If a Frame is detected inside another Frame, the internal one
9696
# is considered a group
9797
if fig_node["type"] in ["FRAME", "SECTION"]:
98-
if parent_type == "CANVAS" and not fig_node["resizeToFit"]:
98+
if parent_type == "CANVAS" and not fig_node.get("resizeToFit", False):
9999
return "ARTBOARD"
100100
else:
101101
return "GROUP"

0 commit comments

Comments
 (0)