コード例 #1
0
def main():

    # Number of files expected
    number_of_files = int(input("How many files are being input: "))

    # Makes the object
    ACP = AutocompleteProvider()

    for i in range(number_of_files):

        # This is the file given by the user it has the passages already written
        train_file = input(
            "Please enter the name of the file you want to use to train: ")

        # This is the string entered by the user who wants some suggestions
        word = input("Please enter a word: ")

        # trains on the target file
        ACP.train(train_file)

        # Finds possbile words, sorts them, then dumps them
        print("Here are some suggestions after one file")
        words = ACP.getWords(word)
        sorted_words = ACP.quicksort(words)
        ACP.dump(sorted_words)
コード例 #2
0
def main():

    # This is the file given by the user it has the passages already written
    train_file = input("Please enter the name of the file you want to use to train: ")

    # This is the string entered by the user who wants some suggestions
    word = input("Please enter a word: ")

    # Builds the object and trains on the target file
    ACP = AutocompleteProvider()
    ACP.train(train_file)

    # Finds possbile words, sorts them, then dumps them
    print("Here are some suggestions")
    words = ACP.getWords(word)
    sorted_words = ACP.quicksort(words)
    ACP.dump(sorted_words)
コード例 #3
0
input_entry.pack()

# entry widget for displaying candidates for sentence fragment
candidate_label = tk.Label()
candidate_label.pack()


# text widget and frame for passage submission
label_text = tk.Label(text="Enter training passages")
text_passages = tk.Text(height=6)
label_text.pack()
text_passages.pack()


# button widget for passage submission
btn_submit = tk.Button(text="Submit passage", command=submit_passage_command)
btn_submit.pack()

# message widget to display trained passages
label_trained_passages = tk.Label(text="Previously trained passages")
text_trained_passages = tk.Text(height=6)
label_trained_passages.pack()
text_trained_passages.pack()


# Whenever a key is pressed, the handle_keypress method is called
input_entry.bind("<Key>", handle_keypress)

auto_instance = AutocompleteProvider()
window.mainloop()
コード例 #4
0
 def get_completion_provider(self):
     if self.__completion_provider == None:
         self.__completion_provider = AutocompleteProvider()
         self.__completion_provider.set_plugin(self)
     return self.__completion_provider
コード例 #5
0
class AddiksPhpIndexView(GObject.Object, Gedit.ViewActivatable):
    view = GObject.property(type=Gedit.View)

    def __init__(self):
        GObject.Object.__init__(self)
        self.__completion_provider = None
        self.__phpfiles = {}
        self.__is_outline_active = False
        self._storage = None
        self._glade_builder = None
        self._glade_handler = None

    def do_activate(self):
        AddiksPhpIndexApp.get().register_view(self)

        completion = self.view.get_completion()
        provider = self.get_completion_provider()
        if provider not in completion.get_providers():
            completion.add_provider(provider)

        self.view.connect("move-cursor", self.on_textview_move_cursor)
        self.view.connect("button-press-event", self.on_textview_move_cursor)
