Source code for charnames

"""Implementation of perl charnames functions"""

__author__ = """Joe Cool"""
___email__ = 'snoopyjc@gmail.com'
__version__ = '1.030'

import perllib
import unicodedata
import re
perllib.init_package('charnames')

[docs]def string_vianame(name): """This is a runtime equivalent to \\N{...}. name can be any expression that evaluates to a name accepted by \\N{...}""" if not name: return None if (_m := re.match(r'^U\+([0-9a-fA-F]+)$', name)): ordinal = int(_m.group(1), 16) return chr(ordinal) try: return unicodedata.lookup(name) except Exception: return None
charnames.string_vianame = string_vianame
[docs]def vianame(name): """This is similar to string_vianame. The main difference is that under most circumstances, vianame returns an ordinal code point, whereas string_vianame returns a string.""" if not name: return None if (_m := re.match(r'^U\+([0-9a-fA-F]+)$', name)): return int(_m.group(1), 16) try: return ord(unicodedata.lookup(name)) except Exception: return None
charnames.vianame = vianame _extra_table = {0: 'NULL', 1: 'START OF HEADING', 2: 'START OF TEXT', 3: 'END OF TEXT', 4: 'END OF TRANSMISSION', 5: 'ENQUIRY', 6: 'ACKNOWLEDGE', 7: 'ALERT', 8: 'BACKSPACE', 9: 'CHARACTER TABULATION', 10: 'LINE FEED', 11: 'LINE TABULATION', 12: 'FORM FEED', 13: 'CARRIAGE RETURN', 14: 'SHIFT OUT', 15: 'SHIFT IN', 16: 'DATA LINK ESCAPE', 17: 'DEVICE CONTROL ONE', 18: 'DEVICE CONTROL TWO', 19: 'DEVICE CONTROL THREE', 20: 'DEVICE CONTROL FOUR', 21: 'NEGATIVE ACKNOWLEDGE', 22: 'SYNCHRONOUS IDLE', 23: 'END OF TRANSMISSION BLOCK', 24: 'CANCEL', 25: 'END OF MEDIUM', 26: 'SUBSTITUTE', 27: 'ESCAPE', 28: 'INFORMATION SEPARATOR FOUR', 29: 'INFORMATION SEPARATOR THREE', 30: 'INFORMATION SEPARATOR TWO', 31: 'INFORMATION SEPARATOR ONE', 127: 'DELETE', 128: 'PADDING CHARACTER', 129: 'HIGH OCTET PRESET', 130: 'BREAK PERMITTED HERE', 131: 'NO BREAK HERE', 132: 'INDEX', 133: 'NEXT LINE', 134: 'START OF SELECTED AREA', 135: 'END OF SELECTED AREA', 136: 'CHARACTER TABULATION SET', 137: 'CHARACTER TABULATION WITH JUSTIFICATION', 138: 'LINE TABULATION SET', 139: 'PARTIAL LINE FORWARD', 140: 'PARTIAL LINE BACKWARD', 141: 'REVERSE LINE FEED', 142: 'SINGLE SHIFT TWO', 143: 'SINGLE SHIFT THREE', 144: 'DEVICE CONTROL STRING', 145: 'PRIVATE USE ONE', 146: 'PRIVATE USE TWO', 147: 'SET TRANSMIT STATE', 148: 'CANCEL CHARACTER', 149: 'MESSAGE WAITING', 150: 'START OF GUARDED AREA', 151: 'END OF GUARDED AREA', 152: 'START OF STRING', 153: 'SINGLE GRAPHIC CHARACTER INTRODUCER', 154: 'SINGLE CHARACTER INTRODUCER', 155: 'CONTROL SEQUENCE INTRODUCER', 156: 'STRING TERMINATOR', 157: 'OPERATING SYSTEM COMMAND', 158: 'PRIVACY MESSAGE', 159: 'APPLICATION PROGRAM COMMAND', }
[docs]def viacode(code): """Returns the full name of the character indicated by the numeric code.""" if code is None: return None try: if isinstance(code, str): if code[0:2] == 'U+' or code[0:2] == '0x': code = int(code[2:], 16) elif code[0:1] == '0' or re.search('[A-Fa-f]', code): code = int(code, 16) return unicodedata.name(chr(int(code))) except Exception: # Fix for https://bugs.python.org/issue46947: try: return _extra_table[int(code)] except Exception: pass return None
charnames.viacode = viacode