Code refactoring: CMap and UnicodeMap both inherit CMapBase.

pull/1/head
Yusuke Shinyama 2014-04-16 18:57:16 +09:00
parent b09c37902f
commit 6b6fc264ff
1 changed files with 49 additions and 63 deletions

View File

@ -29,18 +29,44 @@ class CMapError(Exception):
pass pass
## CMap ## CMapBase
## ##
class CMap(object): class CMapBase(object):
debug = 0 debug = 0
def __init__(self, code2cid=None): def __init__(self, **kwargs):
self.code2cid = code2cid or {} self.attrs = kwargs.copy()
return return
def is_vertical(self): def is_vertical(self):
return False return self.attrs.get('WMode', 0) != 0
def set_attr(self, k, v):
self.attrs[k] = v
return
def add_code2cid(self, code, cid):
return
def add_cid2unichr(self, cid, code):
return
def use_cmap(self, cmap):
return
## CMap
##
class CMap(CMapBase):
def __init__(self, **kwargs):
CMapBase.__init__(self, **kwargs)
self.code2cid = {}
return
def __repr__(self):
return '<CMap: %s>' % self.attrs.get('CMapName')
def use_cmap(self, cmap): def use_cmap(self, cmap):
assert isinstance(cmap, CMap) assert isinstance(cmap, CMap)
@ -86,14 +112,7 @@ class CMap(object):
## IdentityCMap ## IdentityCMap
## ##
class IdentityCMap(object): class IdentityCMap(CMapBase):
def __init__(self, vertical):
self.vertical = vertical
return
def is_vertical(self):
return self.vertical
def decode(self, code): def decode(self, code):
n = len(code)//2 n = len(code)//2
@ -105,14 +124,16 @@ class IdentityCMap(object):
## UnicodeMap ## UnicodeMap
## ##
class UnicodeMap(object): class UnicodeMap(CMapBase):
debug = 0 def __init__(self, **kwargs):
CMapBase.__init__(self, **kwargs)
def __init__(self, cid2unichr=None): self.cid2unichr = {}
self.cid2unichr = cid2unichr or {}
return return
def __repr__(self):
return '<UnicodeMap: %s>' % self.attrs.get('CMapName')
def get_unichr(self, cid): def get_unichr(self, cid):
if self.debug: if self.debug:
print >>sys.stderr, 'get_unichr: %r, %r' % (self, cid) print >>sys.stderr, 'get_unichr: %r, %r' % (self, cid)
@ -128,21 +149,6 @@ class UnicodeMap(object):
## ##
class FileCMap(CMap): class FileCMap(CMap):
def __init__(self):
CMap.__init__(self)
self.attrs = {}
return
def __repr__(self):
return '<CMap: %s>' % self.attrs.get('CMapName')
def is_vertical(self):
return self.attrs.get('WMode', 0) != 0
def set_attr(self, k, v):
self.attrs[k] = v
return
def add_code2cid(self, code, cid): def add_code2cid(self, code, cid):
assert isinstance(code, str) and isinstance(cid, int) assert isinstance(code, str) and isinstance(cid, int)
d = self.code2cid d = self.code2cid
@ -163,18 +169,6 @@ class FileCMap(CMap):
## ##
class FileUnicodeMap(UnicodeMap): class FileUnicodeMap(UnicodeMap):
def __init__(self):
UnicodeMap.__init__(self)
self.attrs = {}
return
def __repr__(self):
return '<UnicodeMap: %s>' % self.attrs.get('CMapName')
def set_attr(self, k, v):
self.attrs[k] = v
return
def add_cid2unichr(self, cid, code): def add_cid2unichr(self, cid, code):
assert isinstance(cid, int) assert isinstance(cid, int)
if isinstance(code, PSLiteral): if isinstance(code, PSLiteral):
@ -195,34 +189,26 @@ class FileUnicodeMap(UnicodeMap):
class PyCMap(CMap): class PyCMap(CMap):
def __init__(self, name, module): def __init__(self, name, module):
CMap.__init__(self, module.CODE2CID) CMap.__init__(self, CMapName=name)
self.name = name self.code2cid = module.CODE2CID
self._is_vertical = module.IS_VERTICAL if module.IS_VERTICAL:
self.attrs['WMode'] = 1
return return
def __repr__(self):
return '<PyCMap: %s>' % (self.name)
def is_vertical(self):
return self._is_vertical
## PyUnicodeMap ## PyUnicodeMap
## ##
class PyUnicodeMap(UnicodeMap): class PyUnicodeMap(UnicodeMap):
def __init__(self, name, module, vertical): def __init__(self, name, module, vertical):
UnicodeMap.__init__(self, CMapName=name)
if vertical: if vertical:
cid2unichr = module.CID2UNICHR_V self.cid2unichr = module.CID2UNICHR_V
self.attrs['WMode'] = 1
else: else:
cid2unichr = module.CID2UNICHR_H self.cid2unichr = module.CID2UNICHR_H
UnicodeMap.__init__(self, cid2unichr)
self.name = name
return return
def __repr__(self):
return '<PyUnicodeMap: %s>' % (self.name)
## CMapDB ## CMapDB
## ##
@ -256,9 +242,9 @@ class CMapDB(object):
@classmethod @classmethod
def get_cmap(klass, name): def get_cmap(klass, name):
if name == 'Identity-H': if name == 'Identity-H':
return IdentityCMap(False) return IdentityCMap(WMode=0)
elif name == 'Identity-V': elif name == 'Identity-V':
return IdentityCMap(True) return IdentityCMap(WMode=1)
try: try:
return klass._cmap_cache[name] return klass._cmap_cache[name]
except KeyError: except KeyError: