def to_stroke_collection(self, dictionary, silent=True): """ @type dictionary: L{CharacterStrokeDictionary """ strokecol = CharacterCollection() for char in self.get_all_characters_gen(): stroke_labels = dictionary.get_strokes(char.get_unicode())[0] strokes = char.get_writing().get_strokes(full=True) if len(strokes) != len(stroke_labels): if silent: continue else: raise ValueError, "The number of strokes doesn't " \ "match with reference character" for stroke, label in zip(strokes, stroke_labels): utf8 = label.encode("utf-8") strokecol.add_set(utf8) writing = Writing() writing.append_stroke(stroke) writing.normalize_position() schar = Character() schar.set_utf8(utf8) schar.set_writing(writing) strokecol.append_character(utf8, schar) return strokecol
class KVGXmlDictionaryReader(_XmlBase): def __init__(self): self._charcol = CharacterCollection() def get_character_collection(self): return self._charcol def _start_element(self, name, attrs): self._tag = name if self._first_tag: self._first_tag = False if self._tag != "kanjis": raise ValueError, "The very first tag should be <kanjis>" if self._tag == "kanji": self._writing = Writing() self._utf8 = attrs["midashi"].encode("UTF-8") if self._tag == "stroke": self._stroke = Stroke() if attrs.has_key("path"): self._stroke_svg = attrs["path"].encode("UTF-8") try: svg_parser = SVG_Parser(self._stroke_svg) svg_parser.parse() self._stroke.append_points(svg_parser.get_points()) except: sys.stderr.write("Something went wrong in this character: " + self._utf8 + "\n") else: print "Missing path in <stroke> element: " + self._utf8 def _end_element(self, name): if name == "kanji": char = Character() char.set_utf8(self._utf8) char.set_writing(self._writing) self._charcol.add_set(self._utf8) self._charcol.append_character(self._utf8, char) for s in ["_tag", "_stroke"]: if s in self.__dict__: del self.__dict__[s] if name == "stroke": self._writing.append_stroke(self._stroke) self._stroke = None self._tag = None def _char_data(self, data): if self._tag == "utf8": self._utf8 = data.encode("UTF-8") elif self._tag == "width": self._writing.set_width(int(data)) elif self._tag == "height": self._writing.set_height(int(data))
class KVGXmlDictionaryReader(_XmlBase): def __init__(self): self._charcol = CharacterCollection() def get_character_collection(self): return self._charcol def _start_element(self, name, attrs): self._tag = name if self._first_tag: self._first_tag = False if self._tag != "kanjivg": raise ValueError, "The very first tag should be <kanjivg>" if self._tag == "kanji": self._writing = Writing() self._utf8 = unichr(int(attrs["id"].split('_')[1], 16)).encode("UTF-8") if self._tag == "path": self._stroke = Stroke() if attrs.has_key("d"): self._stroke_svg = attrs["d"].encode("UTF-8") svg_parser = SVG_Parser(self._stroke_svg) svg_parser.parse() self._stroke.append_points(svg_parser.get_points()) else: sys.stderr.write("Missing data in <path> element: " + self._utf8 + "\n") def _end_element(self, name): if name == "kanji": char = Character() char.set_utf8(self._utf8) char.set_writing(self._writing) self._charcol.add_set(self._utf8) self._charcol.append_character(self._utf8, char) for s in ["_tag", "_stroke"]: if s in self.__dict__: del self.__dict__[s] if name == "path": self._writing.append_stroke(self._stroke) self._stroke = None self._tag = None def _char_data(self, data): if self._tag == "utf8": self._utf8 = data.encode("UTF-8") elif self._tag == "width": self._writing.set_width(int(data)) elif self._tag == "height": self._writing.set_height(int(data))
class KVGXmlDictionaryReader(_XmlBase): def __init__(self): self._charcol = CharacterCollection() def get_character_collection(self): return self._charcol def _start_element(self, name, attrs): self._tag = name if self._first_tag: self._first_tag = False if self._tag != "kanjivg": raise ValueError, "The very first tag should be <kanjivg>" if self._tag == "kanji": self._writing = Writing() self._utf8 = unichr(int(attrs["id"].split("_")[1], 16)).encode("UTF-8") if self._tag == "path": self._stroke = Stroke() if attrs.has_key("d"): self._stroke_svg = attrs["d"].encode("UTF-8") svg_parser = SVG_Parser(self._stroke_svg) svg_parser.parse() self._stroke.append_points(svg_parser.get_points()) else: sys.stderr.write("Missing data in <path> element: " + self._utf8 + "\n") def _end_element(self, name): if name == "kanji": char = Character() char.set_utf8(self._utf8) char.set_writing(self._writing) self._charcol.add_set(self._utf8) self._charcol.append_character(self._utf8, char) for s in ["_tag", "_stroke"]: if s in self.__dict__: del self.__dict__[s] if name == "path": self._writing.append_stroke(self._stroke) self._stroke = None self._tag = None def _char_data(self, data): if self._tag == "utf8": self._utf8 = data.encode("UTF-8") elif self._tag == "width": self._writing.set_width(int(data)) elif self._tag == "height": self._writing.set_height(int(data))
def testWritingEqualityNone(self): s1 = Stroke() s1.append_point(Point(x=2, y=3)) s1.append_point(Point(x=3, y=4)) s2 = Stroke() s2.append_point(Point(x=2, y=3)) s2.append_point(Point(x=3, y=4)) w1 = Writing() w1.append_stroke(s1) w1.append_stroke(s2) self.assertTrue(w1 != None) self.assertFalse(w1 == None)
def testWritingCopy(self): s1 = Stroke() s1.append_point(Point(x=2, y=3)) s1.append_point(Point(x=3, y=4)) s2 = Stroke() s2.append_point(Point(x=2, y=3)) s2.append_point(Point(x=3, y=4)) w1 = Writing() w1.append_stroke(s1) w1.append_stroke(s2) w2 = w1.copy() self.assertTrue(w1 == w2)
def testRemoveStroke(self): s1 = Stroke() s1.append_point(Point(x=2, y=3)) s1.append_point(Point(x=3, y=4)) s2 = Stroke() s2.append_point(Point(x=2, y=3)) s2.append_point(Point(x=3, y=4)) w = Writing() w.append_stroke(s1) w.append_stroke(s2) w.remove_stroke(1) self.assertEquals(w.get_strokes(), [[(2, 3), (3, 4)]])
def testRemoveStroke(self): s1 = Stroke() s1.append_point(Point(x=2, y=3)) s1.append_point(Point(x=3, y=4)) s2 = Stroke() s2.append_point(Point(x=2, y=3)) s2.append_point(Point(x=3, y=4)) w = Writing() w.append_stroke(s1) w.append_stroke(s2) w.remove_stroke(1) self.assertEquals(w.get_strokes(), [[(2,3),(3,4)]])
def testReplaceStroke(self): s1 = Stroke() s1.append_point(Point(x=2, y=3)) s1.append_point(Point(x=3, y=4)) s2 = Stroke() s2.append_point(Point(x=2, y=3)) s2.append_point(Point(x=3, y=4)) w = Writing() w.append_stroke(s1) w.append_stroke(s2) s3 = Stroke() s3.append_point(Point(x=22, y=33)) s3.append_point(Point(x=33, y=44)) w.replace_stroke(1, s3) self.assertEquals(w.get_strokes(), [[(2,3),(3,4)],[(22,33),(33,44)]])
def _getWriting(self): point = Point() point.x = 1 point.y = 2 point.timestamp = 3 point2 = Point() point2.x = 4 point2.y = 5 point2.pressure = 0.1 stroke = Stroke() stroke.append_point(point) stroke.append_point(point2) writing = Writing() writing.append_stroke(stroke) return writing
def testReplaceStroke(self): s1 = Stroke() s1.append_point(Point(x=2, y=3)) s1.append_point(Point(x=3, y=4)) s2 = Stroke() s2.append_point(Point(x=2, y=3)) s2.append_point(Point(x=3, y=4)) w = Writing() w.append_stroke(s1) w.append_stroke(s2) s3 = Stroke() s3.append_point(Point(x=22, y=33)) s3.append_point(Point(x=33, y=44)) w.replace_stroke(1, s3) self.assertEquals(w.get_strokes(), [[(2, 3), (3, 4)], [(22, 33), (33, 44)]])
def testDuration(self): point = Point() point.x = 1 point.y = 2 point.timestamp = 0 point2 = Point() point2.x = 4 point2.y = 5 point2.timestamp = 5 stroke = Stroke() stroke.append_point(point) stroke.append_point(point2) point3 = Point() point3.x = 1 point3.y = 2 point3.timestamp = 7 point4 = Point() point4.x = 4 point4.y = 5 point4.timestamp = 10 stroke2 = Stroke() stroke2.append_point(point3) stroke2.append_point(point4) self.assertEquals(stroke2.get_duration(), 3) writing = Writing() writing.append_stroke(stroke) writing.append_stroke(stroke2) self.assertEquals(writing.get_duration(), 10)
def get_character_collection(self): charcol = CharacterCollection() # group characters with the same label into sets sets = {} for i in range(len(self._labels)): # Create Character writing = Writing() if self.height and self.width: writing.set_height(self.height) writing.set_width(self.width) for delin_range in self._delineations[i]: if delin_range.start_comp == (delin_range.end_comp - 1): stroke_points = self._strokes[delin_range.start_comp][delin_range.start_point:delin_range.end_point] writing.append_stroke(Stroke.from_list(stroke_points)) else: # add first stroke to writing start_stroke_points = self._strokes[delin_range.start_comp][delin_range.start_point:-1] if len(start_stroke_points) > 0: writing.append_stroke(Stroke.from_list(start_stroke_points)) # add last stroke to writing end_stroke_points = self._strokes[delin_range.end_comp - 1][0:delin_range.end_point] if len(end_stroke_points) > 0: writing.append_stroke(Stroke.from_list(end_stroke_points)) # add the remaining strokes to writing for stroke in self._strokes[delin_range.start_comp + 1:delin_range.end_comp - 1]: writing.append_stroke(stroke) character = Character() character.set_writing(writing) utf8 = self._labels[i] character.set_utf8(utf8) sets[utf8] = sets.get(utf8, []) + [character] charcol.add_sets(sets.keys()) for set_name, characters in sets.items(): charcol.append_characters(set_name, characters) return charcol
def testWritingEquality(self): s1 = Stroke() s1.append_point(Point(x=2, y=3)) s1.append_point(Point(x=3, y=4)) s2 = Stroke() s2.append_point(Point(x=2, y=3)) s2.append_point(Point(x=3, y=4)) w1 = Writing() w1.append_stroke(s1) w1.append_stroke(s2) s1 = Stroke() s1.append_point(Point(x=2, y=3)) s1.append_point(Point(x=3, y=4)) s2 = Stroke() s2.append_point(Point(x=2, y=3)) s2.append_point(Point(x=3, y=4)) w2 = Writing() w2.append_stroke(s1) w2.append_stroke(s2) s1 = Stroke() s1.append_point(Point(x=2, y=3)) s1.append_point(Point(x=3, y=4)) s2 = Stroke() s2.append_point(Point(x=2, y=3)) s2.append_point(Point(x=3, y=5)) w3 = Writing() w3.append_stroke(s1) w3.append_stroke(s2) self.assertEquals(w1, w2) self.assertNotEqual(w1, w3)
class TomoeXmlDictionaryReader(_XmlBase): def __init__(self): self._charcol = CharacterCollection() def get_character_collection(self): return self._charcol def _start_element(self, name, attrs): self._tag = name if self._first_tag: self._first_tag = False if self._tag != "dictionary": raise ValueError, "The very first tag should be <dictionary>" if self._tag == "character": self._writing = Writing() if self._tag == "stroke": self._stroke = Stroke() elif self._tag == "point": point = Point() for key in ("x", "y", "pressure", "xtilt", "ytilt", "timestamp"): if attrs.has_key(key): value = attrs[key].encode("UTF-8") if key in ("pressure", "xtilt", "ytilt"): value = float(value) else: value = int(float(value)) else: value = None setattr(point, key, value) self._stroke.append_point(point) def _end_element(self, name): if name == "character": char = Character() char.set_utf8(self._utf8) char.set_writing(self._writing) self._charcol.add_set(self._utf8) self._charcol.append_character(self._utf8, char) for s in ["_tag", "_stroke"]: if s in self.__dict__: del self.__dict__[s] if name == "stroke": self._writing.append_stroke(self._stroke) self._stroke = None self._tag = None def _char_data(self, data): if self._tag == "utf8": self._utf8 = data.encode("UTF-8") elif self._tag == "width": self._writing.set_width(int(data)) elif self._tag == "height": self._writing.set_height(int(data))