x_user_defined.py 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325
  1. # coding: utf-8
  2. """
  3. webencodings.x_user_defined
  4. ~~~~~~~~~~~~~~~~~~~~~~~~~~~
  5. An implementation of the x-user-defined encoding.
  6. :copyright: Copyright 2012 by Simon Sapin
  7. :license: BSD, see LICENSE for details.
  8. """
  9. from __future__ import unicode_literals
  10. import codecs
  11. ### Codec APIs
  12. class Codec(codecs.Codec):
  13. def encode(self, input, errors='strict'):
  14. return codecs.charmap_encode(input, errors, encoding_table)
  15. def decode(self, input, errors='strict'):
  16. return codecs.charmap_decode(input, errors, decoding_table)
  17. class IncrementalEncoder(codecs.IncrementalEncoder):
  18. def encode(self, input, final=False):
  19. return codecs.charmap_encode(input, self.errors, encoding_table)[0]
  20. class IncrementalDecoder(codecs.IncrementalDecoder):
  21. def decode(self, input, final=False):
  22. return codecs.charmap_decode(input, self.errors, decoding_table)[0]
  23. class StreamWriter(Codec, codecs.StreamWriter):
  24. pass
  25. class StreamReader(Codec, codecs.StreamReader):
  26. pass
  27. ### encodings module API
  28. codec_info = codecs.CodecInfo(
  29. name='x-user-defined',
  30. encode=Codec().encode,
  31. decode=Codec().decode,
  32. incrementalencoder=IncrementalEncoder,
  33. incrementaldecoder=IncrementalDecoder,
  34. streamreader=StreamReader,
  35. streamwriter=StreamWriter,
  36. )
  37. ### Decoding Table
  38. # Python 3:
  39. # for c in range(256): print(' %r' % chr(c if c < 128 else c + 0xF700))
  40. decoding_table = (
  41. '\x00'
  42. '\x01'
  43. '\x02'
  44. '\x03'
  45. '\x04'
  46. '\x05'
  47. '\x06'
  48. '\x07'
  49. '\x08'
  50. '\t'
  51. '\n'
  52. '\x0b'
  53. '\x0c'
  54. '\r'
  55. '\x0e'
  56. '\x0f'
  57. '\x10'
  58. '\x11'
  59. '\x12'
  60. '\x13'
  61. '\x14'
  62. '\x15'
  63. '\x16'
  64. '\x17'
  65. '\x18'
  66. '\x19'
  67. '\x1a'
  68. '\x1b'
  69. '\x1c'
  70. '\x1d'
  71. '\x1e'
  72. '\x1f'
  73. ' '
  74. '!'
  75. '"'
  76. '#'
  77. '$'
  78. '%'
  79. '&'
  80. "'"
  81. '('
  82. ')'
  83. '*'
  84. '+'
  85. ','
  86. '-'
  87. '.'
  88. '/'
  89. '0'
  90. '1'
  91. '2'
  92. '3'
  93. '4'
  94. '5'
  95. '6'
  96. '7'
  97. '8'
  98. '9'
  99. ':'
  100. ';'
  101. '<'
  102. '='
  103. '>'
  104. '?'
  105. '@'
  106. 'A'
  107. 'B'
  108. 'C'
  109. 'D'
  110. 'E'
  111. 'F'
  112. 'G'
  113. 'H'
  114. 'I'
  115. 'J'
  116. 'K'
  117. 'L'
  118. 'M'
  119. 'N'
  120. 'O'
  121. 'P'
  122. 'Q'
  123. 'R'
  124. 'S'
  125. 'T'
  126. 'U'
  127. 'V'
  128. 'W'
  129. 'X'
  130. 'Y'
  131. 'Z'
  132. '['
  133. '\\'
  134. ']'
  135. '^'
  136. '_'
  137. '`'
  138. 'a'
  139. 'b'
  140. 'c'
  141. 'd'
  142. 'e'
  143. 'f'
  144. 'g'
  145. 'h'
  146. 'i'
  147. 'j'
  148. 'k'
  149. 'l'
  150. 'm'
  151. 'n'
  152. 'o'
  153. 'p'
  154. 'q'
  155. 'r'
  156. 's'
  157. 't'
  158. 'u'
  159. 'v'
  160. 'w'
  161. 'x'
  162. 'y'
  163. 'z'
  164. '{'
  165. '|'
  166. '}'
  167. '~'
  168. '\x7f'
  169. '\uf780'
  170. '\uf781'
  171. '\uf782'
  172. '\uf783'
  173. '\uf784'
  174. '\uf785'
  175. '\uf786'
  176. '\uf787'
  177. '\uf788'
  178. '\uf789'
  179. '\uf78a'
  180. '\uf78b'
  181. '\uf78c'
  182. '\uf78d'
  183. '\uf78e'
  184. '\uf78f'
  185. '\uf790'
  186. '\uf791'
  187. '\uf792'
  188. '\uf793'
  189. '\uf794'
  190. '\uf795'
  191. '\uf796'
  192. '\uf797'
  193. '\uf798'
  194. '\uf799'
  195. '\uf79a'
  196. '\uf79b'
  197. '\uf79c'
  198. '\uf79d'
  199. '\uf79e'
  200. '\uf79f'
  201. '\uf7a0'
  202. '\uf7a1'
  203. '\uf7a2'
  204. '\uf7a3'
  205. '\uf7a4'
  206. '\uf7a5'
  207. '\uf7a6'
  208. '\uf7a7'
  209. '\uf7a8'
  210. '\uf7a9'
  211. '\uf7aa'
  212. '\uf7ab'
  213. '\uf7ac'
  214. '\uf7ad'
  215. '\uf7ae'
  216. '\uf7af'
  217. '\uf7b0'
  218. '\uf7b1'
  219. '\uf7b2'
  220. '\uf7b3'
  221. '\uf7b4'
  222. '\uf7b5'
  223. '\uf7b6'
  224. '\uf7b7'
  225. '\uf7b8'
  226. '\uf7b9'
  227. '\uf7ba'
  228. '\uf7bb'
  229. '\uf7bc'
  230. '\uf7bd'
  231. '\uf7be'
  232. '\uf7bf'
  233. '\uf7c0'
  234. '\uf7c1'
  235. '\uf7c2'
  236. '\uf7c3'
  237. '\uf7c4'
  238. '\uf7c5'
  239. '\uf7c6'
  240. '\uf7c7'
  241. '\uf7c8'
  242. '\uf7c9'
  243. '\uf7ca'
  244. '\uf7cb'
  245. '\uf7cc'
  246. '\uf7cd'
  247. '\uf7ce'
  248. '\uf7cf'
  249. '\uf7d0'
  250. '\uf7d1'
  251. '\uf7d2'
  252. '\uf7d3'
  253. '\uf7d4'
  254. '\uf7d5'
  255. '\uf7d6'
  256. '\uf7d7'
  257. '\uf7d8'
  258. '\uf7d9'
  259. '\uf7da'
  260. '\uf7db'
  261. '\uf7dc'
  262. '\uf7dd'
  263. '\uf7de'
  264. '\uf7df'
  265. '\uf7e0'
  266. '\uf7e1'
  267. '\uf7e2'
  268. '\uf7e3'
  269. '\uf7e4'
  270. '\uf7e5'
  271. '\uf7e6'
  272. '\uf7e7'
  273. '\uf7e8'
  274. '\uf7e9'
  275. '\uf7ea'
  276. '\uf7eb'
  277. '\uf7ec'
  278. '\uf7ed'
  279. '\uf7ee'
  280. '\uf7ef'
  281. '\uf7f0'
  282. '\uf7f1'
  283. '\uf7f2'
  284. '\uf7f3'
  285. '\uf7f4'
  286. '\uf7f5'
  287. '\uf7f6'
  288. '\uf7f7'
  289. '\uf7f8'
  290. '\uf7f9'
  291. '\uf7fa'
  292. '\uf7fb'
  293. '\uf7fc'
  294. '\uf7fd'
  295. '\uf7fe'
  296. '\uf7ff'
  297. )
  298. ### Encoding table
  299. encoding_table = codecs.charmap_build(decoding_table)