@@ -285,11 +285,14 @@ class Type1Font:
285
285
Subrs - array of byte code subroutines
286
286
OtherSubrs - bytes object encoding some PostScript code
287
287
"""
288
- __slots__ = ('parts' , 'decrypted' , 'prop' , '_pos' )
288
+ __slots__ = ('parts' , 'decrypted' , 'prop' , '_pos' , '_abbr' )
289
289
# the _pos dict contains (begin, end) indices to parts[0] + decrypted
290
290
# so that they can be replaced when transforming the font;
291
291
# but since sometimes a definition appears in both parts[0] and decrypted,
292
292
# _pos[name] is an array of such pairs
293
+ #
294
+ # _abbr maps three standard abbreviations to their particular names in
295
+ # this font (e.g. 'RD' is named '-|' in some fonts)
293
296
294
297
def __init__ (self , input ):
295
298
"""
@@ -309,6 +312,7 @@ def __init__(self, input):
309
312
self .parts = self ._split (data )
310
313
311
314
self .decrypted = self ._decrypt (self .parts [1 ], 'eexec' )
315
+ self ._abbr = {'RD' : 'RD' , 'ND' : 'ND' , 'NP' : 'NP' }
312
316
self ._parse ()
313
317
314
318
def _read (self , file ):
@@ -496,10 +500,18 @@ def _parse(self):
496
500
break
497
501
498
502
# sometimes noaccess def and readonly def are abbreviated
499
- if kw .is_name ( b 'def' , b 'ND', b'RD' , b'|-' ):
503
+ if kw .is_keyword ( 'def' , self . _abbr [ 'ND' ], self . _abbr [ 'NP' ] ):
500
504
prop [key ] = value
501
505
pos .setdefault (key , []).append ((keypos , kw .endpos ()))
502
506
507
+ # detect the standard abbreviations
508
+ if value == '{noaccess def}' :
509
+ self ._abbr ['ND' ] = key
510
+ elif value == '{noaccess put}' :
511
+ self ._abbr ['NP' ] = key
512
+ elif value == '{string currentfile exch readstring pop}' :
513
+ self ._abbr ['RD' ] = key
514
+
503
515
# Fill in the various *Name properties
504
516
if 'FontName' not in prop :
505
517
prop ['FontName' ] = (prop .get ('FullName' ) or
@@ -548,9 +560,14 @@ def _parse_subrs(self, tokens, _data):
548
560
"Second token following dup in Subrs definition must "
549
561
f"be a number, was { nbytes_token } "
550
562
)
551
- token = next (tokens ) # usually RD or |- but the font can define this to be anything
552
- binary_token = tokens .send (1 + nbytes_token .numeric_value ())
553
- array [index_token .numeric_value ()] = binary_token .value [1 :]
563
+ token = next (tokens )
564
+ if not token .is_keyword (self ._abbr ['RD' ]):
565
+ raise RuntimeError (
566
+ f"Token preceding subr must be { self ._abbr ['RD' ]} , "
567
+ f"was { token } "
568
+ )
569
+ binary_token = tokens .send (1 + nbytes_token .value ())
570
+ array [index_token .value ()] = binary_token .value ()
554
571
555
572
return array , next (tokens ).endpos ()
556
573
0 commit comments