_teletex_codec.py 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331
  1. # coding: utf-8
  2. """
  3. Implementation of the teletex T.61 codec. Exports the following items:
  4. - register()
  5. """
  6. from __future__ import unicode_literals, division, absolute_import, print_function
  7. import codecs
  8. class TeletexCodec(codecs.Codec):
  9. def encode(self, input_, errors='strict'):
  10. return codecs.charmap_encode(input_, errors, ENCODING_TABLE)
  11. def decode(self, input_, errors='strict'):
  12. return codecs.charmap_decode(input_, errors, DECODING_TABLE)
  13. class TeletexIncrementalEncoder(codecs.IncrementalEncoder):
  14. def encode(self, input_, final=False):
  15. return codecs.charmap_encode(input_, self.errors, ENCODING_TABLE)[0]
  16. class TeletexIncrementalDecoder(codecs.IncrementalDecoder):
  17. def decode(self, input_, final=False):
  18. return codecs.charmap_decode(input_, self.errors, DECODING_TABLE)[0]
  19. class TeletexStreamWriter(TeletexCodec, codecs.StreamWriter):
  20. pass
  21. class TeletexStreamReader(TeletexCodec, codecs.StreamReader):
  22. pass
  23. def teletex_search_function(name):
  24. """
  25. Search function for teletex codec that is passed to codecs.register()
  26. """
  27. if name != 'teletex':
  28. return None
  29. return codecs.CodecInfo(
  30. name='teletex',
  31. encode=TeletexCodec().encode,
  32. decode=TeletexCodec().decode,
  33. incrementalencoder=TeletexIncrementalEncoder,
  34. incrementaldecoder=TeletexIncrementalDecoder,
  35. streamreader=TeletexStreamReader,
  36. streamwriter=TeletexStreamWriter,
  37. )
  38. def register():
  39. """
  40. Registers the teletex codec
  41. """
  42. codecs.register(teletex_search_function)
  43. # http://en.wikipedia.org/wiki/ITU_T.61
  44. DECODING_TABLE = (
  45. '\u0000'
  46. '\u0001'
  47. '\u0002'
  48. '\u0003'
  49. '\u0004'
  50. '\u0005'
  51. '\u0006'
  52. '\u0007'
  53. '\u0008'
  54. '\u0009'
  55. '\u000A'
  56. '\u000B'
  57. '\u000C'
  58. '\u000D'
  59. '\u000E'
  60. '\u000F'
  61. '\u0010'
  62. '\u0011'
  63. '\u0012'
  64. '\u0013'
  65. '\u0014'
  66. '\u0015'
  67. '\u0016'
  68. '\u0017'
  69. '\u0018'
  70. '\u0019'
  71. '\u001A'
  72. '\u001B'
  73. '\u001C'
  74. '\u001D'
  75. '\u001E'
  76. '\u001F'
  77. '\u0020'
  78. '\u0021'
  79. '\u0022'
  80. '\ufffe'
  81. '\ufffe'
  82. '\u0025'
  83. '\u0026'
  84. '\u0027'
  85. '\u0028'
  86. '\u0029'
  87. '\u002A'
  88. '\u002B'
  89. '\u002C'
  90. '\u002D'
  91. '\u002E'
  92. '\u002F'
  93. '\u0030'
  94. '\u0031'
  95. '\u0032'
  96. '\u0033'
  97. '\u0034'
  98. '\u0035'
  99. '\u0036'
  100. '\u0037'
  101. '\u0038'
  102. '\u0039'
  103. '\u003A'
  104. '\u003B'
  105. '\u003C'
  106. '\u003D'
  107. '\u003E'
  108. '\u003F'
  109. '\u0040'
  110. '\u0041'
  111. '\u0042'
  112. '\u0043'
  113. '\u0044'
  114. '\u0045'
  115. '\u0046'
  116. '\u0047'
  117. '\u0048'
  118. '\u0049'
  119. '\u004A'
  120. '\u004B'
  121. '\u004C'
  122. '\u004D'
  123. '\u004E'
  124. '\u004F'
  125. '\u0050'
  126. '\u0051'
  127. '\u0052'
  128. '\u0053'
  129. '\u0054'
  130. '\u0055'
  131. '\u0056'
  132. '\u0057'
  133. '\u0058'
  134. '\u0059'
  135. '\u005A'
  136. '\u005B'
  137. '\ufffe'
  138. '\u005D'
  139. '\ufffe'
  140. '\u005F'
  141. '\ufffe'
  142. '\u0061'
  143. '\u0062'
  144. '\u0063'
  145. '\u0064'
  146. '\u0065'
  147. '\u0066'
  148. '\u0067'
  149. '\u0068'
  150. '\u0069'
  151. '\u006A'
  152. '\u006B'
  153. '\u006C'
  154. '\u006D'
  155. '\u006E'
  156. '\u006F'
  157. '\u0070'
  158. '\u0071'
  159. '\u0072'
  160. '\u0073'
  161. '\u0074'
  162. '\u0075'
  163. '\u0076'
  164. '\u0077'
  165. '\u0078'
  166. '\u0079'
  167. '\u007A'
  168. '\ufffe'
  169. '\u007C'
  170. '\ufffe'
  171. '\ufffe'
  172. '\u007F'
  173. '\u0080'
  174. '\u0081'
  175. '\u0082'
  176. '\u0083'
  177. '\u0084'
  178. '\u0085'
  179. '\u0086'
  180. '\u0087'
  181. '\u0088'
  182. '\u0089'
  183. '\u008A'
  184. '\u008B'
  185. '\u008C'
  186. '\u008D'
  187. '\u008E'
  188. '\u008F'
  189. '\u0090'
  190. '\u0091'
  191. '\u0092'
  192. '\u0093'
  193. '\u0094'
  194. '\u0095'
  195. '\u0096'
  196. '\u0097'
  197. '\u0098'
  198. '\u0099'
  199. '\u009A'
  200. '\u009B'
  201. '\u009C'
  202. '\u009D'
  203. '\u009E'
  204. '\u009F'
  205. '\u00A0'
  206. '\u00A1'
  207. '\u00A2'
  208. '\u00A3'
  209. '\u0024'
  210. '\u00A5'
  211. '\u0023'
  212. '\u00A7'
  213. '\u00A4'
  214. '\ufffe'
  215. '\ufffe'
  216. '\u00AB'
  217. '\ufffe'
  218. '\ufffe'
  219. '\ufffe'
  220. '\ufffe'
  221. '\u00B0'
  222. '\u00B1'
  223. '\u00B2'
  224. '\u00B3'
  225. '\u00D7'
  226. '\u00B5'
  227. '\u00B6'
  228. '\u00B7'
  229. '\u00F7'
  230. '\ufffe'
  231. '\ufffe'
  232. '\u00BB'
  233. '\u00BC'
  234. '\u00BD'
  235. '\u00BE'
  236. '\u00BF'
  237. '\ufffe'
  238. '\u0300'
  239. '\u0301'
  240. '\u0302'
  241. '\u0303'
  242. '\u0304'
  243. '\u0306'
  244. '\u0307'
  245. '\u0308'
  246. '\ufffe'
  247. '\u030A'
  248. '\u0327'
  249. '\u0332'
  250. '\u030B'
  251. '\u0328'
  252. '\u030C'
  253. '\ufffe'
  254. '\ufffe'
  255. '\ufffe'
  256. '\ufffe'
  257. '\ufffe'
  258. '\ufffe'
  259. '\ufffe'
  260. '\ufffe'
  261. '\ufffe'
  262. '\ufffe'
  263. '\ufffe'
  264. '\ufffe'
  265. '\ufffe'
  266. '\ufffe'
  267. '\ufffe'
  268. '\ufffe'
  269. '\u2126'
  270. '\u00C6'
  271. '\u00D0'
  272. '\u00AA'
  273. '\u0126'
  274. '\ufffe'
  275. '\u0132'
  276. '\u013F'
  277. '\u0141'
  278. '\u00D8'
  279. '\u0152'
  280. '\u00BA'
  281. '\u00DE'
  282. '\u0166'
  283. '\u014A'
  284. '\u0149'
  285. '\u0138'
  286. '\u00E6'
  287. '\u0111'
  288. '\u00F0'
  289. '\u0127'
  290. '\u0131'
  291. '\u0133'
  292. '\u0140'
  293. '\u0142'
  294. '\u00F8'
  295. '\u0153'
  296. '\u00DF'
  297. '\u00FE'
  298. '\u0167'
  299. '\u014B'
  300. '\ufffe'
  301. )
  302. ENCODING_TABLE = codecs.charmap_build(DECODING_TABLE)