From 1c20b8416dcd6971bf8bc85d0667521ab3c91ad1 Mon Sep 17 00:00:00 2001 From: Erickson Silva Date: Thu, 13 Oct 2016 18:03:21 -0300 Subject: [PATCH] [TranslationServer] Corrige trie --- src/TranslationServer.py | 15 ++++++++++----- src/Trie.py | 64 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 74 insertions(+), 5 deletions(-) mode change 100644 => 100755 src/TranslationServer.py create mode 100755 src/Trie.py diff --git a/src/TranslationServer.py b/src/TranslationServer.py old mode 100644 new mode 100755 index b0ec830..a04855a --- a/src/TranslationServer.py +++ b/src/TranslationServer.py @@ -16,6 +16,7 @@ RUN_MODE=None DICT_VERSION=None BUNDLES_PATH=None BUNDLES_LIST={} +TRIE=None conn=None lock = Lock() app=Flask(__name__, static_url_path="", static_folder="/var/www/") @@ -42,6 +43,7 @@ def dict_mode(): BUNDLES_PATH={"IOS":IOS_SIGNS_PATH, "ANDROID":ANDROID_SIGNS_PATH, "STANDALONE":STANDALONE_SIGNS_PATH, "WEBGL":WEBGL_SIGNS_PATH} check_version() list_bundles() + generate_trie() def connect_database(): import MySQLdb as mysql @@ -111,6 +113,11 @@ def list_files(path): files.append(fname) return files +def generate_trie(): + global TRIE + signs = list(BUNDLES_LIST["DEFAULT"]) + TRIE = json.dumps(Trie.gen(signs)) + def check_platform_files(): android = set(list_files(BUNDLES_PATH["ANDROID"])) ios = set(list_files(BUNDLES_PATH["IOS"])) @@ -267,7 +274,7 @@ def load_statistics_page(): return php_output @app.route("/update", methods=['GET']) -def update_list_bundles(): +def update(): try: password = request.args.get('password').encode('utf-8') except AttributeError: @@ -276,6 +283,7 @@ def update_list_bundles(): Popen('sudo -S <<< '+password+' apt-get update > /dev/null 2>&1', shell=True, stdin=None, stdout=None, stderr=None, executable="/bin/bash").wait() check_version() list_bundles() + generate_trie() return "Successfully updated list.", 200 @app.route("/version", methods=['GET']) @@ -284,10 +292,7 @@ def get_version(): @app.route("/signs", methods=['GET']) def get_signs_list(): - signs = list(BUNDLES_LIST["DEFAULT"]) - #return json.dumps(signs), 200 - trie = Trie.gen(signs) - return json.dumps(trie), 200 + return TRIE, 200 @app.route("//", methods=['GET']) @check_run_mode diff --git a/src/Trie.py b/src/Trie.py new file mode 100755 index 0000000..7704001 --- /dev/null +++ b/src/Trie.py @@ -0,0 +1,64 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- + + +class Node: + def __init__(self, end = False): + self.end = end + self.children = {} + +class Trie: + def __init__(self, characters): + self.characters = characters + self._parse_characters() + self.root = Node() + + def _parse_characters(self): + self.characters_keys = {} + for i in xrange(len(self.characters)): + self.characters_keys[self.characters[i]] = i + + def _key_of(self, item, i): + return self.characters_keys[item[i].encode('utf-8')] + + def _add(self, item): + node = self.root + item = list(item.decode('utf-8')) + for i in xrange(len(item)): + key = self._key_of(item, i) + if not node.children.has_key(key): + node.children[key] = Node() + node = node.children[key] + node.end = True + + def _to_json(self, node): + keys = []; + children = {} + for key, value in node.children.iteritems(): + keys.append(key) + children[key] = self._to_json(value) + keys.sort() + return { 'end': node.end, 'keys': keys, 'children': children } + + def add(self, data): + if type(data) is list: + for d in data: + if not d in ignore: + self._add(d) + else: + self._add(data) + + def to_json(self): + return self._to_json(self.root) + +chars = ["'", '$', ',', '_', '%', '-', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', + 'A', 'Á', 'Â', 'Ã', 'À', 'B', 'C', 'Ç', 'D', 'E', 'É', 'Ê', 'F', 'G', 'H', + 'I', 'Í', 'J', 'K', 'L', 'M', 'N', 'O', 'Ó', 'Ô', 'Õ', 'P', 'Q', 'R', 'S', + 'T', 'U', 'Ú', 'V', 'W', 'X', 'Y', 'Z'] + +ignore = ["[INTERROGAÇÃO]", "[EXCLAMAÇÃO]", "[PONTO]"] + +def gen(data): + trie = Trie(chars) + trie.add(data) + return { 'characters': chars, 'keys': trie.characters_keys, 'trie': trie.to_json() } \ No newline at end of file -- libgit2 0.21.2