OSDN Git Service

update at 12/23/2018
[sawarabi-fonts/sawarabi-fonts.git] / chartool / pygtk / main.py
index 67af930..de2448b 100644 (file)
@@ -68,16 +68,21 @@ class Controller:
 class SearchAction:
     def __init__(self, entry_search):
         self.entry_search = entry_search
+        self.char_util = CharUtil()
         self.code = None
         self.char = ''
 
     def set_next(self):
         en = self.entry_search
         buf = en.get_text().decode('utf-8')
+        if len(buf) == 0: return
+
         pos = en.get_position()
         if pos == len(buf): pos = 0
-        en.select_region(pos, pos + 1)
-        ch = buf[pos:pos + 1]
+        region = self.char_util.get_target_region(buf, pos)
+        target = buf[region[0]:region[1]]
+        en.select_region(region[0], region[1])
+        ch = self.char_util.get_unichar(target)
 
         self.code = hex(ord(ch))
         self.char = ch
@@ -95,6 +100,35 @@ class SearchAction:
         label.set_markup(mu)
 
 
+class CharUtil:
+    def is_hex_char(self, char):
+        return (char >= '0' and char <= '9') or \
+            (char >= 'a' and char <= 'f') or \
+            (char >= 'A' and char <= 'F')
+
+    def get_unichar(self, buf):
+        if len(buf) <= 1: return buf
+
+        return unichr(int(buf, 16))
+
+    def get_target_region(self, text, pos):
+        ch = text[pos:pos + 1]
+        rlen = 0
+        llen = 0
+        while rlen <= 4 and self.is_hex_char(ch):
+            rlen += 1
+            if pos + rlen >= len(text): break
+            ch = text[(pos + rlen):(pos + rlen + 1)]
+        if rlen >= 1 and rlen < 5:
+            while rlen + llen <= 4 and pos - llen > 0:
+                ch = text[(pos - llen - 1):(pos - llen)]
+                if not self.is_hex_char(ch): break
+                llen += 1
+        ret = (pos - llen, pos + rlen)
+        if ret == (pos, pos): return (pos, pos + 1)
+        return ret
+
+
 if __name__ == '__main__':
     path = os.path.abspath(os.path.dirname(__file__))
     Controller(os.path.join(path, 'window_main.glade'))