(self, isHex)
return char
This function returns either U+FFFD or the character based on the
        decimal or hexadecimal representation. It also discards ";" if present.
        If not present self.tokenQueue.append({"type": tokenTypes["ParseError"]}) is invoked.
This function returns either U+FFFD or the character based on the
        decimal or hexadecimal representation. It also discards ";" if present.
        If not present self.tokenQueue.append({"type": tokenTypes["ParseError"]}) is invoked.
This function returns either U + FFFD or the character based on the decimal or hexadecimal representation . It also discards ; if present . If not present self . tokenQueue . append ( { type : tokenTypes [ ParseError ] } ) is invoked .
def consumeNumberEntity(self, isHex):
        """This function returns either U+FFFD or the character based on the
        decimal or hexadecimal representation. It also discards ";" if present.
        If not present self.tokenQueue.append({"type": tokenTypes["ParseError"]}) is invoked.
        """

        allowed = digits
        radix = 10
        if isHex:
            allowed = hexDigits
            radix = 16

        charStack = []

        # Consume all the characters that are in range while making sure we
        # don't hit an EOF.
        c = self.stream.char()
        while c in allowed and c is not EOF:
            charStack.append(c)
            c = self.stream.char()

        # Convert the set of characters consumed to an int.
        charAsInt = int("".join(charStack), radix)

        # Certain characters get replaced with others
        if charAsInt in replacementCharacters:
            char = replacementCharacters[charAsInt]
            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
                                    "illegal-codepoint-for-numeric-entity",
                                    "datavars": {"charAsInt": charAsInt}})
        elif ((0xD800 <= charAsInt <= 0xDFFF) or
              (charAsInt > 0x10FFFF)):
            char = "\uFFFD"
            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
                                    "illegal-codepoint-for-numeric-entity",
                                    "datavars": {"charAsInt": charAsInt}})
        else:
            # Should speed up this check somehow (e.g. move the set to a constant)
            if ((0x0001 <= charAsInt <= 0x0008) or
                (0x000E <= charAsInt <= 0x001F) or
                (0x007F <= charAsInt <= 0x009F) or
                (0xFDD0 <= charAsInt <= 0xFDEF) or
                charAsInt in frozenset([0x000B, 0xFFFE, 0xFFFF, 0x1FFFE,
                                        0x1FFFF, 0x2FFFE, 0x2FFFF, 0x3FFFE,
                                        0x3FFFF, 0x4FFFE, 0x4FFFF, 0x5FFFE,
                                        0x5FFFF, 0x6FFFE, 0x6FFFF, 0x7FFFE,
                                        0x7FFFF, 0x8FFFE, 0x8FFFF, 0x9FFFE,
                                        0x9FFFF, 0xAFFFE, 0xAFFFF, 0xBFFFE,
                                        0xBFFFF, 0xCFFFE, 0xCFFFF, 0xDFFFE,
                                        0xDFFFF, 0xEFFFE, 0xEFFFF, 0xFFFFE,
                                        0xFFFFF, 0x10FFFE, 0x10FFFF])):
                self.tokenQueue.append({"type": tokenTypes["ParseError"],
                                        "data":
                                        "illegal-codepoint-for-numeric-entity",
                                        "datavars": {"charAsInt": charAsInt}})
            try:
                # Try/except needed as UCS-2 Python builds' unichar only works
                # within the BMP.
                char = chr(charAsInt)
            except ValueError:
                v = charAsInt - 0x10000
                char = chr(0xD800 | (v >> 10)) + chr(0xDC00 | (v & 0x3FF))

        # Discard the ; if present. Otherwise, put it back on the queue and
        # invoke parseError on parser.
        if c != ";":
            self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
                                    "numeric-entity-without-semicolon"})
            self.stream.unget(c)

        return char
def consumeNumberEntity ( self , isHex ) : allowed = digits radix = 10 if isHex : allowed = hexDigits radix = 16 charStack = [ ] # Consume all the characters that are in range while making sure we # don't hit an EOF. c = self . stream . char ( ) while c in allowed and c is not EOF : charStack . append ( c ) c = self . stream . char ( ) # Convert the set of characters consumed to an int. charAsInt = int ( "" . join ( charStack ) , radix ) # Certain characters get replaced with others if charAsInt in replacementCharacters : char = replacementCharacters [ charAsInt ] self . tokenQueue . append ( { "type" : tokenTypes [ "ParseError" ] , "data" : "illegal-codepoint-for-numeric-entity" , "datavars" : { "charAsInt" : charAsInt } } ) elif ( ( 0xD800 <= charAsInt <= 0xDFFF ) or ( charAsInt > 0x10FFFF ) ) : char = "\uFFFD" self . tokenQueue . append ( { "type" : tokenTypes [ "ParseError" ] , "data" : "illegal-codepoint-for-numeric-entity" , "datavars" : { "charAsInt" : charAsInt } } ) else : # Should speed up this check somehow (e.g. move the set to a constant) if ( ( 0x0001 <= charAsInt <= 0x0008 ) or ( 0x000E <= charAsInt <= 0x001F ) or ( 0x007F <= charAsInt <= 0x009F ) or ( 0xFDD0 <= charAsInt <= 0xFDEF ) or charAsInt in frozenset ( [ 0x000B , 0xFFFE , 0xFFFF , 0x1FFFE , 0x1FFFF , 0x2FFFE , 0x2FFFF , 0x3FFFE , 0x3FFFF , 0x4FFFE , 0x4FFFF , 0x5FFFE , 0x5FFFF , 0x6FFFE , 0x6FFFF , 0x7FFFE , 0x7FFFF , 0x8FFFE , 0x8FFFF , 0x9FFFE , 0x9FFFF , 0xAFFFE , 0xAFFFF , 0xBFFFE , 0xBFFFF , 0xCFFFE , 0xCFFFF , 0xDFFFE , 0xDFFFF , 0xEFFFE , 0xEFFFF , 0xFFFFE , 0xFFFFF , 0x10FFFE , 0x10FFFF ] ) ) : self . tokenQueue . append ( { "type" : tokenTypes [ "ParseError" ] , "data" : "illegal-codepoint-for-numeric-entity" , "datavars" : { "charAsInt" : charAsInt } } ) try : # Try/except needed as UCS-2 Python builds' unichar only works # within the BMP. char = chr ( charAsInt ) except ValueError : v = charAsInt - 0x10000 char = chr ( 0xD800 | ( v >> 10 ) ) + chr ( 0xDC00 | ( v & 0x3FF ) ) # Discard the ; if present. Otherwise, put it back on the queue and # invoke parseError on parser. if c != ";" : self . tokenQueue . append ( { "type" : tokenTypes [ "ParseError" ] , "data" : "numeric-entity-without-semicolon" } ) self . stream . unget ( c ) return char