2016-11-08 19:01:11 +00:00
|
|
|
|
2009-12-19 14:17:00 +00:00
|
|
|
import re
|
2014-06-26 09:12:39 +00:00
|
|
|
from .psparser import PSLiteral
|
|
|
|
from .glyphlist import glyphname2unicode
|
|
|
|
from .latin_enc import ENCODING
|
2009-12-19 14:17:00 +00:00
|
|
|
|
2014-09-03 13:26:08 +00:00
|
|
|
import six # Python 2+3 compatibility
|
2009-12-19 14:17:00 +00:00
|
|
|
|
2013-11-07 08:35:04 +00:00
|
|
|
STRIP_NAME = re.compile(r'[0-9]+')
|
|
|
|
|
|
|
|
|
2009-12-19 14:17:00 +00:00
|
|
|
## name2unicode
|
|
|
|
##
|
|
|
|
def name2unicode(name):
|
|
|
|
"""Converts Adobe glyph names to Unicode numbers."""
|
2010-08-26 15:02:46 +00:00
|
|
|
if name in glyphname2unicode:
|
|
|
|
return glyphname2unicode[name]
|
2009-12-19 14:17:00 +00:00
|
|
|
m = STRIP_NAME.search(name)
|
2013-11-07 08:35:04 +00:00
|
|
|
if not m:
|
|
|
|
raise KeyError(name)
|
2014-09-03 13:26:08 +00:00
|
|
|
return six.unichr(int(m.group(0)))
|
2009-12-19 14:17:00 +00:00
|
|
|
|
|
|
|
|
|
|
|
## EncodingDB
|
|
|
|
##
|
|
|
|
class EncodingDB(object):
|
|
|
|
|
|
|
|
std2unicode = {}
|
|
|
|
mac2unicode = {}
|
|
|
|
win2unicode = {}
|
|
|
|
pdf2unicode = {}
|
2013-11-07 08:35:04 +00:00
|
|
|
for (name, std, mac, win, pdf) in ENCODING:
|
2010-08-26 15:02:46 +00:00
|
|
|
c = name2unicode(name)
|
2013-11-07 08:35:04 +00:00
|
|
|
if std:
|
|
|
|
std2unicode[std] = c
|
|
|
|
if mac:
|
|
|
|
mac2unicode[mac] = c
|
|
|
|
if win:
|
|
|
|
win2unicode[win] = c
|
|
|
|
if pdf:
|
|
|
|
pdf2unicode[pdf] = c
|
2009-12-19 14:17:00 +00:00
|
|
|
|
|
|
|
encodings = {
|
2013-11-07 08:35:04 +00:00
|
|
|
'StandardEncoding': std2unicode,
|
|
|
|
'MacRomanEncoding': mac2unicode,
|
|
|
|
'WinAnsiEncoding': win2unicode,
|
|
|
|
'PDFDocEncoding': pdf2unicode,
|
|
|
|
}
|
2009-12-19 14:17:00 +00:00
|
|
|
|
|
|
|
@classmethod
|
|
|
|
def get_encoding(klass, name, diff=None):
|
|
|
|
cid2unicode = klass.encodings.get(name, klass.std2unicode)
|
|
|
|
if diff:
|
|
|
|
cid2unicode = cid2unicode.copy()
|
|
|
|
cid = 0
|
|
|
|
for x in diff:
|
|
|
|
if isinstance(x, int):
|
|
|
|
cid = x
|
|
|
|
elif isinstance(x, PSLiteral):
|
|
|
|
try:
|
2010-08-26 15:02:46 +00:00
|
|
|
cid2unicode[cid] = name2unicode(x.name)
|
2009-12-19 14:17:00 +00:00
|
|
|
except KeyError:
|
|
|
|
pass
|
|
|
|
cid += 1
|
|
|
|
return cid2unicode
|