@@ -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