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
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)
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()