#        self.view.connect("key-press-event", self.on_textview_move_cursor)

        document = self.view.get_buffer()
        document.connect("changed", self.__on_document_changed)
        document.connect("insert-text", self.__on_document_insert)
        document.connect("saved", self.__on_document_saved)

    def do_deactivate(self):
        AddiksPhpIndexApp.get().unregister_view(self)

    def do_update_state(self):
        pass

    def __on_document_insert(self, document, textIter, insertedText, length, userData=None):
        if document.get_location() != None and insertedText in ['\n', ';', '=', '}']:

            line = textIter.get_line()
            column = textIter.get_line_offset()
            lineBeginIter = document.get_iter_at_line_index(line, 0)

            codeLine = document.get_text(lineBeginIter, document.get_iter_at_line_index(line+1, 0), True)

            indention = ""
            while len(codeLine) > len(indention) and column > len(indention) and codeLine[len(indention)] in [" ", "\t", "*"]:
                indention += codeLine[len(indention)]

            if insertedText in [';', '=', '}']:
                code = document.get_text(document.get_start_iter(), document.get_end_iter(), True)
                analyzer = PhpFileAnalyzer(code, self, self.get_index_storage())
                tokens = analyzer.get_tokens()
                tokenIndex = analyzer.get_token_index_by_position(textIter.get_line()+1, textIter.get_line_offset()+1)
                isInMethod = analyzer.is_in_method(tokenIndex)

                if insertedText == ';' and tokenIndex != None:
                    # finished writing a statement?
                    declarationType, declaredName, className = analyzer.get_declaration_by_token_index(tokenIndex)

                    if declarationType == 'member' and tokens[tokenIndex][1] == declaredName and not isInMethod:
                        # finished a member, add a doc-comment for that
                        tokenIndexComment = analyzer.get_token_index_by_position(line+1, 0)
                        if tokens[tokenIndexComment][0] not in [T_COMMENT, T_DOC_COMMENT]:
                            commentCode  = indention + "/**\n"
                            commentCode += indention + " * @var mixed\n"
                            commentCode += indention + " */\n"
                            GLib.idle_add(self.do_textbuffer_insert, document, line, 0, commentCode)

                if insertedText == '=' and tokenIndex != None:
                    # writing a new variable?
                    if tokens[tokenIndex][0] == T_VARIABLE and tokens[tokenIndex-1][1] in [';', '{']:
                        methodBlock = analyzer.get_method_block_is_in(tokenIndex)
                        if methodBlock != None:
                            variableName = tokens[tokenIndex][1]

                            isFirstUsage = True
                            for token in tokens[methodBlock[0]:tokenIndex]:
                                if token[0] == T_VARIABLE and token[1] == variableName:
                                    isFirstUsage = False
                                    break

                            if isFirstUsage:
                                # added a new variable, add a doc-comment for that
                                commentCode = indention + "/* @var " + variableName + " mixed */\n"
                                GLib.idle_add(self.do_textbuffer_insert, document, line, 0, commentCode)

                if insertedText in [';', '}']:
                    # finished writing a method, class or function?
                    # print(code)
                    # TODO
                    pass

            if insertedText == '\n':
                # new line, add indention
                GLib.idle_add(self.do_textbuffer_insert, document, line+1, 0, indention)

            AddiksPhpIndexApp.get().update_info_window(self)

    def __on_document_changed(self, document, userData=None):
        # make sure the php-file-index gets updated when the text get changed
        if document.get_location() != None:
            AddiksPhpIndexApp.get().update_info_window(self)
            filepath = document.get_location().get_path()
            self.invalidate_php_fileindex(filepath)
        return False

    def do_textbuffer_insert(self, document, line, column, text):
        textIter = document.get_iter_at_line_index(line, column)
        document.insert(textIter, text)

    def __on_document_saved(self, document, userData=None):
        start_new_thread(self.__do_on_document_saved, (document, userData))

    def __do_on_document_saved(self, document, userData=None):
        if document.get_location() != None:
            filepath = document.get_location().get_path()
            indexFilepath = self.get_index_filepath()
            if indexFilepath != None:
                indexPathManager = self.get_index_path_manager()
                index = PhpIndex(indexFilepath, indexPathManager=indexPathManager)
                index.reindex_phpfile(filepath)

    def get_settings(self):
        return AddiksPhpIndexApp.get().get_settings()

    ### MENU ITEMS

    def on_index_paths_manager(self, action, data=None):
        if self.get_index_path_manager() != None:
            window = self.getGladeBuilder().get_object("windowIndexPathsManager")
            window.show_all()
        else:
            window = AddiksPhpIndexApp.get().get_window_by_view(self).window
            dialog = Gtk.MessageDialog(window, 0, Gtk.MessageType.ERROR, Gtk.ButtonsType.NONE, "Not a git project!")
            dialog.format_secondary_text("The index-include/-exclude path'scan only be configured for files in a git workspace.")
            dialog.run()

    def on_build_index(self, action, data=None):
        document = self.view.get_buffer()
        if document != None and document.get_location() != None:
            indexPath = self.get_index_filepath()
            gitPath   = self.get_git_directory()
            pathManager = self.get_index_path_manager()
            build_gtk(indexPath, gitPath, pathManager)

    def on_update_index(self, action, data=None):
        document = self.view.get_buffer()
        if document != None and document.get_location() != None:
            indexPath = self.get_index_filepath()
            gitPath   = self.get_git_directory()
            pathManager = self.get_index_path_manager()
            update_gtk(indexPath, gitPath, pathManager)

    def on_open_declaration_view(self, action, data=None):
        if not self.is_index_built():
            return self.on_index_not_build()
        line, column = self.get_current_cursor_position()
        if line != None and column != None:
            filePath, line, column = self.get_php_fileindex().get_declared_position_by_position(line, column)
            self.open_by_position(filePath, line, column)

    def on_search_index(self, action, data=None):
        if not self.is_index_built():
            return self.on_index_not_build()
        gladeBuilder = self.getGladeBuilder()
        window = gladeBuilder.get_object("windowSearchIndex")
        window.connect('delete-event', lambda w, e: w.hide() or True)
        window.show_all()

    def on_show_info_window(self, action, data=None):
        if not self.is_index_built():
            return self.on_index_not_build()
        AddiksPhpIndexApp.get().show_info_window(self)

    def on_textview_move_cursor(self, textView=None, step=None, count=None, extendSelection=None, userData=None):
        GLib.idle_add(AddiksPhpIndexApp.get().update_info_window, self)

    def on_open_type_view(self, action, data=None):
        if not self.is_index_built():
            return self.on_index_not_build()

        line, column = self.get_current_cursor_position()
        if line != None and column != None:
            declarationType, name, containingClassName = self.get_php_fileindex().get_declaration_by_position(line, column)
            namespace = self.get_php_fileindex().get_namespace()

            className = ""
            if declarationType == 'class':
                className = name

            elif containingClassName != None:
                className = containingClassName

            if len(className)>0:
                if className[0] != '\\':
                    className = namespace + '\\' + className

                hierarchy = self.get_class_hierarchy(className)
                if hierarchy != None:

                    # create treestore from hierarchy
                    treeStore = Gtk.TreeStore(str)
                    className = list(hierarchy)[0]
                    hierarchy = hierarchy[className]
                    self.__type_view_treestore_add_row(treeStore, None, className, hierarchy)

                    treeView = Gtk.TreeView(model=treeStore)
                    treeView.set_headers_visible(False)
                    treeView.append_column(Gtk.TreeViewColumn("class", Gtk.CellRendererText(), text=0))
                    treeView.expand_all()
                    treeView.connect("row-activated", self.__on_typeview_row_activated)

                    scrolledWindow = Gtk.ScrolledWindow()
                    scrolledWindow.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC)
                    scrolledWindow.add(treeView)

                    window = Gtk.Window(title="Typeview of "+className)
                    window.set_default_size(50, 250)
                    window.add(scrolledWindow)
                    window.show_all()

    def __on_typeview_row_activated(self, treeView, path, column, userData=None):
        storage = self.get_index_storage()
        treeStore = treeView.get_model()
        className, = treeStore.get(treeStore.get_iter(path), 0)
        namespace, className = get_namespace_by_classname(className)
        filePath, line, column = storage.get_class_position(namespace, className)
        self.open_by_position(filePath, line, column)

    def __type_view_treestore_add_row(self, treeStore, parentTreeIter, className, hierarchy):
        treeIter = treeStore.append(parentTreeIter, [className])
        for childClassName in hierarchy:
            self.__type_view_treestore_add_row(treeStore, treeIter, childClassName, hierarchy[childClassName])

    def on_toggle_outline(self, action, data=None):
        index = self.get_php_fileindex()
        document = self.view.get_buffer()
        if document != None and document.get_location() != None:
            beforeIter = document.get_iter_at_mark(document.get_insert())
            beforeMark = document.create_mark("outline-before", beforeIter, True)

            tagTable = document.get_tag_table()
            tag = tagTable.lookup("invisible")
            if tag == None:
                tag = document.create_tag('invisible', invisible=True)

            tokens = index.get_tokens()
            self.__is_outline_active = self.__is_outline_active == False
            if self.__is_outline_active:

                outlineLines = []
                for block in index.get_blocks():
                    if len(block)>3:
                        outlineLines.append(tokens[block[3]][2])
                        if block[2] == 'class':
                            for memberIndex in block[10]:
                                outlineLines.append(tokens[memberIndex][2])
                            for constIndex in block[11]:
                                outlineLines.append(tokens[constIndex][2])
                outlineLines = list(set(outlineLines))
                outlineLines.sort()
                outlineLines.append(0)

                beginIter = document.get_iter_at_mark(document.get_insert())
                beginIter.set_line_offset(0)
                endIter = beginIter.copy()
                endIter.set_line_offset(0)
                beforeLine = 0
                for line in outlineLines:
                    beginIter.set_line(beforeLine)
                    endIter.set_line(line-1)
                    beforeLine = line
                    document.apply_tag(tag, beginIter, endIter)
            else:
                beginIter = document.get_iter_at_mark(document.get_insert())
                beginIter.set_line(0)
                endIter = beginIter.copy()
                endIter.set_line(-1)
                document.remove_tag(tag, beginIter, endIter)

            self.view.scroll_to_mark(beforeMark, 0.0, True, 0.0, 0.0)

    def on_open_call_view(self, action, data=None):
        if not self.is_index_built():
            return self.on_index_not_build()

        line, column = self.get_current_cursor_position()
        if line != None and column != None:
            builder = self.getGladeBuilder()
            window = builder.get_object('windowCallers')
            window.connect('delete-event', lambda w, e: w.hide() or True)
            window.show_all()

            use_statements = self.get_php_fileindex().get_use_statements()
            declaredPositionExpected = self.get_php_fileindex().get_declared_position_by_position(line, column)
            declarationType, name, containingClassName = self.get_php_fileindex().get_declaration_by_position(line, column)
            namespace = self.get_php_fileindex().get_namespace()

            storage = self.get_index_storage()

            uses = None
            if declarationType == 'method':
                uses = storage.get_method_uses(name)

            elif declarationType == 'function':
                uses = storage.get_function_uses(name)

            elif declarationType == 'member':
                uses = storage.get_member_uses(name)

            elif declarationType == 'class':
                if name in use_statements:
                    name = use_statements[name]
                elif name[0] != '\\':
                    name = namespace + '\\' + name
                uses = storage.get_class_uses(name)

            elif declarationType == 'constant':
                uses = storage.get_constant_uses(name)

            else:
                return

            listStore = builder.get_object('liststoreCallers')

            filteredUses = {}
            for filePath, line, column, className, functionName in uses:
                phpFileIndex = self.get_php_fileindex(filePath)
                declaredPosition = phpFileIndex.get_declared_position_by_position(line, column+1)
                if declaredPosition[0] == None or declaredPosition == declaredPositionExpected:
                    filteredUses[filePath + ":" + str(line)] = [filePath, line, column, className, functionName]
            filteredUses = list(filteredUses.values())
            filteredUses.sort(key=self.__filteredUsesKey)

            listStore.clear()
            for filePath, line, column, className, functionName in filteredUses:
                preview = ""
                if os.path.exists(filePath):
                    with open(filePath, "r", encoding = "ISO-8859-1") as f:
                        code = f.read()
                    lines = code.split("\n")
                    preview = lines[line-1]
                rowIter = listStore.append()
                listStore.set_value(rowIter, 0, filePath)
                listStore.set_value(rowIter, 1, line)
                listStore.set_value(rowIter, 2, className)
                listStore.set_value(rowIter, 3, functionName)
                listStore.set_value(rowIter, 4, preview)

    def __filteredUsesKey(self, use):
        return use[3] + str(use[1]) + use[4]

    def on_export_to_graphml(self, action, data=None):
        if not self.is_index_built():
            return self.on_index_not_build()

        builder = self.getGladeBuilder()

        line, column = self.get_current_cursor_position()
        if line != None and column != None:
            use_statements = self.get_php_fileindex().get_use_statements()
            declarationType, name, containingClassName = self.get_php_fileindex().get_declaration_by_position(line, column)
            namespace = self.get_php_fileindex().get_namespace()

            if declarationType == 'class':
                className = name

                if className in use_statements:
                    className = use_statements[className]
                elif className[0] != '\\':
                    className = namespace + '\\' + className

                listStoreSelected = builder.get_object('liststoreExportGraphMLSelected')

                rowIterSelected = listStoreSelected.append()
                listStoreSelected.set_value(rowIterSelected, 0, className)

        window = builder.get_object('windowExportGraphML')
        window.connect('delete-event', lambda w, e: w.hide() or True)
        window.show_all()

    def open_by_position(self, filePath, line, column):
        GLib.idle_add(self.do_open_by_position, filePath, line, column)

    def do_open_by_position(self, filePath, line, column):
        if filePath != None:
            document = self.view.get_buffer()
            if filePath == os.path.abspath(document.get_location().get_path()):
                view = self.window.get_active_view()
                insertMark = document.get_insert()
                insertIter = document.get_iter_at_mark(insertMark)
                insertIter.set_line(line-1)
                insertIter.set_line_index(column-1)
                document.place_cursor(insertIter)
                view.scroll_to_iter(insertIter, 0.0, True, 0.0, 0.0)

            else:
                start_new_thread(subprocess.call, (['gedit', filePath, "+"+str(line)+":"+str(column)], ))

    def on_index_calls(self, current, count):
        print(current + "/" + count)

    def get_class_hierarchy(self, className):
        storage = self.get_index_storage()
        hierarchy = {className: self.get_class_children_recursive(className)}
        parentClass = className
        while True:
            namespace, parentClass = get_namespace_by_classname(parentClass)
            parentClass = storage.get_class_parent(namespace, parentClass)
            if parentClass != None:
                hierarchy = {parentClass: hierarchy}
            else:
                break
        return hierarchy

    def get_class_children_recursive(self, className):
        storage = self.get_index_storage()
        childHierarchy = {}
        for childClassName in storage.get_class_children(className):
            childHierarchy[childClassName] = self.get_class_children_recursive(childClassName)
        return childHierarchy

    ### INDEX PATH MANAGER

    __indexPathManager = None

    def get_index_path_manager(self):
        if self.__indexPathManager is None:
            gitpath = self.get_git_directory()
            if(gitpath != None):
                csvFilePath = gitpath + "/.git/addiks.excludes.csv"
                self.__indexPathManager = IndexPathManager(csvFilePath)
        return self.__indexPathManager

    ### GLADE

    def getGladeHandler(self):
        if self._glade_handler == None:
            self.__initGlade()
        return self._glade_handler

    def getGladeBuilder(self):
        if self._glade_builder == None:
            self.__initGlade()
        return self._glade_builder

    def __initGlade(self):
        self._glade_builder = Gtk.Builder()
        self._glade_builder.add_from_file(os.path.dirname(__file__)+"/phpide.glade")
        self._glade_handler = AddiksPhpGladeHandler(self, self._glade_builder)
        self._glade_builder.connect_signals(self._glade_handler)

    ### HELPERS

    def get_index_storage(self):
        if self._storage == None:
            self._storage = self.create_index_storage()
        return self._storage

    def create_index_storage(self):
        storage = None
        indexPath = self.get_index_filepath()

        if indexPath == None:
            pass

        elif indexPath == 'neo4j':
            from storage.neo4j import Neo4jStorage
            storage = Neo4jStorage()

        elif indexPath == 'dummy':
            from storage.dummy import DummyStorage
            storage = DummyStorage()

        elif indexPath.find(".sqlite3")>0:
            from storage.sqlite3 import Sqlite3Storage
            storage = Sqlite3Storage(indexPath)

        elif indexPath.find("/")>0:
            from storage.shelve import ShelveStorage
            storage = ShelveStorage(indexPath)

        else:
            raise Exception("Cannot open index '"+indexPath+"'!")

        return storage

    def get_php_fileindex(self, filePath=None):
        isLocalFile = False
        if filePath == None:
            document = self.view.get_buffer()
            if document != None and document.get_location() != None:
                filePath = document.get_location().get_path()
                filePath = os.path.abspath(filePath)
                isLocalFile = True
        if filePath not in self.__phpfiles:
            if isLocalFile:
                start, end = document.get_bounds()
                code = document.get_text(start, end, False)
            else:
                with open(filePath, "r", encoding = "ISO-8859-1") as f:
                    code = f.read()
            self.__phpfiles[filePath] = PhpFileAnalyzer(code, self, self.get_index_storage())
        return self.__phpfiles[filePath]

    def invalidate_php_fileindex(self, filePath=None):
        if filePath == None:
            document = self.view.get_buffer()
            if document != None and document.get_location() != None:
                filePath = document.get_location().get_path()
                filePath = os.path.abspath(filePath)
        if filePath in self.__phpfiles:
            del self.__phpfiles[filePath]

    def get_current_cursor_position(self):
        line = None
        column = None
        document = self.view.get_buffer()
        if document != None and document.get_location() != None:

            insertMark = document.get_insert()
            insertIter = document.get_iter_at_mark(insertMark)
            line   = insertIter.get_line()+1
            column = insertIter.get_line_index()+1
        return (line, column, )

    def get_git_directory(self):
        document = self.view.get_buffer()
        if document != None and document.get_location() != None:
            filepath = document.get_location().get_path()
            filepath = os.path.abspath(filepath)
            while filepath != "/":
                filepath = os.path.dirname(filepath)
                if os.path.isdir(filepath + "/.git"):
                    return filepath
        else:
            return None

    def get_index_filepath(self):
        gitpath = self.get_git_directory()
        if(gitpath != None):
            return gitpath + "/.git/addiks.phpindex.sqlite3"

    def is_index_built(self):
        filepath = self.get_index_filepath()
        if(os.path.exists(filepath)):
            return True
        return False

    def on_index_not_build(self):
        window = AddiksPhpIndexApp.get().get_window_by_view(self).window
        dialog = Gtk.MessageDialog(window, 0, Gtk.MessageType.ERROR, Gtk.ButtonsType.NONE, "Build index first!")
        dialog.format_secondary_text("To perform this action, you first need to build the index for this working directory.")
        dialog.run()
        return False

    def get_completion_provider(self):
        if self.__completion_provider == None:
            self.__completion_provider = AutocompleteProvider()
            self.__completion_provider.set_plugin(self)
        return self.__completion_provider
コード例 #6
0
from AutocompleteProvider import AutocompleteProvider
from Candidate import Candidate
from Trie import Trie

if __name__ == '__main__':

    autoComplete = AutocompleteProvider()

    while True:
        userInput = input('\n\t0: Quit the program.\n' \
                          '\t1: Train autocomplete program.\n' \
                          '\t2: Retrieve next predicted word list.\n' \
                          '\t3: Clear autocomplete program\'s history.\n' \
                          'Select from the options above: ')
        if userInput == "0":
            print("Program ended.")
            break
        elif userInput == "1":
            passage = input("Enter passage to train autocomplete program: ")
            autoComplete.train(passage)
        elif userInput == "2":
            fragment = input("Enter fragment to get autocomplete entries: ")
            wordList = []
            autoComplete.getWords(fragment, wordList)
            for candidate in wordList:
                print(candidate)
        elif userInput == "3":
            del autoComplete
            autoComplete = AutocompleteProvider()
        else:
            print("Invalid input.")