コード例 #1
0
ファイル: check-strokes.py プロジェクト: yueqianzhang/cjklib
    def _checkStrokeOrderFromDecomposition(self, decomposition, index=0):
        """Goes through a decomposition"""
        if type(decomposition[index]) != type(()):
            # IDS operator
            character = decomposition[index]
            missingChars = []
            hasFullOrder = True
            if CharacterLookup.isBinaryIDSOperator(character):
                # check for IDS operators we can't make any order
                # assumption about
                if character not in self.ALLOWED_COMPONENT_STRUCTURE:
                    return False, index, []
                else:
                    # Get stroke order for both components
                    for _ in range(0, 2):
                        fullOrder, index, missing \
                            = self._checkStrokeOrderFromDecomposition(
                                decomposition, index+1)
                        if not fullOrder:
                            missingChars.extend(missing)

                        hasFullOrder = hasFullOrder and fullOrder

            elif CharacterLookup.isTrinaryIDSOperator(character):
                # Get stroke order for three components
                for _ in range(0, 3):
                    fullOrder, index, missing \
                        = self._checkStrokeOrderFromDecomposition(
                            decomposition, index+1)
                    if not fullOrder:
                        missingChars.extend(missing)

                    hasFullOrder = hasFullOrder and fullOrder
            else:
                assert False, 'not an IDS character'

            return hasFullOrder, index, missingChars
        else:
            # no IDS operator but character
            char, glyph = decomposition[index]
            # if the character is unknown or there is none raise
            if char == u'?':
                return False, index, []
            else:
                # recursion
                fullOrder, missingChars = self.checkStrokeOrder(char, glyph)
                if not fullOrder and not missingChars:
                    missingChars = [char]
                return fullOrder, index, missingChars

        assert False
コード例 #2
0
        def consumeComponent(decomposition):
            """
            Consumes a component on the top level, e.g. for 㐯, C{⿱⿱亠吕香}
            consumes C{⿱亠吕} when given the partial decomposition C{⿱亠吕香}.
            """
            if type(decomposition[0]) == type(()):
                # consume one component
                return decomposition[1:]

            if CharacterLookup.isBinaryIDSOperator(decomposition[0]):
                decomposition = consumeComponent(decomposition[1:])
                return consumeComponent(decomposition)
            elif CharacterLookup.isTrinaryIDSOperator(decomposition[0]):
                decomposition = consumeComponent(decomposition[1:])
                decomposition = consumeComponent(decomposition)
                return consumeComponent(decomposition)
コード例 #3
0
        def consumeComponent(decomposition):
            """
            Consumes a component on the top level, e.g. for 㐯, C{⿱⿱亠吕香}
            consumes C{⿱亠吕} when given the partial decomposition C{⿱亠吕香}.
            """
            if type(decomposition[0]) == type(()):
                # consume one component
                return decomposition[1:]

            if CharacterLookup.isBinaryIDSOperator(decomposition[0]):
                decomposition = consumeComponent(decomposition[1:])
                return consumeComponent(decomposition)
            elif CharacterLookup.isTrinaryIDSOperator(decomposition[0]):
                decomposition = consumeComponent(decomposition[1:])
                decomposition = consumeComponent(decomposition)
                return consumeComponent(decomposition)
コード例 #4
0
        def parseIDS(decomposition, index):
            if index >= len(decomposition):
                raise ValueError()

            if type(decomposition[index]) == type(()):
                # consume one component
                return index + 1

            if not CharacterLookup.isIDSOperator(decomposition[index]):
                # simple chars should be IDS operators
                raise ValueError()

            if CharacterLookup.isBinaryIDSOperator(decomposition[index]):
                index = index + 1
                index = parseIDS(decomposition, index)
                return parseIDS(decomposition, index)
            elif CharacterLookup.isTrinaryIDSOperator(decomposition[index]):
                index = index + 1
                index = parseIDS(decomposition, index)
                index = parseIDS(decomposition, index)
                return parseIDS(decomposition, index)
            else:
                raise ValueError()
コード例 #5
0
        def parseIDS(decomposition, index):
            if index >= len(decomposition):
                raise ValueError()

            if type(decomposition[index]) == type(()):
                # consume one component
                return index + 1

            if not CharacterLookup.isIDSOperator(decomposition[index]):
                # simple chars should be IDS operators
                raise ValueError()

            if CharacterLookup.isBinaryIDSOperator(decomposition[index]):
                index = index + 1
                index = parseIDS(decomposition, index)
                return parseIDS(decomposition, index)
            elif CharacterLookup.isTrinaryIDSOperator(decomposition[index]):
                index = index + 1
                index = parseIDS(decomposition, index)
                index = parseIDS(decomposition, index)
                return parseIDS(decomposition, index)
            else:
                raise ValueError()