mirror of
https://github.com/AdaCore/cpython.git
synced 2026-02-12 12:57:15 -08:00
Merge part of the trunk changes into the p3yk branch. This merges from 43030
(branch-creation time) up to 43067. 43068 and 43069 contain a little swapping action between re.py and sre.py, and this mightily confuses svn merge, so later changes are going in separately. This merge should break no additional tests. The last-merged revision is going in a 'last_merge' property on '.' (the branch directory.) Arbitrarily chosen, really; if there's a BCP for this, I couldn't find it, but we can easily change it afterwards ;)
This commit is contained in:
@@ -24,8 +24,19 @@ It defines the following functions:
|
||||
\begin{funcdesc}{register}{search_function}
|
||||
Register a codec search function. Search functions are expected to
|
||||
take one argument, the encoding name in all lower case letters, and
|
||||
return a tuple of functions \code{(\var{encoder}, \var{decoder}, \var{stream_reader},
|
||||
\var{stream_writer})} taking the following arguments:
|
||||
return a \class{CodecInfo} object having the following attributes:
|
||||
|
||||
\begin{itemize}
|
||||
\item \code{name} The name of the encoding;
|
||||
\item \code{encoder} The stateless encoding function;
|
||||
\item \code{decoder} The stateless decoding function;
|
||||
\item \code{incrementalencoder} An incremental encoder class or factory function;
|
||||
\item \code{incrementaldecoder} An incremental decoder class or factory function;
|
||||
\item \code{streamwriter} A stream writer class or factory function;
|
||||
\item \code{streamreader} A stream reader class or factory function.
|
||||
\end{itemize}
|
||||
|
||||
The various functions or classes take the following arguments:
|
||||
|
||||
\var{encoder} and \var{decoder}: These must be functions or methods
|
||||
which have the same interface as the
|
||||
@@ -33,7 +44,17 @@ return a tuple of functions \code{(\var{encoder}, \var{decoder}, \var{stream_rea
|
||||
Codec Interface). The functions/methods are expected to work in a
|
||||
stateless mode.
|
||||
|
||||
\var{stream_reader} and \var{stream_writer}: These have to be
|
||||
\var{incrementalencoder} and \var{incrementalencoder}: These have to be
|
||||
factory functions providing the following interface:
|
||||
|
||||
\code{factory(\var{errors}='strict')}
|
||||
|
||||
The factory functions must return objects providing the interfaces
|
||||
defined by the base classes \class{IncrementalEncoder} and
|
||||
\class{IncrementalEncoder}, respectively. Incremental codecs can maintain
|
||||
state.
|
||||
|
||||
\var{streamreader} and \var{streamwriter}: These have to be
|
||||
factory functions providing the following interface:
|
||||
|
||||
\code{factory(\var{stream}, \var{errors}='strict')}
|
||||
@@ -58,13 +79,13 @@ return \code{None}.
|
||||
\end{funcdesc}
|
||||
|
||||
\begin{funcdesc}{lookup}{encoding}
|
||||
Looks up a codec tuple in the Python codec registry and returns the
|
||||
function tuple as defined above.
|
||||
Looks up the codec info in the Python codec registry and returns a
|
||||
\class{CodecInfo} object as defined above.
|
||||
|
||||
Encodings are first looked up in the registry's cache. If not found,
|
||||
the list of registered search functions is scanned. If no codecs tuple
|
||||
is found, a \exception{LookupError} is raised. Otherwise, the codecs
|
||||
tuple is stored in the cache and returned to the caller.
|
||||
the list of registered search functions is scanned. If no \class{CodecInfo}
|
||||
object is found, a \exception{LookupError} is raised. Otherwise, the
|
||||
\class{CodecInfo} object is stored in the cache and returned to the caller.
|
||||
\end{funcdesc}
|
||||
|
||||
To simplify access to the various codecs, the module provides these
|
||||
@@ -85,6 +106,22 @@ function.
|
||||
Raises a \exception{LookupError} in case the encoding cannot be found.
|
||||
\end{funcdesc}
|
||||
|
||||
\begin{funcdesc}{getincrementalencoder}{encoding}
|
||||
Lookup up the codec for the given encoding and return its incremental encoder
|
||||
class or factory function.
|
||||
|
||||
Raises a \exception{LookupError} in case the encoding cannot be found or the
|
||||
codec doesn't support an incremental encoder.
|
||||
\end{funcdesc}
|
||||
|
||||
\begin{funcdesc}{getincrementaldecoder}{encoding}
|
||||
Lookup up the codec for the given encoding and return its incremental decoder
|
||||
class or factory function.
|
||||
|
||||
Raises a \exception{LookupError} in case the encoding cannot be found or the
|
||||
codec doesn't support an incremental decoder.
|
||||
\end{funcdesc}
|
||||
|
||||
\begin{funcdesc}{getreader}{encoding}
|
||||
Lookup up the codec for the given encoding and return its StreamReader
|
||||
class or factory function.
|
||||
@@ -188,6 +225,18 @@ If \var{output} is not given, it defaults to \var{input}.
|
||||
an encoding error occurs.
|
||||
\end{funcdesc}
|
||||
|
||||
\begin{funcdesc}{iterencode}{iterable, encoding\optional{, errors}}
|
||||
Uses an incremental encoder to iteratively encode the input provided by
|
||||
\var{iterable}. This function is a generator. \var{errors} (as well as
|
||||
any other keyword argument) is passed through to the incremental encoder.
|
||||
\end{funcdesc}
|
||||
|
||||
\begin{funcdesc}{iterdecode}{iterable, encoding\optional{, errors}}
|
||||
Uses an incremental decoder to iteratively decode the input provided by
|
||||
\var{iterable}. This function is a generator. \var{errors} (as well as
|
||||
any other keyword argument) is passed through to the incremental encoder.
|
||||
\end{funcdesc}
|
||||
|
||||
The module also provides the following constants which are useful
|
||||
for reading and writing to platform dependent files:
|
||||
|
||||
@@ -292,6 +341,109 @@ function interfaces of the stateless encoder and decoder:
|
||||
empty object of the output object type in this situation.
|
||||
\end{methoddesc}
|
||||
|
||||
The \class{IncrementalEncoder} and \class{IncrementalDecoder} classes provide
|
||||
the basic interface for incremental encoding and decoding. Encoding/decoding the
|
||||
input isn't done with one call to the stateless encoder/decoder function,
|
||||
but with multiple calls to the \method{encode}/\method{decode} method of the
|
||||
incremental encoder/decoder. The incremental encoder/decoder keeps track of
|
||||
the encoding/decoding process during method calls.
|
||||
|
||||
The joined output of calls to the \method{encode}/\method{decode} method is the
|
||||
same as if the all single inputs where joined into one, and this input was
|
||||
encoded/decoded with the stateless encoder/decoder.
|
||||
|
||||
|
||||
\subsubsection{IncrementalEncoder Objects \label{incremental-encoder-objects}}
|
||||
|
||||
The \class{IncrementalEncoder} class is used for encoding an input in multiple
|
||||
steps. It defines the following methods which every incremental encoder must
|
||||
define in order to be compatible to the Python codec registry.
|
||||
|
||||
\begin{classdesc}{IncrementalEncoder}{\optional{errors}}
|
||||
Constructor for a \class{IncrementalEncoder} instance.
|
||||
|
||||
All incremental encoders must provide this constructor interface. They are
|
||||
free to add additional keyword arguments, but only the ones defined
|
||||
here are used by the Python codec registry.
|
||||
|
||||
The \class{IncrementalEncoder} may implement different error handling
|
||||
schemes by providing the \var{errors} keyword argument. These
|
||||
parameters are predefined:
|
||||
|
||||
\begin{itemize}
|
||||
\item \code{'strict'} Raise \exception{ValueError} (or a subclass);
|
||||
this is the default.
|
||||
\item \code{'ignore'} Ignore the character and continue with the next.
|
||||
\item \code{'replace'} Replace with a suitable replacement character
|
||||
\item \code{'xmlcharrefreplace'} Replace with the appropriate XML
|
||||
character reference
|
||||
\item \code{'backslashreplace'} Replace with backslashed escape sequences.
|
||||
\end{itemize}
|
||||
|
||||
The \var{errors} argument will be assigned to an attribute of the
|
||||
same name. Assigning to this attribute makes it possible to switch
|
||||
between different error handling strategies during the lifetime
|
||||
of the \class{IncrementalEncoder} object.
|
||||
|
||||
The set of allowed values for the \var{errors} argument can
|
||||
be extended with \function{register_error()}.
|
||||
\end{classdesc}
|
||||
|
||||
\begin{methoddesc}{encode}{object\optional{, final}}
|
||||
Encodes \var{object} (taking the current state of the encoder into account)
|
||||
and returns the resulting encoded object. If this is the last call to
|
||||
\method{encode} \var{final} must be true (the default is false).
|
||||
\end{methoddesc}
|
||||
|
||||
\begin{methoddesc}{reset}{}
|
||||
Reset the encoder to the initial state.
|
||||
\end{methoddesc}
|
||||
|
||||
|
||||
\subsubsection{IncrementalDecoder Objects \label{incremental-decoder-objects}}
|
||||
|
||||
The \class{IncrementalDecoder} class is used for decoding an input in multiple
|
||||
steps. It defines the following methods which every incremental decoder must
|
||||
define in order to be compatible to the Python codec registry.
|
||||
|
||||
\begin{classdesc}{IncrementalDecoder}{\optional{errors}}
|
||||
Constructor for a \class{IncrementalDecoder} instance.
|
||||
|
||||
All incremental decoders must provide this constructor interface. They are
|
||||
free to add additional keyword arguments, but only the ones defined
|
||||
here are used by the Python codec registry.
|
||||
|
||||
The \class{IncrementalDecoder} may implement different error handling
|
||||
schemes by providing the \var{errors} keyword argument. These
|
||||
parameters are predefined:
|
||||
|
||||
\begin{itemize}
|
||||
\item \code{'strict'} Raise \exception{ValueError} (or a subclass);
|
||||
this is the default.
|
||||
\item \code{'ignore'} Ignore the character and continue with the next.
|
||||
\item \code{'replace'} Replace with a suitable replacement character.
|
||||
\end{itemize}
|
||||
|
||||
The \var{errors} argument will be assigned to an attribute of the
|
||||
same name. Assigning to this attribute makes it possible to switch
|
||||
between different error handling strategies during the lifetime
|
||||
of the \class{IncrementalEncoder} object.
|
||||
|
||||
The set of allowed values for the \var{errors} argument can
|
||||
be extended with \function{register_error()}.
|
||||
\end{classdesc}
|
||||
|
||||
\begin{methoddesc}{decode}{object\optional{, final}}
|
||||
Decodes \var{object} (taking the current state of the decoder into account)
|
||||
and returns the resulting decoded object. If this is the last call to
|
||||
\method{decode} \var{final} must be true (the default is false).
|
||||
\end{methoddesc}
|
||||
|
||||
\begin{methoddesc}{reset}{}
|
||||
Reset the decoder to the initial state.
|
||||
\end{methoddesc}
|
||||
|
||||
|
||||
The \class{StreamWriter} and \class{StreamReader} classes provide
|
||||
generic working interfaces which can be used to implement new
|
||||
encodings submodules very easily. See \module{encodings.utf_8} for an
|
||||
|
||||
@@ -209,6 +209,12 @@ implemented by Richard Jones and Fred Drake.}
|
||||
% XXX write this
|
||||
|
||||
|
||||
%======================================================================
|
||||
\section{PEP 338: Executing Modules as Scripts}
|
||||
|
||||
% XXX write this
|
||||
|
||||
|
||||
%======================================================================
|
||||
\section{PEP 341: Unified try/except/finally}
|
||||
|
||||
|
||||
@@ -29,15 +29,15 @@ PyAPI_FUNC(int) PyCodec_Register(
|
||||
|
||||
/* Codec register lookup API.
|
||||
|
||||
Looks up the given encoding and returns a tuple (encoder, decoder,
|
||||
stream reader, stream writer) of functions which implement the
|
||||
different aspects of processing the encoding.
|
||||
Looks up the given encoding and returns a CodecInfo object with
|
||||
function attributes which implement the different aspects of
|
||||
processing the encoding.
|
||||
|
||||
The encoding string is looked up converted to all lower-case
|
||||
characters. This makes encodings looked up through this mechanism
|
||||
effectively case-insensitive.
|
||||
|
||||
If no codec is found, a KeyError is set and NULL returned.
|
||||
If no codec is found, a KeyError is set and NULL returned.
|
||||
|
||||
As side effect, this tries to load the encodings package, if not
|
||||
yet done. This is part of the lazy load strategy for the encodings
|
||||
@@ -101,6 +101,20 @@ PyAPI_FUNC(PyObject *) PyCodec_Decoder(
|
||||
const char *encoding
|
||||
);
|
||||
|
||||
/* Get a IncrementalEncoder object for the given encoding. */
|
||||
|
||||
PyAPI_FUNC(PyObject *) PyCodec_IncrementalEncoder(
|
||||
const char *encoding,
|
||||
const char *errors
|
||||
);
|
||||
|
||||
/* Get a IncrementalDecoder object function for the given encoding. */
|
||||
|
||||
PyAPI_FUNC(PyObject *) PyCodec_IncrementalDecoder(
|
||||
const char *encoding,
|
||||
const char *errors
|
||||
);
|
||||
|
||||
/* Get a StreamReader factory function for the given encoding. */
|
||||
|
||||
PyAPI_FUNC(PyObject *) PyCodec_StreamReader(
|
||||
|
||||
@@ -72,8 +72,7 @@ class StringIO:
|
||||
method is called repeatedly. This method returns the next input line,
|
||||
or raises StopIteration when EOF is hit.
|
||||
"""
|
||||
if self.closed:
|
||||
raise StopIteration
|
||||
_complain_ifclosed(self.closed)
|
||||
r = self.readline()
|
||||
if not r:
|
||||
raise StopIteration
|
||||
|
||||
183
Lib/codecs.py
183
Lib/codecs.py
@@ -73,6 +73,23 @@ BOM64_BE = BOM_UTF32_BE
|
||||
|
||||
### Codec base classes (defining the API)
|
||||
|
||||
class CodecInfo(tuple):
|
||||
|
||||
def __new__(cls, encode, decode, streamreader=None, streamwriter=None,
|
||||
incrementalencoder=None, incrementaldecoder=None, name=None):
|
||||
self = tuple.__new__(cls, (encode, decode, streamreader, streamwriter))
|
||||
self.name = name
|
||||
self.encode = encode
|
||||
self.decode = decode
|
||||
self.incrementalencoder = incrementalencoder
|
||||
self.incrementaldecoder = incrementaldecoder
|
||||
self.streamwriter = streamwriter
|
||||
self.streamreader = streamreader
|
||||
return self
|
||||
|
||||
def __repr__(self):
|
||||
return "<%s.%s object for encoding %s at 0x%x>" % (self.__class__.__module__, self.__class__.__name__, self.name, id(self))
|
||||
|
||||
class Codec:
|
||||
|
||||
""" Defines the interface for stateless encoders/decoders.
|
||||
@@ -137,6 +154,88 @@ class Codec:
|
||||
"""
|
||||
raise NotImplementedError
|
||||
|
||||
class IncrementalEncoder(object):
|
||||
"""
|
||||
A IncrementalEncoder encodes an input in multiple steps. The input can be
|
||||
passed piece by piece to the encode() method. The IncrementalEncoder remembers
|
||||
the state of the Encoding process between calls to encode().
|
||||
"""
|
||||
def __init__(self, errors='strict'):
|
||||
"""
|
||||
Creates a IncrementalEncoder instance.
|
||||
|
||||
The IncrementalEncoder may use different error handling schemes by
|
||||
providing the errors keyword argument. See the module docstring
|
||||
for a list of possible values.
|
||||
"""
|
||||
self.errors = errors
|
||||
self.buffer = ""
|
||||
|
||||
def encode(self, input, final=False):
|
||||
"""
|
||||
Encodes input and returns the resulting object.
|
||||
"""
|
||||
raise NotImplementedError
|
||||
|
||||
def reset(self):
|
||||
"""
|
||||
Resets the encoder to the initial state.
|
||||
"""
|
||||
|
||||
class IncrementalDecoder(object):
|
||||
"""
|
||||
An IncrementalDecoder decodes an input in multiple steps. The input can be
|
||||
passed piece by piece to the decode() method. The IncrementalDecoder
|
||||
remembers the state of the decoding process between calls to decode().
|
||||
"""
|
||||
def __init__(self, errors='strict'):
|
||||
"""
|
||||
Creates a IncrementalDecoder instance.
|
||||
|
||||
The IncrementalDecoder may use different error handling schemes by
|
||||
providing the errors keyword argument. See the module docstring
|
||||
for a list of possible values.
|
||||
"""
|
||||
self.errors = errors
|
||||
|
||||
def decode(self, input, final=False):
|
||||
"""
|
||||
Decodes input and returns the resulting object.
|
||||
"""
|
||||
raise NotImplementedError
|
||||
|
||||
def reset(self):
|
||||
"""
|
||||
Resets the decoder to the initial state.
|
||||
"""
|
||||
|
||||
class BufferedIncrementalDecoder(IncrementalDecoder):
|
||||
"""
|
||||
This subclass of IncrementalDecoder can be used as the baseclass for an
|
||||
incremental decoder if the decoder must be able to handle incomplete byte
|
||||
sequences.
|
||||
"""
|
||||
def __init__(self, errors='strict'):
|
||||
IncrementalDecoder.__init__(self, errors)
|
||||
self.buffer = "" # undecoded input that is kept between calls to decode()
|
||||
|
||||
def _buffer_decode(self, input, errors, final):
|
||||
# Overwrite this method in subclasses: It must decode input
|
||||
# and return an (output, length consumed) tuple
|
||||
raise NotImplementedError
|
||||
|
||||
def decode(self, input, final=False):
|
||||
# decode input (taking the buffer into account)
|
||||
data = self.buffer + input
|
||||
(result, consumed) = self._buffer_decode(data, self.errors, final)
|
||||
# keep undecoded input until the next call
|
||||
self.buffer = data[consumed:]
|
||||
return result
|
||||
|
||||
def reset(self):
|
||||
IncrementalDecoder.reset(self)
|
||||
self.bytebuffer = ""
|
||||
|
||||
#
|
||||
# The StreamWriter and StreamReader class provide generic working
|
||||
# interfaces which can be used to implement new encoding submodules
|
||||
@@ -666,8 +765,8 @@ def open(filename, mode='rb', encoding=None, errors='strict', buffering=1):
|
||||
file = __builtin__.open(filename, mode, buffering)
|
||||
if encoding is None:
|
||||
return file
|
||||
(e, d, sr, sw) = lookup(encoding)
|
||||
srw = StreamReaderWriter(file, sr, sw, errors)
|
||||
info = lookup(encoding)
|
||||
srw = StreamReaderWriter(file, info.streamreader, info.streamwriter, errors)
|
||||
# Add attributes to simplify introspection
|
||||
srw.encoding = encoding
|
||||
return srw
|
||||
@@ -699,11 +798,9 @@ def EncodedFile(file, data_encoding, file_encoding=None, errors='strict'):
|
||||
"""
|
||||
if file_encoding is None:
|
||||
file_encoding = data_encoding
|
||||
encode, decode = lookup(data_encoding)[:2]
|
||||
Reader, Writer = lookup(file_encoding)[2:]
|
||||
sr = StreamRecoder(file,
|
||||
encode, decode, Reader, Writer,
|
||||
errors)
|
||||
info = lookup(data_encoding)
|
||||
sr = StreamRecoder(file, info.encode, info.decode,
|
||||
info.streamreader, info.streamwriter, errors)
|
||||
# Add attributes to simplify introspection
|
||||
sr.data_encoding = data_encoding
|
||||
sr.file_encoding = file_encoding
|
||||
@@ -719,7 +816,7 @@ def getencoder(encoding):
|
||||
Raises a LookupError in case the encoding cannot be found.
|
||||
|
||||
"""
|
||||
return lookup(encoding)[0]
|
||||
return lookup(encoding).encode
|
||||
|
||||
def getdecoder(encoding):
|
||||
|
||||
@@ -729,7 +826,35 @@ def getdecoder(encoding):
|
||||
Raises a LookupError in case the encoding cannot be found.
|
||||
|
||||
"""
|
||||
return lookup(encoding)[1]
|
||||
return lookup(encoding).decode
|
||||
|
||||
def getincrementalencoder(encoding):
|
||||
|
||||
""" Lookup up the codec for the given encoding and return
|
||||
its IncrementalEncoder class or factory function.
|
||||
|
||||
Raises a LookupError in case the encoding cannot be found
|
||||
or the codecs doesn't provide an incremental encoder.
|
||||
|
||||
"""
|
||||
encoder = lookup(encoding).incrementalencoder
|
||||
if encoder is None:
|
||||
raise LookupError(encoding)
|
||||
return encoder
|
||||
|
||||
def getincrementaldecoder(encoding):
|
||||
|
||||
""" Lookup up the codec for the given encoding and return
|
||||
its IncrementalDecoder class or factory function.
|
||||
|
||||
Raises a LookupError in case the encoding cannot be found
|
||||
or the codecs doesn't provide an incremental decoder.
|
||||
|
||||
"""
|
||||
decoder = lookup(encoding).incrementaldecoder
|
||||
if decoder is None:
|
||||
raise LookupError(encoding)
|
||||
return decoder
|
||||
|
||||
def getreader(encoding):
|
||||
|
||||
@@ -739,7 +864,7 @@ def getreader(encoding):
|
||||
Raises a LookupError in case the encoding cannot be found.
|
||||
|
||||
"""
|
||||
return lookup(encoding)[2]
|
||||
return lookup(encoding).streamreader
|
||||
|
||||
def getwriter(encoding):
|
||||
|
||||
@@ -749,7 +874,43 @@ def getwriter(encoding):
|
||||
Raises a LookupError in case the encoding cannot be found.
|
||||
|
||||
"""
|
||||
return lookup(encoding)[3]
|
||||
return lookup(encoding).streamwriter
|
||||
|
||||
def iterencode(iterator, encoding, errors='strict', **kwargs):
|
||||
"""
|
||||
Encoding iterator.
|
||||
|
||||
Encodes the input strings from the iterator using a IncrementalEncoder.
|
||||
|
||||
errors and kwargs are passed through to the IncrementalEncoder
|
||||
constructor.
|
||||
"""
|
||||
encoder = getincrementalencoder(encoding)(errors, **kwargs)
|
||||
for input in iterator:
|
||||
output = encoder.encode(input)
|
||||
if output:
|
||||
yield output
|
||||
output = encoder.encode("", True)
|
||||
if output:
|
||||
yield output
|
||||
|
||||
def iterdecode(iterator, encoding, errors='strict', **kwargs):
|
||||
"""
|
||||
Decoding iterator.
|
||||
|
||||
Decodes the input strings from the iterator using a IncrementalDecoder.
|
||||
|
||||
errors and kwargs are passed through to the IncrementalDecoder
|
||||
constructor.
|
||||
"""
|
||||
decoder = getincrementaldecoder(encoding)(errors, **kwargs)
|
||||
for input in iterator:
|
||||
output = decoder.decode(input)
|
||||
if output:
|
||||
yield output
|
||||
output = decoder.decode("", True)
|
||||
if output:
|
||||
yield output
|
||||
|
||||
### Helpers for charmap-based codecs
|
||||
|
||||
|
||||
@@ -9,9 +9,10 @@
|
||||
|
||||
Each codec module must export the following interface:
|
||||
|
||||
* getregentry() -> (encoder, decoder, stream_reader, stream_writer)
|
||||
The getregentry() API must return callable objects which adhere to
|
||||
the Python Codec Interface Standard.
|
||||
* getregentry() -> codecs.CodecInfo object
|
||||
The getregentry() API must a CodecInfo object with encoder, decoder,
|
||||
incrementalencoder, incrementaldecoder, streamwriter and streamreader
|
||||
atttributes which adhere to the Python Codec Interface Standard.
|
||||
|
||||
In addition, a module may optionally also define the following
|
||||
APIs which are then used by the package's codec search function:
|
||||
@@ -113,16 +114,24 @@ def search_function(encoding):
|
||||
return None
|
||||
|
||||
# Now ask the module for the registry entry
|
||||
entry = tuple(getregentry())
|
||||
if len(entry) != 4:
|
||||
raise CodecRegistryError,\
|
||||
'module "%s" (%s) failed to register' % \
|
||||
(mod.__name__, mod.__file__)
|
||||
for obj in entry:
|
||||
if not callable(obj):
|
||||
entry = getregentry()
|
||||
if not isinstance(entry, codecs.CodecInfo):
|
||||
if not 4 <= len(entry) <= 7:
|
||||
raise CodecRegistryError,\
|
||||
'incompatible codecs in module "%s" (%s)' % \
|
||||
'module "%s" (%s) failed to register' % \
|
||||
(mod.__name__, mod.__file__)
|
||||
if not callable(entry[0]) or \
|
||||
not callable(entry[1]) or \
|
||||
(entry[2] is not None and not callable(entry[2])) or \
|
||||
(entry[3] is not None and not callable(entry[3])) or \
|
||||
(len(entry) > 4 and entry[4] is not None and not callable(entry[4])) or \
|
||||
(len(entry) > 5 and entry[5] is not None and not callable(entry[5])):
|
||||
raise CodecRegistryError,\
|
||||
'incompatible codecs in module "%s" (%s)' % \
|
||||
(mod.__name__, mod.__file__)
|
||||
if len(entry)<7 or entry[6] is None:
|
||||
entry += (None,)*(6-len(entry)) + (mod.__name__.split(".", 1)[1],)
|
||||
entry = codecs.CodecInfo(*entry)
|
||||
|
||||
# Cache the codec registry entry
|
||||
_cache[encoding] = entry
|
||||
|
||||
@@ -17,6 +17,14 @@ class Codec(codecs.Codec):
|
||||
encode = codecs.ascii_encode
|
||||
decode = codecs.ascii_decode
|
||||
|
||||
class IncrementalEncoder(codecs.IncrementalEncoder):
|
||||
def encode(self, input, final=False):
|
||||
return codecs.ascii_encode(input, self.errors)[0]
|
||||
|
||||
class IncrementalDecoder(codecs.IncrementalDecoder):
|
||||
def decode(self, input, final=False):
|
||||
return codecs.ascii_decode(input, self.errors)[0]
|
||||
|
||||
class StreamWriter(Codec,codecs.StreamWriter):
|
||||
pass
|
||||
|
||||
@@ -31,5 +39,12 @@ class StreamConverter(StreamWriter,StreamReader):
|
||||
### encodings module API
|
||||
|
||||
def getregentry():
|
||||
|
||||
return (Codec.encode,Codec.decode,StreamReader,StreamWriter)
|
||||
return codecs.CodecInfo(
|
||||
name='ascii',
|
||||
encode=Codec.encode,
|
||||
decode=Codec.decode,
|
||||
incrementalencoder=IncrementalEncoder,
|
||||
incrementaldecoder=IncrementalDecoder,
|
||||
streamwriter=StreamWriter,
|
||||
streamreader=StreamReader,
|
||||
)
|
||||
|
||||
@@ -49,6 +49,16 @@ class Codec(codecs.Codec):
|
||||
def decode(self, input,errors='strict'):
|
||||
return base64_decode(input,errors)
|
||||
|
||||
class IncrementalEncoder(codecs.IncrementalEncoder):
|
||||
def encode(self, input, final=False):
|
||||
assert self.errors == 'strict'
|
||||
return base64.encodestring(input)
|
||||
|
||||
class IncrementalDecoder(codecs.IncrementalDecoder):
|
||||
def decode(self, input, final=False):
|
||||
assert self.errors == 'strict'
|
||||
return base64.decodestring(input)
|
||||
|
||||
class StreamWriter(Codec,codecs.StreamWriter):
|
||||
pass
|
||||
|
||||
@@ -58,5 +68,12 @@ class StreamReader(Codec,codecs.StreamReader):
|
||||
### encodings module API
|
||||
|
||||
def getregentry():
|
||||
|
||||
return (base64_encode,base64_decode,StreamReader,StreamWriter)
|
||||
return codecs.CodecInfo(
|
||||
name='base64',
|
||||
encode=base64_encode,
|
||||
decode=base64_decode,
|
||||
incrementalencoder=IncrementalEncoder,
|
||||
incrementaldecoder=IncrementalDecoder,
|
||||
streamwriter=StreamWriter,
|
||||
streamreader=StreamReader,
|
||||
)
|
||||
|
||||
@@ -51,6 +51,16 @@ class Codec(codecs.Codec):
|
||||
def decode(self, input, errors='strict'):
|
||||
return bz2_decode(input, errors)
|
||||
|
||||
class IncrementalEncoder(codecs.IncrementalEncoder):
|
||||
def encode(self, input, final=False):
|
||||
assert self.errors == 'strict'
|
||||
return bz2.compress(input)
|
||||
|
||||
class IncrementalDecoder(codecs.IncrementalDecoder):
|
||||
def decode(self, input, final=False):
|
||||
assert self.errors == 'strict'
|
||||
return bz2.decompress(input)
|
||||
|
||||
class StreamWriter(Codec,codecs.StreamWriter):
|
||||
pass
|
||||
|
||||
@@ -60,5 +70,12 @@ class StreamReader(Codec,codecs.StreamReader):
|
||||
### encodings module API
|
||||
|
||||
def getregentry():
|
||||
|
||||
return (bz2_encode,bz2_decode,StreamReader,StreamWriter)
|
||||
return codecs.CodecInfo(
|
||||
name="bz2",
|
||||
encode=bz2_encode,
|
||||
decode=bz2_decode,
|
||||
incrementalencoder=IncrementalEncoder,
|
||||
incrementaldecoder=IncrementalDecoder,
|
||||
streamwriter=StreamWriter,
|
||||
streamreader=StreamReader,
|
||||
)
|
||||
|
||||
@@ -21,30 +21,49 @@ class Codec(codecs.Codec):
|
||||
encode = codecs.charmap_encode
|
||||
decode = codecs.charmap_decode
|
||||
|
||||
class IncrementalEncoder(codecs.IncrementalEncoder):
|
||||
def __init__(self, errors='strict', mapping=None):
|
||||
codecs.IncrementalEncoder.__init__(self, errors)
|
||||
self.mapping = mapping
|
||||
|
||||
def encode(self, input, final=False):
|
||||
return codecs.charmap_encode(input, self.errors, self.mapping)[0]
|
||||
|
||||
class IncrementalDecoder(codecs.IncrementalDecoder):
|
||||
def __init__(self, errors='strict', mapping=None):
|
||||
codecs.IncrementalDecoder.__init__(self, errors)
|
||||
self.mapping = mapping
|
||||
|
||||
def decode(self, input, final=False):
|
||||
return codecs.charmap_decode(input, self.errors, self.mapping)[0]
|
||||
|
||||
class StreamWriter(Codec,codecs.StreamWriter):
|
||||
|
||||
def __init__(self,stream,errors='strict',mapping=None):
|
||||
|
||||
codecs.StreamWriter.__init__(self,stream,errors)
|
||||
self.mapping = mapping
|
||||
|
||||
def encode(self,input,errors='strict'):
|
||||
|
||||
return Codec.encode(input,errors,self.mapping)
|
||||
|
||||
class StreamReader(Codec,codecs.StreamReader):
|
||||
|
||||
def __init__(self,stream,errors='strict',mapping=None):
|
||||
|
||||
codecs.StreamReader.__init__(self,stream,errors)
|
||||
self.mapping = mapping
|
||||
|
||||
def decode(self,input,errors='strict'):
|
||||
|
||||
return Codec.decode(input,errors,self.mapping)
|
||||
|
||||
### encodings module API
|
||||
|
||||
def getregentry():
|
||||
|
||||
return (Codec.encode,Codec.decode,StreamReader,StreamWriter)
|
||||
return codecs.CodecInfo(
|
||||
name='charmap',
|
||||
encode=Codec.encode,
|
||||
decode=Codec.decode,
|
||||
incrementalencoder=IncrementalEncoder,
|
||||
incrementaldecoder=IncrementalDecoder,
|
||||
streamwriter=StreamWriter,
|
||||
streamreader=StreamReader,
|
||||
)
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
""" Python Character Mapping Codec generated from 'MAPPINGS/VENDORS/MICSFT/EBCDIC/CP037.TXT' with gencodec.py.
|
||||
""" Python Character Mapping Codec cp037 generated from 'MAPPINGS/VENDORS/MICSFT/EBCDIC/CP037.TXT' with gencodec.py.
|
||||
|
||||
"""#"
|
||||
|
||||
@@ -9,13 +9,19 @@ import codecs
|
||||
class Codec(codecs.Codec):
|
||||
|
||||
def encode(self,input,errors='strict'):
|
||||
|
||||
return codecs.charmap_encode(input,errors,encoding_map)
|
||||
|
||||
def decode(self,input,errors='strict'):
|
||||
|
||||
return codecs.charmap_decode(input,errors,decoding_table)
|
||||
|
||||
class IncrementalEncoder(codecs.IncrementalEncoder):
|
||||
def encode(self, input, final=False):
|
||||
return codecs.charmap_encode(input,self.errors,encoding_map)[0]
|
||||
|
||||
class IncrementalDecoder(codecs.IncrementalDecoder):
|
||||
def decode(self, input, final=False):
|
||||
return codecs.charmap_decode(input,self.errors,decoding_table)[0]
|
||||
|
||||
class StreamWriter(Codec,codecs.StreamWriter):
|
||||
pass
|
||||
|
||||
@@ -25,8 +31,15 @@ class StreamReader(Codec,codecs.StreamReader):
|
||||
### encodings module API
|
||||
|
||||
def getregentry():
|
||||
|
||||
return (Codec().encode,Codec().decode,StreamReader,StreamWriter)
|
||||
return codecs.CodecInfo(
|
||||
name='cp037',
|
||||
encode=Codec().encode,
|
||||
decode=Codec().decode,
|
||||
incrementalencoder=IncrementalEncoder,
|
||||
incrementaldecoder=IncrementalDecoder,
|
||||
streamreader=StreamReader,
|
||||
streamwriter=StreamWriter,
|
||||
)
|
||||
|
||||
|
||||
### Decoding Table
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
""" Python Character Mapping Codec generated from 'MAPPINGS/VENDORS/MISC/CP1006.TXT' with gencodec.py.
|
||||
""" Python Character Mapping Codec cp1006 generated from 'MAPPINGS/VENDORS/MISC/CP1006.TXT' with gencodec.py.
|
||||
|
||||
"""#"
|
||||
|
||||
@@ -9,13 +9,19 @@ import codecs
|
||||
class Codec(codecs.Codec):
|
||||
|
||||
def encode(self,input,errors='strict'):
|
||||
|
||||
return codecs.charmap_encode(input,errors,encoding_map)
|
||||
|
||||
def decode(self,input,errors='strict'):
|
||||
|
||||
return codecs.charmap_decode(input,errors,decoding_table)
|
||||
|
||||
class IncrementalEncoder(codecs.IncrementalEncoder):
|
||||
def encode(self, input, final=False):
|
||||
return codecs.charmap_encode(input,self.errors,encoding_map)[0]
|
||||
|
||||
class IncrementalDecoder(codecs.IncrementalDecoder):
|
||||
def decode(self, input, final=False):
|
||||
return codecs.charmap_decode(input,self.errors,decoding_table)[0]
|
||||
|
||||
class StreamWriter(Codec,codecs.StreamWriter):
|
||||
pass
|
||||
|
||||
@@ -25,8 +31,15 @@ class StreamReader(Codec,codecs.StreamReader):
|
||||
### encodings module API
|
||||
|
||||
def getregentry():
|
||||
|
||||
return (Codec().encode,Codec().decode,StreamReader,StreamWriter)
|
||||
return codecs.CodecInfo(
|
||||
name='cp1006',
|
||||
encode=Codec().encode,
|
||||
decode=Codec().decode,
|
||||
incrementalencoder=IncrementalEncoder,
|
||||
incrementaldecoder=IncrementalDecoder,
|
||||
streamreader=StreamReader,
|
||||
streamwriter=StreamWriter,
|
||||
)
|
||||
|
||||
|
||||
### Decoding Table
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
""" Python Character Mapping Codec generated from 'MAPPINGS/VENDORS/MICSFT/EBCDIC/CP1026.TXT' with gencodec.py.
|
||||
""" Python Character Mapping Codec cp1026 generated from 'MAPPINGS/VENDORS/MICSFT/EBCDIC/CP1026.TXT' with gencodec.py.
|
||||
|
||||
"""#"
|
||||
|
||||
@@ -9,13 +9,19 @@ import codecs
|
||||
class Codec(codecs.Codec):
|
||||
|
||||
def encode(self,input,errors='strict'):
|
||||
|
||||
return codecs.charmap_encode(input,errors,encoding_map)
|
||||
|
||||
def decode(self,input,errors='strict'):
|
||||
|
||||
return codecs.charmap_decode(input,errors,decoding_table)
|
||||
|
||||
class IncrementalEncoder(codecs.IncrementalEncoder):
|
||||
def encode(self, input, final=False):
|
||||
return codecs.charmap_encode(input,self.errors,encoding_map)[0]
|
||||
|
||||
class IncrementalDecoder(codecs.IncrementalDecoder):
|
||||
def decode(self, input, final=False):
|
||||
return codecs.charmap_decode(input,self.errors,decoding_table)[0]
|
||||
|
||||
class StreamWriter(Codec,codecs.StreamWriter):
|
||||
pass
|
||||
|
||||
@@ -25,8 +31,15 @@ class StreamReader(Codec,codecs.StreamReader):
|
||||
### encodings module API
|
||||
|
||||
def getregentry():
|
||||
|
||||
return (Codec().encode,Codec().decode,StreamReader,StreamWriter)
|
||||
return codecs.CodecInfo(
|
||||
name='cp1026',
|
||||
encode=Codec().encode,
|
||||
decode=Codec().decode,
|
||||
incrementalencoder=IncrementalEncoder,
|
||||
incrementaldecoder=IncrementalDecoder,
|
||||
streamreader=StreamReader,
|
||||
streamwriter=StreamWriter,
|
||||
)
|
||||
|
||||
|
||||
### Decoding Table
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
""" Python Character Mapping Codec generated from 'python-mappings/CP1140.TXT' with gencodec.py.
|
||||
""" Python Character Mapping Codec cp1140 generated from 'python-mappings/CP1140.TXT' with gencodec.py.
|
||||
|
||||
"""#"
|
||||
|
||||
@@ -9,13 +9,19 @@ import codecs
|
||||
class Codec(codecs.Codec):
|
||||
|
||||
def encode(self,input,errors='strict'):
|
||||
|
||||
return codecs.charmap_encode(input,errors,encoding_map)
|
||||
|
||||
def decode(self,input,errors='strict'):
|
||||
|
||||
return codecs.charmap_decode(input,errors,decoding_table)
|
||||
|
||||
class IncrementalEncoder(codecs.IncrementalEncoder):
|
||||
def encode(self, input, final=False):
|
||||
return codecs.charmap_encode(input,self.errors,encoding_map)[0]
|
||||
|
||||
class IncrementalDecoder(codecs.IncrementalDecoder):
|
||||
def decode(self, input, final=False):
|
||||
return codecs.charmap_decode(input,self.errors,decoding_table)[0]
|
||||
|
||||
class StreamWriter(Codec,codecs.StreamWriter):
|
||||
pass
|
||||
|
||||
@@ -25,8 +31,15 @@ class StreamReader(Codec,codecs.StreamReader):
|
||||
### encodings module API
|
||||
|
||||
def getregentry():
|
||||
|
||||
return (Codec().encode,Codec().decode,StreamReader,StreamWriter)
|
||||
return codecs.CodecInfo(
|
||||
name='cp1140',
|
||||
encode=Codec().encode,
|
||||
decode=Codec().decode,
|
||||
incrementalencoder=IncrementalEncoder,
|
||||
incrementaldecoder=IncrementalDecoder,
|
||||
streamreader=StreamReader,
|
||||
streamwriter=StreamWriter,
|
||||
)
|
||||
|
||||
|
||||
### Decoding Table
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
""" Python Character Mapping Codec generated from 'MAPPINGS/VENDORS/MICSFT/WINDOWS/CP1250.TXT' with gencodec.py.
|
||||
""" Python Character Mapping Codec cp1250 generated from 'MAPPINGS/VENDORS/MICSFT/WINDOWS/CP1250.TXT' with gencodec.py.
|
||||
|
||||
"""#"
|
||||
|
||||
@@ -9,13 +9,19 @@ import codecs
|
||||
class Codec(codecs.Codec):
|
||||
|
||||
def encode(self,input,errors='strict'):
|
||||
|
||||
return codecs.charmap_encode(input,errors,encoding_map)
|
||||
|
||||
def decode(self,input,errors='strict'):
|
||||
|
||||
return codecs.charmap_decode(input,errors,decoding_table)
|
||||
|
||||
class IncrementalEncoder(codecs.IncrementalEncoder):
|
||||
def encode(self, input, final=False):
|
||||
return codecs.charmap_encode(input,self.errors,encoding_map)[0]
|
||||
|
||||
class IncrementalDecoder(codecs.IncrementalDecoder):
|
||||
def decode(self, input, final=False):
|
||||
return codecs.charmap_decode(input,self.errors,decoding_table)[0]
|
||||
|
||||
class StreamWriter(Codec,codecs.StreamWriter):
|
||||
pass
|
||||
|
||||
@@ -25,8 +31,15 @@ class StreamReader(Codec,codecs.StreamReader):
|
||||
### encodings module API
|
||||
|
||||
def getregentry():
|
||||
|
||||
return (Codec().encode,Codec().decode,StreamReader,StreamWriter)
|
||||
return codecs.CodecInfo(
|
||||
name='cp1250',
|
||||
encode=Codec().encode,
|
||||
decode=Codec().decode,
|
||||
incrementalencoder=IncrementalEncoder,
|
||||
incrementaldecoder=IncrementalDecoder,
|
||||
streamreader=StreamReader,
|
||||
streamwriter=StreamWriter,
|
||||
)
|
||||
|
||||
|
||||
### Decoding Table
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
""" Python Character Mapping Codec generated from 'MAPPINGS/VENDORS/MICSFT/WINDOWS/CP1251.TXT' with gencodec.py.
|
||||
""" Python Character Mapping Codec cp1251 generated from 'MAPPINGS/VENDORS/MICSFT/WINDOWS/CP1251.TXT' with gencodec.py.
|
||||
|
||||
"""#"
|
||||
|
||||
@@ -9,13 +9,19 @@ import codecs
|
||||
class Codec(codecs.Codec):
|
||||
|
||||
def encode(self,input,errors='strict'):
|
||||
|
||||
return codecs.charmap_encode(input,errors,encoding_map)
|
||||
|
||||
def decode(self,input,errors='strict'):
|
||||
|
||||
return codecs.charmap_decode(input,errors,decoding_table)
|
||||
|
||||
class IncrementalEncoder(codecs.IncrementalEncoder):
|
||||
def encode(self, input, final=False):
|
||||
return codecs.charmap_encode(input,self.errors,encoding_map)[0]
|
||||
|
||||
class IncrementalDecoder(codecs.IncrementalDecoder):
|
||||
def decode(self, input, final=False):
|
||||
return codecs.charmap_decode(input,self.errors,decoding_table)[0]
|
||||
|
||||
class StreamWriter(Codec,codecs.StreamWriter):
|
||||
pass
|
||||
|
||||
@@ -25,8 +31,15 @@ class StreamReader(Codec,codecs.StreamReader):
|
||||
### encodings module API
|
||||
|
||||
def getregentry():
|
||||
|
||||
return (Codec().encode,Codec().decode,StreamReader,StreamWriter)
|
||||
return codecs.CodecInfo(
|
||||
name='cp1251',
|
||||
encode=Codec().encode,
|
||||
decode=Codec().decode,
|
||||
incrementalencoder=IncrementalEncoder,
|
||||
incrementaldecoder=IncrementalDecoder,
|
||||
streamreader=StreamReader,
|
||||
streamwriter=StreamWriter,
|
||||
)
|
||||
|
||||
|
||||
### Decoding Table
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
""" Python Character Mapping Codec generated from 'MAPPINGS/VENDORS/MICSFT/WINDOWS/CP1252.TXT' with gencodec.py.
|
||||
""" Python Character Mapping Codec cp1252 generated from 'MAPPINGS/VENDORS/MICSFT/WINDOWS/CP1252.TXT' with gencodec.py.
|
||||
|
||||
"""#"
|
||||
|
||||
@@ -9,13 +9,19 @@ import codecs
|
||||
class Codec(codecs.Codec):
|
||||
|
||||
def encode(self,input,errors='strict'):
|
||||
|
||||
return codecs.charmap_encode(input,errors,encoding_map)
|
||||
|
||||
def decode(self,input,errors='strict'):
|
||||
|
||||
return codecs.charmap_decode(input,errors,decoding_table)
|
||||
|
||||
class IncrementalEncoder(codecs.IncrementalEncoder):
|
||||
def encode(self, input, final=False):
|
||||
return codecs.charmap_encode(input,self.errors,encoding_map)[0]
|
||||
|
||||
class IncrementalDecoder(codecs.IncrementalDecoder):
|
||||
def decode(self, input, final=False):
|
||||
return codecs.charmap_decode(input,self.errors,decoding_table)[0]
|
||||
|
||||
class StreamWriter(Codec,codecs.StreamWriter):
|
||||
pass
|
||||
|
||||
@@ -25,8 +31,15 @@ class StreamReader(Codec,codecs.StreamReader):
|
||||
### encodings module API
|
||||
|
||||
def getregentry():
|
||||
|
||||
return (Codec().encode,Codec().decode,StreamReader,StreamWriter)
|
||||
return codecs.CodecInfo(
|
||||
name='cp1252',
|
||||
encode=Codec().encode,
|
||||
decode=Codec().decode,
|
||||
incrementalencoder=IncrementalEncoder,
|
||||
incrementaldecoder=IncrementalDecoder,
|
||||
streamreader=StreamReader,
|
||||
streamwriter=StreamWriter,
|
||||
)
|
||||
|
||||
|
||||
### Decoding Table
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
""" Python Character Mapping Codec generated from 'MAPPINGS/VENDORS/MICSFT/WINDOWS/CP1253.TXT' with gencodec.py.
|
||||
""" Python Character Mapping Codec cp1253 generated from 'MAPPINGS/VENDORS/MICSFT/WINDOWS/CP1253.TXT' with gencodec.py.
|
||||
|
||||
"""#"
|
||||
|
||||
@@ -9,13 +9,19 @@ import codecs
|
||||
class Codec(codecs.Codec):
|
||||
|
||||
def encode(self,input,errors='strict'):
|
||||
|
||||
return codecs.charmap_encode(input,errors,encoding_map)
|
||||
|
||||
def decode(self,input,errors='strict'):
|
||||
|
||||
return codecs.charmap_decode(input,errors,decoding_table)
|
||||
|
||||
class IncrementalEncoder(codecs.IncrementalEncoder):
|
||||
def encode(self, input, final=False):
|
||||
return codecs.charmap_encode(input,self.errors,encoding_map)[0]
|
||||
|
||||
class IncrementalDecoder(codecs.IncrementalDecoder):
|
||||
def decode(self, input, final=False):
|
||||
return codecs.charmap_decode(input,self.errors,decoding_table)[0]
|
||||
|
||||
class StreamWriter(Codec,codecs.StreamWriter):
|
||||
pass
|
||||
|
||||
@@ -25,8 +31,15 @@ class StreamReader(Codec,codecs.StreamReader):
|
||||
### encodings module API
|
||||
|
||||
def getregentry():
|
||||
|
||||
return (Codec().encode,Codec().decode,StreamReader,StreamWriter)
|
||||
return codecs.CodecInfo(
|
||||
name='cp1253',
|
||||
encode=Codec().encode,
|
||||
decode=Codec().decode,
|
||||
incrementalencoder=IncrementalEncoder,
|
||||
incrementaldecoder=IncrementalDecoder,
|
||||
streamreader=StreamReader,
|
||||
streamwriter=StreamWriter,
|
||||
)
|
||||
|
||||
|
||||
### Decoding Table
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
""" Python Character Mapping Codec generated from 'MAPPINGS/VENDORS/MICSFT/WINDOWS/CP1254.TXT' with gencodec.py.
|
||||
""" Python Character Mapping Codec cp1254 generated from 'MAPPINGS/VENDORS/MICSFT/WINDOWS/CP1254.TXT' with gencodec.py.
|
||||
|
||||
"""#"
|
||||
|
||||
@@ -9,13 +9,19 @@ import codecs
|
||||
class Codec(codecs.Codec):
|
||||
|
||||
def encode(self,input,errors='strict'):
|
||||
|
||||
return codecs.charmap_encode(input,errors,encoding_map)
|
||||
|
||||
def decode(self,input,errors='strict'):
|
||||
|
||||
return codecs.charmap_decode(input,errors,decoding_table)
|
||||
|
||||
class IncrementalEncoder(codecs.IncrementalEncoder):
|
||||
def encode(self, input, final=False):
|
||||
return codecs.charmap_encode(input,self.errors,encoding_map)[0]
|
||||
|
||||
class IncrementalDecoder(codecs.IncrementalDecoder):
|
||||
def decode(self, input, final=False):
|
||||
return codecs.charmap_decode(input,self.errors,decoding_table)[0]
|
||||
|
||||
class StreamWriter(Codec,codecs.StreamWriter):
|
||||
pass
|
||||
|
||||
@@ -25,8 +31,15 @@ class StreamReader(Codec,codecs.StreamReader):
|
||||
### encodings module API
|
||||
|
||||
def getregentry():
|
||||
|
||||
return (Codec().encode,Codec().decode,StreamReader,StreamWriter)
|
||||
return codecs.CodecInfo(
|
||||
name='cp1254',
|
||||
encode=Codec().encode,
|
||||
decode=Codec().decode,
|
||||
incrementalencoder=IncrementalEncoder,
|
||||
incrementaldecoder=IncrementalDecoder,
|
||||
streamreader=StreamReader,
|
||||
streamwriter=StreamWriter,
|
||||
)
|
||||
|
||||
|
||||
### Decoding Table
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
""" Python Character Mapping Codec generated from 'MAPPINGS/VENDORS/MICSFT/WINDOWS/CP1255.TXT' with gencodec.py.
|
||||
""" Python Character Mapping Codec cp1255 generated from 'MAPPINGS/VENDORS/MICSFT/WINDOWS/CP1255.TXT' with gencodec.py.
|
||||
|
||||
"""#"
|
||||
|
||||
@@ -9,13 +9,19 @@ import codecs
|
||||
class Codec(codecs.Codec):
|
||||
|
||||
def encode(self,input,errors='strict'):
|
||||
|
||||
return codecs.charmap_encode(input,errors,encoding_map)
|
||||
|
||||
def decode(self,input,errors='strict'):
|
||||
|
||||
return codecs.charmap_decode(input,errors,decoding_table)
|
||||
|
||||
class IncrementalEncoder(codecs.IncrementalEncoder):
|
||||
def encode(self, input, final=False):
|
||||
return codecs.charmap_encode(input,self.errors,encoding_map)[0]
|
||||
|
||||
class IncrementalDecoder(codecs.IncrementalDecoder):
|
||||
def decode(self, input, final=False):
|
||||
return codecs.charmap_decode(input,self.errors,decoding_table)[0]
|
||||
|
||||
class StreamWriter(Codec,codecs.StreamWriter):
|
||||
pass
|
||||
|
||||
@@ -25,8 +31,15 @@ class StreamReader(Codec,codecs.StreamReader):
|
||||
### encodings module API
|
||||
|
||||
def getregentry():
|
||||
|
||||
return (Codec().encode,Codec().decode,StreamReader,StreamWriter)
|
||||
return codecs.CodecInfo(
|
||||
name='cp1255',
|
||||
encode=Codec().encode,
|
||||
decode=Codec().decode,
|
||||
incrementalencoder=IncrementalEncoder,
|
||||
incrementaldecoder=IncrementalDecoder,
|
||||
streamreader=StreamReader,
|
||||
streamwriter=StreamWriter,
|
||||
)
|
||||
|
||||
|
||||
### Decoding Table
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user