@@ -281,6 +281,8 @@ def get_instance_data(self):
281
281
# if user did not define the axis value, then
282
282
# it remains a variable axis
283
283
pass
284
+ elif ":" in axis_value :
285
+ instance_data [axistag ] = self .parse_subspace_range (axis_value , axistag )
284
286
else :
285
287
# else use the numeric value set in the editor
286
288
try :
@@ -293,6 +295,44 @@ def get_instance_data(self):
293
295
294
296
return instance_data
295
297
298
+ def parse_subspace_range (self , range_string , axistag ):
299
+ range_list = range_string .split (":" )
300
+ # expect 2 values: min and max range sub-space values
301
+ # formatted as `value1:value2`
302
+ if len (range_list ) != 2 :
303
+ raise ValueError (
304
+ f"{ range_string } is not a valid axis range. "
305
+ f"Use the format `min_value:max_value`"
306
+ )
307
+ # remove any extraneous whitespace (e.g., "100 : 200" entry)
308
+ # before attempt to cast to a float
309
+ try :
310
+ range_list [0 ] = float (range_list [0 ].strip ())
311
+ range_list [1 ] = float (range_list [1 ].strip ())
312
+ except ValueError as e :
313
+ raise ValueError (f"{ range_string } is not a valid axis value range. { e } " )
314
+ # order the values in case they were entered in reverse
315
+ # e.g., 800:400, not 400:800
316
+ sorted_range_list = sorted (range_list )
317
+ # We only support Level 3 sub-spacing due to the support
318
+ # that is available in fontTools lib. Let's check that user
319
+ # included the default axis value in the range request
320
+ self .subspace_data_validates_includes_default_value (sorted_range_list , axistag )
321
+ # all seems well, return data formatted as tuple
322
+ # this is the data format required by fonttools lib
323
+ return (sorted_range_list [0 ], sorted_range_list [1 ])
324
+
325
+ def subspace_data_validates_includes_default_value (self , range_list , axistag ):
326
+ """Validates Level 3 sub-space requirement that restricted axis range
327
+ includes the default axis value."""
328
+ default = self .get_default_axis_value (axistag )
329
+ if default < range_list [0 ] or default > range_list [1 ]:
330
+ raise ValueError (
331
+ f"{ axistag } range { range_list [0 ]} :{ range_list [1 ]} does not "
332
+ f"include the default axis value. This is currently a "
333
+ f"requirement."
334
+ )
335
+
296
336
def instance_data_validates_missing_data (self ):
297
337
# validator that returns True if there is at least one
298
338
# axis tag with a defined instance, and False if all
0 commit comments