| 280 | ## CMapParser |
| 281 | ## |
| 282 | class CMapParser(PSStackParser): |
| 283 | |
| 284 | def __init__(self, cmap, fp): |
| 285 | PSStackParser.__init__(self, fp) |
| 286 | self.cmap = cmap |
| 287 | self._in_cmap = False |
| 288 | return |
| 289 | |
| 290 | def run(self): |
| 291 | try: |
| 292 | self.nextobject() |
| 293 | except PSEOF: |
| 294 | pass |
| 295 | return |
| 296 | |
| 297 | def do_keyword(self, pos, token): |
| 298 | name = token.name |
| 299 | if name == 'begincmap': |
| 300 | self._in_cmap = True |
| 301 | self.popall() |
| 302 | return |
| 303 | elif name == 'endcmap': |
| 304 | self._in_cmap = False |
| 305 | return |
| 306 | if not self._in_cmap: return |
| 307 | # |
| 308 | if name == 'def': |
| 309 | try: |
| 310 | ((_,k),(_,v)) = self.pop(2) |
| 311 | self.cmap.set_attr(literal_name(k), v) |
| 312 | except PSSyntaxError: |
| 313 | pass |
| 314 | return |
| 315 | |
| 316 | if name == 'usecmap': |
| 317 | try: |
| 318 | ((_,cmapname),) = self.pop(1) |
| 319 | self.cmap.use_cmap(CMapDB.get_cmap(literal_name(cmapname))) |
| 320 | except PSSyntaxError: |
| 321 | pass |
| 322 | except CMapDB.CMapNotFound: |
| 323 | pass |
| 324 | return |
| 325 | |
| 326 | if name == 'begincodespacerange': |
| 327 | self.popall() |
| 328 | return |
| 329 | if name == 'endcodespacerange': |
| 330 | self.popall() |
| 331 | return |
| 332 | |
| 333 | if name == 'begincidrange': |
| 334 | self.popall() |
| 335 | return |
| 336 | if name == 'endcidrange': |
| 337 | objs = [ obj for (_,obj) in self.popall() ] |
| 338 | for (s,e,cid) in choplist(3, objs): |
| 339 | if (not isinstance(s, str) or not isinstance(e, str) or |