diff --git a/.DS_Store b/.DS_Store index 7855ac4..ce48ee8 100644 Binary files a/.DS_Store and b/.DS_Store differ diff --git a/.gitignore b/.gitignore index f707e4f..3157fa1 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,3 @@ images/** output/** - +src/index.json diff --git a/Makefile b/Makefile index e8c33f6..9155e31 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,5 @@ images=$(sort $(wildcard images/*.jpg)) +# @andre make wildcard so that it takes any image file but doesn't take the listimg.txt file output_ocr:=$(dir_ocr)/output.txt tmpfile:= $(shell mktemp) space:= $(empty) $(empty) @@ -22,7 +23,7 @@ help: # CLEAN clean: ## removes output (target) files - rm ocr/output.txt + rm ocr/output.txt rm $(wildcard output/*) rm $(tmpfile) @@ -31,12 +32,13 @@ clean: ## removes output (target) files dirs: ## create the dirs in working dir @-mkdir -p images/ + @-mkdir -p images-tiff/ @-mkdir -p output/ @-mkdir -p ocr/ + @-mkdir -p hocr/ @echo $(color_r)'Directories made': images/ output/ - testif: ifeq ($(OS),Darwin) @echo $(OS) @@ -49,13 +51,31 @@ ocr/output.txt: ## ocr with tesseract echo $(listimgs) > $(@D)/list.txt @echo $(basename $@ .txt) tesseract $(@D)/list.txt $(basename $@ .txt) + python3 src/build_database.py $(@) + +tiffs: ## convert images/ to images-tiff/ Depends on IM + echo $(images) + for i in $(images); \ + do tiff=`basename $$i .jpg`.tiff; \ + convert -density 300 $$i -alpha on images-tiff/$$tiff; \ + echo $$tiff; \ + done; - +hocrs: ## hocr with tesseract and then change extension to .html + for i in images-tiff/*.tiff; \ + do echo $$i; hocrfile=`basename $$i .tiff`; \ + tesseract $$i hocr/$$hocrfile hocr; \ + mv hocr/$$hocrfile.hocr hocr/$$hocrfile.html; \ + done; #OUTPUT GENERATION RECIPES -output/tagged-words.txt: ocr/output.txt ## Analyzes OCR'ed text using a Part of Speech (POS) tagger. Outputs a string of tags (e.g. nouns, verbs, adjectives, and adverbs). Dependencies: python3's nltk, nltk's averaged_perceptron_tagger - cat $< | python3 src/wordtagger.py > $(@) +output/wordtagger/index.html: ocr/output.txt ## Analyzes OCR'ed text using a Part of Speech (POS) tagger. Outputs a string of tags (e.g. nouns, verbs, adjectives, and adverbs). Dependencies: python3's nltk, jinja2 + mkdir -p output/wordtagger + cp src/wordtagger/jquery.min.js output/wordtagger + cp src/wordtagger/script.js output/wordtagger + cp src/wordtagger/style.css output/wordtagger + cat $< | python3 src/wordtagger/wordtagger.py # install nltk's 'averaged_perceptron_tagger': # $ python 3 # >>> import nltk @@ -65,9 +85,16 @@ output/chatbot.txt: ocr/output.txt ## Comments a text with a simple chatbot. Dep cat $< | python3 src/textbotconversation.py $(@) -output/n7.txt: ocr/output.txt ## DESCRIBE WHAT IT DOES. Dependencies: python3's chatterbot +output/n7.txt: ocr/output.txt ## Replaces nouns with the 7th noun that follows. Dependencies: 91k_nouns cat $< | python3 src/n_7.py > $(@) +output/carlandre.txt: ocr/output.txt ## Alice: Creates visual poetry out of a text. Dependencies: pytest + cat $< | python3 src/carlandre.py > $(@) +# cat $(@) > /dev/usb/lp0 + +output/overunder: ocr/output.txt ## Alice: An interpreted language that translate simple weaving instructions and creates a weaving pattern on text. + python3 src/overunder.py + visualization: $(images) $(tmpfile) ##Creates data visualization from images/*.jpg. Dependencies: mplayer @echo $(tmpfile) @@ -82,4 +109,7 @@ endif ttssr-human-only: ocr/output.txt ## Loop: text to speech-speech recognition. Dependencies: espeak, pocketsphinx - bash src/ttssr-loop-human-only.sh ocr/output.txt \ No newline at end of file + bash src/ttssr-loop-human-only.sh ocr/output.txt + +chatbook: ocr/output.txt #chatbot based on the knowledge of the scans Dependencies: nltk_rake, irc, nltk + python3 src/chatbook.py diff --git a/ocr/list.txt b/ocr/list.txt new file mode 100644 index 0000000..16c631e --- /dev/null +++ b/ocr/list.txt @@ -0,0 +1,3 @@ + +images/0029.jpg + diff --git a/ocr/output.txt b/ocr/output.txt new file mode 100644 index 0000000..5b14c3b --- /dev/null +++ b/ocr/output.txt @@ -0,0 +1,37 @@ + + + + +ZEROS + ONES DIGITAL WOMEN 4|» THE NEWTECHNOCULTURE + +moments of unknown, disconnected lives, ”invisible voices +conducted through the tips of her fingers." + +Poised as an interface between man and the world, she is +also wired to a network of digital machines: typists connected to +QWERTY alphabets, bodies shaped by the motion of the keys, +one hundred words a minute, viral speed, Thousands oi opera +tors, relays, calls, exchanges humming in Virtual conjunction, +learning the same phrases, flipping the same switches, +repeating the same responses, pushing plugs into the +answering iacks, maybe two hundred, three hundred times an +hours She has "a fingertip mastery of the ringing. listening, dial, +and other keys on her key shelf; of the row or rows of cords for +making connections; of the location and meaning of all parts of +the honey combed formation of jacks and trunks for recording, +for switching, for toll circuits, for tandem, for information-" It +becomes second nature it grows on her, "Having done this stufl +a few hundred thousand times, you become quite good at it. In +fact you're plugging, and connecting, and disconnecting ten, +twenty, forty cords at a time." After a while these processes +become "quite satisfying in a way, rather like weaving on an +upright loom," + +102 + + + + + + + diff --git a/src/build_database.py b/src/build_database.py new file mode 100644 index 0000000..722f54c --- /dev/null +++ b/src/build_database.py @@ -0,0 +1,38 @@ +import json +import argparse +import sys +from nltk.tokenize import sent_tokenize, word_tokenize +from rake_nltk import Rake + +r= Rake() + +ap = argparse.ArgumentParser("JSON Dumper") +ap.add_argument("text", nargs="+", help="text sources") +args=ap.parse_args() + + +with open('src/index.json') as f: + try: + index = json.load(f) + except: + index={} +# build the index of sentences organized by keywords +alltext = "" + +for n in args.text: + text = open(n).read() + text = text.replace("\n", " ") + sentences = sent_tokenize(text) + for sentence in sentences: + r.extract_keywords_from_text(sentence) + keys = r.get_ranked_phrases() + for key in keys: + if key not in index: + index[key] = [] + index[key].append({'filename': n, 'sentence': sentence, 'key': key}) + alltext += text + +#print(index) + +with open('src/index.json', 'w') as outfile: + json.dump(index, outfile) diff --git a/src/carlandre.py b/src/carlandre.py new file mode 100644 index 0000000..43df4eb --- /dev/null +++ b/src/carlandre.py @@ -0,0 +1,129 @@ +import pytest +from math import ceil +import sys +from sys import stdout +import time +import os.path + + +def pop_items(words, num_items): + ''' Removes num_items from words.''' + if not words: + return [], [] + + if num_items > len(words): + raise ValueError('Not enough items!') + + popped = [] + for number in range(num_items): + removed = words.pop(0) + popped.append(removed) + return popped, words + +def all_words_less_than(words, maxlength): + ''' Checks if the words have the correct length given in maxlength''' + for word in words: + if len(word) > maxlength: + return False + return True + +def filterwords(words, maxlength): + ''' Puts the words which have the correct length in a new list ''' + goodwords = [] + for word in words: + if len(word) <= maxlength and len(word) >=2: + goodwords.append(word) + return goodwords + + +def pattern(words, maxlength): + goodwords = filterwords(words, maxlength) + items_pattern = maxlength + (maxlength -4) + + if len(goodwords) % items_pattern != 0: + rest = len(goodwords) % items_pattern + difference = len(goodwords) - rest + goodwords = goodwords[:difference] + + times = int(len(words) / items_pattern) + + final_pattern = [] + for each_time in range(times): + popped, whatisleft = pop_items(goodwords, items_pattern) + if not popped: + continue + goodwords = whatisleft + + middle = ceil(len(popped)/2) + + ascending = sorted(popped[:middle], key=len) + descending = sorted(popped[middle:], key=len, reverse=True) + + + sorted_pattern = ascending + descending + final_pattern.append(sorted_pattern) + + return final_pattern + + +def test_pattern_returns_list(): + list_items = ['a', 'b', 'c', 'd', 'e'] + assert type(pattern(list_items, 3)) == type([]) + +def test_pattern_removes_over_max_len(): + list_words_right_length = [['a', 'aa', 'aaa', 'aa', 'a']] + words_wrong_length = list_words_right_length[0] + ['aaaaa'] + assert pattern(words_wrong_length, 3) == list_words_right_length + +def test_pop_items(): + assert pop_items(['a', 'aaa'], 1) == (['a'], ['aaa']) + +def test_pop_items_empty_list(): + assert pop_items([], 70) == ([], []) + +def test_pop_items_num_too_big(): + with pytest.raises(ValueError): + pop_items(['a', 'b'], 3) + +def test_cuts_for_pattern(): + list_with_nine = ['a'] * 9 + result = pattern(list_with_nine, 3) + assert len(result[0]) == 5 + +def test_empty_list_for_pattern(): + result = pattern([], 3) + assert result == [] + +def test_list_too_short_for_pattern(): + list_too_short = ['a', 'aa'] + result = pattern(list_too_short, 3) + assert result == [] + +if __name__ == '__main__': + with open('ocr/output.txt', 'r') as handle: + contents = handle.read() + splitted = contents.split() + ll = (pattern(splitted, 8)) + my_list = [] + for l in ll: + for x in l: + my_list.append(x) + joined_list = '\n'.join(my_list) + + + +my_path = '/dev/usb/lp0' +if os.path.exists(my_path): + sys.stdout = open(my_path, 'w') + + + +escpos = { + "init_printer": "\x1B\x40", + 'papercut':'\x1D\x56\x00', +} + +for i in range(10): + print(escpos['init_printer']) + print(joined_list) + print(escpos['papercut']) diff --git a/src/chatbook.py b/src/chatbook.py new file mode 100644 index 0000000..0c98dca --- /dev/null +++ b/src/chatbook.py @@ -0,0 +1,79 @@ +import irc.bot +from rake_nltk import Rake +import random +from nltk.tokenize import sent_tokenize, word_tokenize +import json +#from thread import start_new_thread +import os + +r = Rake() + +def chunks(l, n): + for i in range(0, len(l), n): + yield l[i:i+n] + +class HelloBot(irc.bot.SingleServerIRCBot): + def __init__(self, channel, nickname, server, port=6667, index=None): + print("connecting to chatroom...") + irc.bot.SingleServerIRCBot.__init__(self, [(server, port)], nickname, nickname) + self.channel = channel + self.index = index + + def on_welcome(self, c, e): + c.join(self.channel) + print("joined chatroom") + + def on_privmsg(self, c, e): + pass + + def on_pubmsg(self, c, e): + print(e.arguments, e.source) + msg=e.arguments[0] + print(e.source.split("!")[0][:1]) + incoming_msg = e.arguments[0] + r.extract_keywords_from_text(msg) + listOfKeys = r.get_ranked_phrases() + + msg_where = "" + + if e.source.split("!")[0][-3:] != "bot" or e.source.split("!")[0][:1] != "A": + print("true") + for keyWord in listOfKeys: + if keyWord in self.index: + msg = (index.get(keyWord)[0].get('sentence')) + msg_where = "I found this in {}".format(index.get(keyWord)[0].get('filename')) + else: + msg = "I don't know anything about that" + msg_where = "" + for chunk in chunks(msg, 400): + print(chunk) + c.privmsg(self.channel, chunk) + else: + print("bot") + + +if __name__ == "__main__": + import argparse + import sys + + ap = argparse.ArgumentParser("IRC Bot") + ap.add_argument("--server", default="irc.freenode.net") + ap.add_argument("--port", type=int, default=6667) + ap.add_argument("--channel", default="#pzi") + ap.add_argument("--nickname", default="scanbot") + ap.add_argument("--text", nargs="+", help="database to use", default="index.json") + args=ap.parse_args() + + # build the index of sentences organized by keywords + with open("src/index.json") as f: + try: + index = json.load(f) + except: + index={} + + #print(index) + myhost = os.uname()[1] + + + bot = HelloBot(args.channel, "A-2{}-bot".format(len(index)), args.server, args.port, index) + bot.start() diff --git a/src/index.json b/src/index.json new file mode 100644 index 0000000..4ee31d1 --- /dev/null +++ b/src/index.json @@ -0,0 +1 @@ +{"ones digital women 4 |\u00bb": [{"filename": "ocr/output.txt", "sentence": " ZEROS + ONES DIGITAL WOMEN 4|\u00bb THE NEWTECHNOCULTURE moments of unknown, disconnected lives, \u201dinvisible voices conducted through the tips of her \ufb01ngers.\"", "key": "ones digital women 4 |\u00bb"}], "\u201d invisible voices conducted": [{"filename": "ocr/output.txt", "sentence": " ZEROS + ONES DIGITAL WOMEN 4|\u00bb THE NEWTECHNOCULTURE moments of unknown, disconnected lives, \u201dinvisible voices conducted through the tips of her \ufb01ngers.\"", "key": "\u201d invisible voices conducted"}], "\ufb01ngers .\"": [{"filename": "ocr/output.txt", "sentence": " ZEROS + ONES DIGITAL WOMEN 4|\u00bb THE NEWTECHNOCULTURE moments of unknown, disconnected lives, \u201dinvisible voices conducted through the tips of her \ufb01ngers.\"", "key": "\ufb01ngers .\""}], "newtechnoculture moments": [{"filename": "ocr/output.txt", "sentence": " ZEROS + ONES DIGITAL WOMEN 4|\u00bb THE NEWTECHNOCULTURE moments of unknown, disconnected lives, \u201dinvisible voices conducted through the tips of her \ufb01ngers.\"", "key": "newtechnoculture moments"}], "disconnected lives": [{"filename": "ocr/output.txt", "sentence": " ZEROS + ONES DIGITAL WOMEN 4|\u00bb THE NEWTECHNOCULTURE moments of unknown, disconnected lives, \u201dinvisible voices conducted through the tips of her \ufb01ngers.\"", "key": "disconnected lives"}], "zeros": [{"filename": "ocr/output.txt", "sentence": " ZEROS + ONES DIGITAL WOMEN 4|\u00bb THE NEWTECHNOCULTURE moments of unknown, disconnected lives, \u201dinvisible voices conducted through the tips of her \ufb01ngers.\"", "key": "zeros"}], "unknown": [{"filename": "ocr/output.txt", "sentence": " ZEROS + ONES DIGITAL WOMEN 4|\u00bb THE NEWTECHNOCULTURE moments of unknown, disconnected lives, \u201dinvisible voices conducted through the tips of her \ufb01ngers.\"", "key": "unknown"}], "tips": [{"filename": "ocr/output.txt", "sentence": " ZEROS + ONES DIGITAL WOMEN 4|\u00bb THE NEWTECHNOCULTURE moments of unknown, disconnected lives, \u201dinvisible voices conducted through the tips of her \ufb01ngers.\"", "key": "tips"}], "thousands oi opera tors": [{"filename": "ocr/output.txt", "sentence": "Poised as an interface between man and the world, she is also wired to a network of digital machines: typists connected to QWERTY alphabets, bodies shaped by the motion of the keys, one hundred words a minute, viral speed, Thousands oi opera tors, relays, calls, exchanges humming in Virtual conjunction, learning the same phrases, \ufb02ipping the same switches, repeating the same responses, pushing plugs into the answering iacks, maybe two hundred, three hundred times an hours She has \"a \ufb01ngertip mastery of the ringing.", "key": "thousands oi opera tors"}], "three hundred times": [{"filename": "ocr/output.txt", "sentence": "Poised as an interface between man and the world, she is also wired to a network of digital machines: typists connected to QWERTY alphabets, bodies shaped by the motion of the keys, one hundred words a minute, viral speed, Thousands oi opera tors, relays, calls, exchanges humming in Virtual conjunction, learning the same phrases, \ufb02ipping the same switches, repeating the same responses, pushing plugs into the answering iacks, maybe two hundred, three hundred times an hours She has \"a \ufb01ngertip mastery of the ringing.", "key": "three hundred times"}], "one hundred words": [{"filename": "ocr/output.txt", "sentence": "Poised as an interface between man and the world, she is also wired to a network of digital machines: typists connected to QWERTY alphabets, bodies shaped by the motion of the keys, one hundred words a minute, viral speed, Thousands oi opera tors, relays, calls, exchanges humming in Virtual conjunction, learning the same phrases, \ufb02ipping the same switches, repeating the same responses, pushing plugs into the answering iacks, maybe two hundred, three hundred times an hours She has \"a \ufb01ngertip mastery of the ringing.", "key": "one hundred words"}], "maybe two hundred": [{"filename": "ocr/output.txt", "sentence": "Poised as an interface between man and the world, she is also wired to a network of digital machines: typists connected to QWERTY alphabets, bodies shaped by the motion of the keys, one hundred words a minute, viral speed, Thousands oi opera tors, relays, calls, exchanges humming in Virtual conjunction, learning the same phrases, \ufb02ipping the same switches, repeating the same responses, pushing plugs into the answering iacks, maybe two hundred, three hundred times an hours She has \"a \ufb01ngertip mastery of the ringing.", "key": "maybe two hundred"}], "\ufb01ngertip mastery": [{"filename": "ocr/output.txt", "sentence": "Poised as an interface between man and the world, she is also wired to a network of digital machines: typists connected to QWERTY alphabets, bodies shaped by the motion of the keys, one hundred words a minute, viral speed, Thousands oi opera tors, relays, calls, exchanges humming in Virtual conjunction, learning the same phrases, \ufb02ipping the same switches, repeating the same responses, pushing plugs into the answering iacks, maybe two hundred, three hundred times an hours She has \"a \ufb01ngertip mastery of the ringing.", "key": "\ufb01ngertip mastery"}], "virtual conjunction": [{"filename": "ocr/output.txt", "sentence": "Poised as an interface between man and the world, she is also wired to a network of digital machines: typists connected to QWERTY alphabets, bodies shaped by the motion of the keys, one hundred words a minute, viral speed, Thousands oi opera tors, relays, calls, exchanges humming in Virtual conjunction, learning the same phrases, \ufb02ipping the same switches, repeating the same responses, pushing plugs into the answering iacks, maybe two hundred, three hundred times an hours She has \"a \ufb01ngertip mastery of the ringing.", "key": "virtual conjunction"}], "viral speed": [{"filename": "ocr/output.txt", "sentence": "Poised as an interface between man and the world, she is also wired to a network of digital machines: typists connected to QWERTY alphabets, bodies shaped by the motion of the keys, one hundred words a minute, viral speed, Thousands oi opera tors, relays, calls, exchanges humming in Virtual conjunction, learning the same phrases, \ufb02ipping the same switches, repeating the same responses, pushing plugs into the answering iacks, maybe two hundred, three hundred times an hours She has \"a \ufb01ngertip mastery of the ringing.", "key": "viral speed"}], "typists connected": [{"filename": "ocr/output.txt", "sentence": "Poised as an interface between man and the world, she is also wired to a network of digital machines: typists connected to QWERTY alphabets, bodies shaped by the motion of the keys, one hundred words a minute, viral speed, Thousands oi opera tors, relays, calls, exchanges humming in Virtual conjunction, learning the same phrases, \ufb02ipping the same switches, repeating the same responses, pushing plugs into the answering iacks, maybe two hundred, three hundred times an hours She has \"a \ufb01ngertip mastery of the ringing.", "key": "typists connected"}], "qwerty alphabets": [{"filename": "ocr/output.txt", "sentence": "Poised as an interface between man and the world, she is also wired to a network of digital machines: typists connected to QWERTY alphabets, bodies shaped by the motion of the keys, one hundred words a minute, viral speed, Thousands oi opera tors, relays, calls, exchanges humming in Virtual conjunction, learning the same phrases, \ufb02ipping the same switches, repeating the same responses, pushing plugs into the answering iacks, maybe two hundred, three hundred times an hours She has \"a \ufb01ngertip mastery of the ringing.", "key": "qwerty alphabets"}], "pushing plugs": [{"filename": "ocr/output.txt", "sentence": "Poised as an interface between man and the world, she is also wired to a network of digital machines: typists connected to QWERTY alphabets, bodies shaped by the motion of the keys, one hundred words a minute, viral speed, Thousands oi opera tors, relays, calls, exchanges humming in Virtual conjunction, learning the same phrases, \ufb02ipping the same switches, repeating the same responses, pushing plugs into the answering iacks, maybe two hundred, three hundred times an hours She has \"a \ufb01ngertip mastery of the ringing.", "key": "pushing plugs"}], "exchanges humming": [{"filename": "ocr/output.txt", "sentence": "Poised as an interface between man and the world, she is also wired to a network of digital machines: typists connected to QWERTY alphabets, bodies shaped by the motion of the keys, one hundred words a minute, viral speed, Thousands oi opera tors, relays, calls, exchanges humming in Virtual conjunction, learning the same phrases, \ufb02ipping the same switches, repeating the same responses, pushing plugs into the answering iacks, maybe two hundred, three hundred times an hours She has \"a \ufb01ngertip mastery of the ringing.", "key": "exchanges humming"}], "digital machines": [{"filename": "ocr/output.txt", "sentence": "Poised as an interface between man and the world, she is also wired to a network of digital machines: typists connected to QWERTY alphabets, bodies shaped by the motion of the keys, one hundred words a minute, viral speed, Thousands oi opera tors, relays, calls, exchanges humming in Virtual conjunction, learning the same phrases, \ufb02ipping the same switches, repeating the same responses, pushing plugs into the answering iacks, maybe two hundred, three hundred times an hours She has \"a \ufb01ngertip mastery of the ringing.", "key": "digital machines"}], "bodies shaped": [{"filename": "ocr/output.txt", "sentence": "Poised as an interface between man and the world, she is also wired to a network of digital machines: typists connected to QWERTY alphabets, bodies shaped by the motion of the keys, one hundred words a minute, viral speed, Thousands oi opera tors, relays, calls, exchanges humming in Virtual conjunction, learning the same phrases, \ufb02ipping the same switches, repeating the same responses, pushing plugs into the answering iacks, maybe two hundred, three hundred times an hours She has \"a \ufb01ngertip mastery of the ringing.", "key": "bodies shaped"}], "answering iacks": [{"filename": "ocr/output.txt", "sentence": "Poised as an interface between man and the world, she is also wired to a network of digital machines: typists connected to QWERTY alphabets, bodies shaped by the motion of the keys, one hundred words a minute, viral speed, Thousands oi opera tors, relays, calls, exchanges humming in Virtual conjunction, learning the same phrases, \ufb02ipping the same switches, repeating the same responses, pushing plugs into the answering iacks, maybe two hundred, three hundred times an hours She has \"a \ufb01ngertip mastery of the ringing.", "key": "answering iacks"}], "also wired": [{"filename": "ocr/output.txt", "sentence": "Poised as an interface between man and the world, she is also wired to a network of digital machines: typists connected to QWERTY alphabets, bodies shaped by the motion of the keys, one hundred words a minute, viral speed, Thousands oi opera tors, relays, calls, exchanges humming in Virtual conjunction, learning the same phrases, \ufb02ipping the same switches, repeating the same responses, pushing plugs into the answering iacks, maybe two hundred, three hundred times an hours She has \"a \ufb01ngertip mastery of the ringing.", "key": "also wired"}], "\ufb02ipping": [{"filename": "ocr/output.txt", "sentence": "Poised as an interface between man and the world, she is also wired to a network of digital machines: typists connected to QWERTY alphabets, bodies shaped by the motion of the keys, one hundred words a minute, viral speed, Thousands oi opera tors, relays, calls, exchanges humming in Virtual conjunction, learning the same phrases, \ufb02ipping the same switches, repeating the same responses, pushing plugs into the answering iacks, maybe two hundred, three hundred times an hours She has \"a \ufb01ngertip mastery of the ringing.", "key": "\ufb02ipping"}], "world": [{"filename": "ocr/output.txt", "sentence": "Poised as an interface between man and the world, she is also wired to a network of digital machines: typists connected to QWERTY alphabets, bodies shaped by the motion of the keys, one hundred words a minute, viral speed, Thousands oi opera tors, relays, calls, exchanges humming in Virtual conjunction, learning the same phrases, \ufb02ipping the same switches, repeating the same responses, pushing plugs into the answering iacks, maybe two hundred, three hundred times an hours She has \"a \ufb01ngertip mastery of the ringing.", "key": "world"}], "switches": [{"filename": "ocr/output.txt", "sentence": "Poised as an interface between man and the world, she is also wired to a network of digital machines: typists connected to QWERTY alphabets, bodies shaped by the motion of the keys, one hundred words a minute, viral speed, Thousands oi opera tors, relays, calls, exchanges humming in Virtual conjunction, learning the same phrases, \ufb02ipping the same switches, repeating the same responses, pushing plugs into the answering iacks, maybe two hundred, three hundred times an hours She has \"a \ufb01ngertip mastery of the ringing.", "key": "switches"}], "ringing": [{"filename": "ocr/output.txt", "sentence": "Poised as an interface between man and the world, she is also wired to a network of digital machines: typists connected to QWERTY alphabets, bodies shaped by the motion of the keys, one hundred words a minute, viral speed, Thousands oi opera tors, relays, calls, exchanges humming in Virtual conjunction, learning the same phrases, \ufb02ipping the same switches, repeating the same responses, pushing plugs into the answering iacks, maybe two hundred, three hundred times an hours She has \"a \ufb01ngertip mastery of the ringing.", "key": "ringing"}], "responses": [{"filename": "ocr/output.txt", "sentence": "Poised as an interface between man and the world, she is also wired to a network of digital machines: typists connected to QWERTY alphabets, bodies shaped by the motion of the keys, one hundred words a minute, viral speed, Thousands oi opera tors, relays, calls, exchanges humming in Virtual conjunction, learning the same phrases, \ufb02ipping the same switches, repeating the same responses, pushing plugs into the answering iacks, maybe two hundred, three hundred times an hours She has \"a \ufb01ngertip mastery of the ringing.", "key": "responses"}], "repeating": [{"filename": "ocr/output.txt", "sentence": "Poised as an interface between man and the world, she is also wired to a network of digital machines: typists connected to QWERTY alphabets, bodies shaped by the motion of the keys, one hundred words a minute, viral speed, Thousands oi opera tors, relays, calls, exchanges humming in Virtual conjunction, learning the same phrases, \ufb02ipping the same switches, repeating the same responses, pushing plugs into the answering iacks, maybe two hundred, three hundred times an hours She has \"a \ufb01ngertip mastery of the ringing.", "key": "repeating"}], "relays": [{"filename": "ocr/output.txt", "sentence": "Poised as an interface between man and the world, she is also wired to a network of digital machines: typists connected to QWERTY alphabets, bodies shaped by the motion of the keys, one hundred words a minute, viral speed, Thousands oi opera tors, relays, calls, exchanges humming in Virtual conjunction, learning the same phrases, \ufb02ipping the same switches, repeating the same responses, pushing plugs into the answering iacks, maybe two hundred, three hundred times an hours She has \"a \ufb01ngertip mastery of the ringing.", "key": "relays"}], "poised": [{"filename": "ocr/output.txt", "sentence": "Poised as an interface between man and the world, she is also wired to a network of digital machines: typists connected to QWERTY alphabets, bodies shaped by the motion of the keys, one hundred words a minute, viral speed, Thousands oi opera tors, relays, calls, exchanges humming in Virtual conjunction, learning the same phrases, \ufb02ipping the same switches, repeating the same responses, pushing plugs into the answering iacks, maybe two hundred, three hundred times an hours She has \"a \ufb01ngertip mastery of the ringing.", "key": "poised"}], "phrases": [{"filename": "ocr/output.txt", "sentence": "Poised as an interface between man and the world, she is also wired to a network of digital machines: typists connected to QWERTY alphabets, bodies shaped by the motion of the keys, one hundred words a minute, viral speed, Thousands oi opera tors, relays, calls, exchanges humming in Virtual conjunction, learning the same phrases, \ufb02ipping the same switches, repeating the same responses, pushing plugs into the answering iacks, maybe two hundred, three hundred times an hours She has \"a \ufb01ngertip mastery of the ringing.", "key": "phrases"}], "network": [{"filename": "ocr/output.txt", "sentence": "Poised as an interface between man and the world, she is also wired to a network of digital machines: typists connected to QWERTY alphabets, bodies shaped by the motion of the keys, one hundred words a minute, viral speed, Thousands oi opera tors, relays, calls, exchanges humming in Virtual conjunction, learning the same phrases, \ufb02ipping the same switches, repeating the same responses, pushing plugs into the answering iacks, maybe two hundred, three hundred times an hours She has \"a \ufb01ngertip mastery of the ringing.", "key": "network"}], "motion": [{"filename": "ocr/output.txt", "sentence": "Poised as an interface between man and the world, she is also wired to a network of digital machines: typists connected to QWERTY alphabets, bodies shaped by the motion of the keys, one hundred words a minute, viral speed, Thousands oi opera tors, relays, calls, exchanges humming in Virtual conjunction, learning the same phrases, \ufb02ipping the same switches, repeating the same responses, pushing plugs into the answering iacks, maybe two hundred, three hundred times an hours She has \"a \ufb01ngertip mastery of the ringing.", "key": "motion"}], "minute": [{"filename": "ocr/output.txt", "sentence": "Poised as an interface between man and the world, she is also wired to a network of digital machines: typists connected to QWERTY alphabets, bodies shaped by the motion of the keys, one hundred words a minute, viral speed, Thousands oi opera tors, relays, calls, exchanges humming in Virtual conjunction, learning the same phrases, \ufb02ipping the same switches, repeating the same responses, pushing plugs into the answering iacks, maybe two hundred, three hundred times an hours She has \"a \ufb01ngertip mastery of the ringing.", "key": "minute"}], "man": [{"filename": "ocr/output.txt", "sentence": "Poised as an interface between man and the world, she is also wired to a network of digital machines: typists connected to QWERTY alphabets, bodies shaped by the motion of the keys, one hundred words a minute, viral speed, Thousands oi opera tors, relays, calls, exchanges humming in Virtual conjunction, learning the same phrases, \ufb02ipping the same switches, repeating the same responses, pushing plugs into the answering iacks, maybe two hundred, three hundred times an hours She has \"a \ufb01ngertip mastery of the ringing.", "key": "man"}], "learning": [{"filename": "ocr/output.txt", "sentence": "Poised as an interface between man and the world, she is also wired to a network of digital machines: typists connected to QWERTY alphabets, bodies shaped by the motion of the keys, one hundred words a minute, viral speed, Thousands oi opera tors, relays, calls, exchanges humming in Virtual conjunction, learning the same phrases, \ufb02ipping the same switches, repeating the same responses, pushing plugs into the answering iacks, maybe two hundred, three hundred times an hours She has \"a \ufb01ngertip mastery of the ringing.", "key": "learning"}], "keys": [{"filename": "ocr/output.txt", "sentence": "Poised as an interface between man and the world, she is also wired to a network of digital machines: typists connected to QWERTY alphabets, bodies shaped by the motion of the keys, one hundred words a minute, viral speed, Thousands oi opera tors, relays, calls, exchanges humming in Virtual conjunction, learning the same phrases, \ufb02ipping the same switches, repeating the same responses, pushing plugs into the answering iacks, maybe two hundred, three hundred times an hours She has \"a \ufb01ngertip mastery of the ringing.", "key": "keys"}, {"filename": "ocr/output.txt", "sentence": "listening, dial, and other keys on her key shelf; of the row or rows of cords for making connections; of the location and meaning of all parts of the honey combed formation of jacks and trunks for recording, for switching, for toll circuits, for tandem, for information-\" It becomes second nature it grows on her, \"Having done this stufl a few hundred thousand times, you become quite good at it.", "key": "keys"}], "interface": [{"filename": "ocr/output.txt", "sentence": "Poised as an interface between man and the world, she is also wired to a network of digital machines: typists connected to QWERTY alphabets, bodies shaped by the motion of the keys, one hundred words a minute, viral speed, Thousands oi opera tors, relays, calls, exchanges humming in Virtual conjunction, learning the same phrases, \ufb02ipping the same switches, repeating the same responses, pushing plugs into the answering iacks, maybe two hundred, three hundred times an hours She has \"a \ufb01ngertip mastery of the ringing.", "key": "interface"}], "hours": [{"filename": "ocr/output.txt", "sentence": "Poised as an interface between man and the world, she is also wired to a network of digital machines: typists connected to QWERTY alphabets, bodies shaped by the motion of the keys, one hundred words a minute, viral speed, Thousands oi opera tors, relays, calls, exchanges humming in Virtual conjunction, learning the same phrases, \ufb02ipping the same switches, repeating the same responses, pushing plugs into the answering iacks, maybe two hundred, three hundred times an hours She has \"a \ufb01ngertip mastery of the ringing.", "key": "hours"}], "calls": [{"filename": "ocr/output.txt", "sentence": "Poised as an interface between man and the world, she is also wired to a network of digital machines: typists connected to QWERTY alphabets, bodies shaped by the motion of the keys, one hundred words a minute, viral speed, Thousands oi opera tors, relays, calls, exchanges humming in Virtual conjunction, learning the same phrases, \ufb02ipping the same switches, repeating the same responses, pushing plugs into the answering iacks, maybe two hundred, three hundred times an hours She has \"a \ufb01ngertip mastery of the ringing.", "key": "calls"}], "hundred thousand times": [{"filename": "ocr/output.txt", "sentence": "listening, dial, and other keys on her key shelf; of the row or rows of cords for making connections; of the location and meaning of all parts of the honey combed formation of jacks and trunks for recording, for switching, for toll circuits, for tandem, for information-\" It becomes second nature it grows on her, \"Having done this stufl a few hundred thousand times, you become quite good at it.", "key": "hundred thousand times"}], "honey combed formation": [{"filename": "ocr/output.txt", "sentence": "listening, dial, and other keys on her key shelf; of the row or rows of cords for making connections; of the location and meaning of all parts of the honey combed formation of jacks and trunks for recording, for switching, for toll circuits, for tandem, for information-\" It becomes second nature it grows on her, \"Having done this stufl a few hundred thousand times, you become quite good at it.", "key": "honey combed formation"}], "becomes second nature": [{"filename": "ocr/output.txt", "sentence": "listening, dial, and other keys on her key shelf; of the row or rows of cords for making connections; of the location and meaning of all parts of the honey combed formation of jacks and trunks for recording, for switching, for toll circuits, for tandem, for information-\" It becomes second nature it grows on her, \"Having done this stufl a few hundred thousand times, you become quite good at it.", "key": "becomes second nature"}], "become quite good": [{"filename": "ocr/output.txt", "sentence": "listening, dial, and other keys on her key shelf; of the row or rows of cords for making connections; of the location and meaning of all parts of the honey combed formation of jacks and trunks for recording, for switching, for toll circuits, for tandem, for information-\" It becomes second nature it grows on her, \"Having done this stufl a few hundred thousand times, you become quite good at it.", "key": "become quite good"}], "toll circuits": [{"filename": "ocr/output.txt", "sentence": "listening, dial, and other keys on her key shelf; of the row or rows of cords for making connections; of the location and meaning of all parts of the honey combed formation of jacks and trunks for recording, for switching, for toll circuits, for tandem, for information-\" It becomes second nature it grows on her, \"Having done this stufl a few hundred thousand times, you become quite good at it.", "key": "toll circuits"}], "making connections": [{"filename": "ocr/output.txt", "sentence": "listening, dial, and other keys on her key shelf; of the row or rows of cords for making connections; of the location and meaning of all parts of the honey combed formation of jacks and trunks for recording, for switching, for toll circuits, for tandem, for information-\" It becomes second nature it grows on her, \"Having done this stufl a few hundred thousand times, you become quite good at it.", "key": "making connections"}], "key shelf": [{"filename": "ocr/output.txt", "sentence": "listening, dial, and other keys on her key shelf; of the row or rows of cords for making connections; of the location and meaning of all parts of the honey combed formation of jacks and trunks for recording, for switching, for toll circuits, for tandem, for information-\" It becomes second nature it grows on her, \"Having done this stufl a few hundred thousand times, you become quite good at it.", "key": "key shelf"}], "information -\"": [{"filename": "ocr/output.txt", "sentence": "listening, dial, and other keys on her key shelf; of the row or rows of cords for making connections; of the location and meaning of all parts of the honey combed formation of jacks and trunks for recording, for switching, for toll circuits, for tandem, for information-\" It becomes second nature it grows on her, \"Having done this stufl a few hundred thousand times, you become quite good at it.", "key": "information -\""}], "trunks": [{"filename": "ocr/output.txt", "sentence": "listening, dial, and other keys on her key shelf; of the row or rows of cords for making connections; of the location and meaning of all parts of the honey combed formation of jacks and trunks for recording, for switching, for toll circuits, for tandem, for information-\" It becomes second nature it grows on her, \"Having done this stufl a few hundred thousand times, you become quite good at it.", "key": "trunks"}], "tandem": [{"filename": "ocr/output.txt", "sentence": "listening, dial, and other keys on her key shelf; of the row or rows of cords for making connections; of the location and meaning of all parts of the honey combed formation of jacks and trunks for recording, for switching, for toll circuits, for tandem, for information-\" It becomes second nature it grows on her, \"Having done this stufl a few hundred thousand times, you become quite good at it.", "key": "tandem"}], "switching": [{"filename": "ocr/output.txt", "sentence": "listening, dial, and other keys on her key shelf; of the row or rows of cords for making connections; of the location and meaning of all parts of the honey combed formation of jacks and trunks for recording, for switching, for toll circuits, for tandem, for information-\" It becomes second nature it grows on her, \"Having done this stufl a few hundred thousand times, you become quite good at it.", "key": "switching"}], "stufl": [{"filename": "ocr/output.txt", "sentence": "listening, dial, and other keys on her key shelf; of the row or rows of cords for making connections; of the location and meaning of all parts of the honey combed formation of jacks and trunks for recording, for switching, for toll circuits, for tandem, for information-\" It becomes second nature it grows on her, \"Having done this stufl a few hundred thousand times, you become quite good at it.", "key": "stufl"}], "rows": [{"filename": "ocr/output.txt", "sentence": "listening, dial, and other keys on her key shelf; of the row or rows of cords for making connections; of the location and meaning of all parts of the honey combed formation of jacks and trunks for recording, for switching, for toll circuits, for tandem, for information-\" It becomes second nature it grows on her, \"Having done this stufl a few hundred thousand times, you become quite good at it.", "key": "rows"}], "row": [{"filename": "ocr/output.txt", "sentence": "listening, dial, and other keys on her key shelf; of the row or rows of cords for making connections; of the location and meaning of all parts of the honey combed formation of jacks and trunks for recording, for switching, for toll circuits, for tandem, for information-\" It becomes second nature it grows on her, \"Having done this stufl a few hundred thousand times, you become quite good at it.", "key": "row"}], "recording": [{"filename": "ocr/output.txt", "sentence": "listening, dial, and other keys on her key shelf; of the row or rows of cords for making connections; of the location and meaning of all parts of the honey combed formation of jacks and trunks for recording, for switching, for toll circuits, for tandem, for information-\" It becomes second nature it grows on her, \"Having done this stufl a few hundred thousand times, you become quite good at it.", "key": "recording"}], "parts": [{"filename": "ocr/output.txt", "sentence": "listening, dial, and other keys on her key shelf; of the row or rows of cords for making connections; of the location and meaning of all parts of the honey combed formation of jacks and trunks for recording, for switching, for toll circuits, for tandem, for information-\" It becomes second nature it grows on her, \"Having done this stufl a few hundred thousand times, you become quite good at it.", "key": "parts"}], "meaning": [{"filename": "ocr/output.txt", "sentence": "listening, dial, and other keys on her key shelf; of the row or rows of cords for making connections; of the location and meaning of all parts of the honey combed formation of jacks and trunks for recording, for switching, for toll circuits, for tandem, for information-\" It becomes second nature it grows on her, \"Having done this stufl a few hundred thousand times, you become quite good at it.", "key": "meaning"}], "location": [{"filename": "ocr/output.txt", "sentence": "listening, dial, and other keys on her key shelf; of the row or rows of cords for making connections; of the location and meaning of all parts of the honey combed formation of jacks and trunks for recording, for switching, for toll circuits, for tandem, for information-\" It becomes second nature it grows on her, \"Having done this stufl a few hundred thousand times, you become quite good at it.", "key": "location"}], "listening": [{"filename": "ocr/output.txt", "sentence": "listening, dial, and other keys on her key shelf; of the row or rows of cords for making connections; of the location and meaning of all parts of the honey combed formation of jacks and trunks for recording, for switching, for toll circuits, for tandem, for information-\" It becomes second nature it grows on her, \"Having done this stufl a few hundred thousand times, you become quite good at it.", "key": "listening"}], "jacks": [{"filename": "ocr/output.txt", "sentence": "listening, dial, and other keys on her key shelf; of the row or rows of cords for making connections; of the location and meaning of all parts of the honey combed formation of jacks and trunks for recording, for switching, for toll circuits, for tandem, for information-\" It becomes second nature it grows on her, \"Having done this stufl a few hundred thousand times, you become quite good at it.", "key": "jacks"}], "grows": [{"filename": "ocr/output.txt", "sentence": "listening, dial, and other keys on her key shelf; of the row or rows of cords for making connections; of the location and meaning of all parts of the honey combed formation of jacks and trunks for recording, for switching, for toll circuits, for tandem, for information-\" It becomes second nature it grows on her, \"Having done this stufl a few hundred thousand times, you become quite good at it.", "key": "grows"}], "done": [{"filename": "ocr/output.txt", "sentence": "listening, dial, and other keys on her key shelf; of the row or rows of cords for making connections; of the location and meaning of all parts of the honey combed formation of jacks and trunks for recording, for switching, for toll circuits, for tandem, for information-\" It becomes second nature it grows on her, \"Having done this stufl a few hundred thousand times, you become quite good at it.", "key": "done"}], "dial": [{"filename": "ocr/output.txt", "sentence": "listening, dial, and other keys on her key shelf; of the row or rows of cords for making connections; of the location and meaning of all parts of the honey combed formation of jacks and trunks for recording, for switching, for toll circuits, for tandem, for information-\" It becomes second nature it grows on her, \"Having done this stufl a few hundred thousand times, you become quite good at it.", "key": "dial"}], "cords": [{"filename": "ocr/output.txt", "sentence": "listening, dial, and other keys on her key shelf; of the row or rows of cords for making connections; of the location and meaning of all parts of the honey combed formation of jacks and trunks for recording, for switching, for toll circuits, for tandem, for information-\" It becomes second nature it grows on her, \"Having done this stufl a few hundred thousand times, you become quite good at it.", "key": "cords"}], "time .\"": [{"filename": "ocr/output.txt", "sentence": "In fact you're plugging, and connecting, and disconnecting ten, twenty, forty cords at a time.\"", "key": "time .\""}], "forty cords": [{"filename": "ocr/output.txt", "sentence": "In fact you're plugging, and connecting, and disconnecting ten, twenty, forty cords at a time.\"", "key": "forty cords"}], "disconnecting ten": [{"filename": "ocr/output.txt", "sentence": "In fact you're plugging, and connecting, and disconnecting ten, twenty, forty cords at a time.\"", "key": "disconnecting ten"}], "twenty": [{"filename": "ocr/output.txt", "sentence": "In fact you're plugging, and connecting, and disconnecting ten, twenty, forty cords at a time.\"", "key": "twenty"}], "plugging": [{"filename": "ocr/output.txt", "sentence": "In fact you're plugging, and connecting, and disconnecting ten, twenty, forty cords at a time.\"", "key": "plugging"}], "fact": [{"filename": "ocr/output.txt", "sentence": "In fact you're plugging, and connecting, and disconnecting ten, twenty, forty cords at a time.\"", "key": "fact"}], "connecting": [{"filename": "ocr/output.txt", "sentence": "In fact you're plugging, and connecting, and disconnecting ten, twenty, forty cords at a time.\"", "key": "connecting"}], "upright loom ,\" 102": [{"filename": "ocr/output.txt", "sentence": "After a while these processes become \"quite satisfying in a way, rather like weaving on an upright loom,\" 102", "key": "upright loom ,\" 102"}], "rather like weaving": [{"filename": "ocr/output.txt", "sentence": "After a while these processes become \"quite satisfying in a way, rather like weaving on an upright loom,\" 102", "key": "rather like weaving"}], "quite satisfying": [{"filename": "ocr/output.txt", "sentence": "After a while these processes become \"quite satisfying in a way, rather like weaving on an upright loom,\" 102", "key": "quite satisfying"}], "processes become": [{"filename": "ocr/output.txt", "sentence": "After a while these processes become \"quite satisfying in a way, rather like weaving on an upright loom,\" 102", "key": "processes become"}], "way": [{"filename": "ocr/output.txt", "sentence": "After a while these processes become \"quite satisfying in a way, rather like weaving on an upright loom,\" 102", "key": "way"}]} \ No newline at end of file diff --git a/src/overunder.py b/src/overunder.py new file mode 100644 index 0000000..eb06093 --- /dev/null +++ b/src/overunder.py @@ -0,0 +1,90 @@ +import linecache +import textwrap +import sys +from sys import exit + +class LeavingProgram(Exception): + pass + +def parse(program): + cmds = program.split(',') + splitted_cmds = [] + for cmd in cmds: + splitted = cmd.split() + splitted_cmds.append(splitted) + return splitted_cmds + + #return tokenize(program) +def tokenize(s): + return s.split() + +def repl(): + while True: + try: + val = eval(parse(input('> '))) + if val is not None: + print(val) + except LeavingProgram: + break + +text = None +line_number = 0 +last_index = 0 + + +def eval(cmds): + global text + global line_number + global last_index + + for cmd in cmds: + if cmd == []: + line_number += 1 + last_index = 0 + + elif cmd[0] == 'load': + contents = open('ocr/output.txt').read() + text = textwrap.wrap(contents, 40, break_long_words=True) + print('\n'.join(text)) + line_number = 0 + last_index = 0 + + elif cmd[0] == 'show': + print(text[line_number]) + + elif cmd[0] == 'under': + current_line = text[line_number] + char_number = int(cmd[1]) - 1 + char_list = list(current_line) + + x=range(last_index, char_number + last_index + 1) + for time in x: + if time < len(char_list): + char_list[time] = u'\u21e2' + + last_index += char_number + 1 + + joined = ''.join(char_list) + text[line_number] = joined + + elif cmd[0] == 'over': + last_index += int(cmd[1]) + + elif cmd[0] == 'pattern': + + pattern = text[0:line_number + 1] + print('\n'.join(pattern)) + + + elif cmd[0] == 'quit': + print('Come back soon!') + raise LeavingProgram() + else: + joined = ' '.join(cmd) + print('Did not understand command {}'.format(joined)) + + + + +if __name__ == '__main__': + repl() diff --git a/src/wordtagger.py b/src/wordtagger.py deleted file mode 100644 index fedc080..0000000 --- a/src/wordtagger.py +++ /dev/null @@ -1,82 +0,0 @@ -import nltk -from sys import stdin, stdout - -# Define input -input = stdin.read() - -# FILTER FUNCTIONS -# This function cuts a string into words. Then runs a POS tagger for each word. Returns a list with tags -def postagger(string): - words = nltk.word_tokenize(string) - taggedwordlist = nltk.pos_tag(words) - - for word, pos in nltk.pos_tag(words): - taggedwordlist = nltk.pos_tag(words) - #print('{0} is a {1}'.format(word,pos)) # Comment out to print the analysis step - - taglist = [ pos for word,pos in taggedwordlist ] - #print(taglist) - return taglist; - -# This function changes the tags to readable equivalents (NNP to noun for example) -def postagger_readable(list): - readabletaglist = [] - - for tag in list: - if tag in {"NNP","NNS","NN","NNPS"}: - readabletag = 'noun' - elif tag in {'VB','VBD','VBG','VBN','VBP','VBZ'}: - readabletag = 'verb' - elif tag in {'RB','RBR','RBS','WRB'}: - readabletag = 'adverb' - elif tag in {'PRP','PRP$'}: - readabletag = 'pronoun' - elif tag in {'JJ','JJR','JJS'}: - readabletag = 'adjective' - elif tag == 'IN': - readabletag = 'preposition' - elif tag == 'WDT': - readabletag = 'determiner' - elif tag in {'WP','WP$'}: - readabletag = 'pronoun' - elif tag == 'UH': - readabletag = 'interjection' - elif tag == 'POS': - readabletag = 'possesive ending' - elif tag == 'SYM': - readabletag = 'symbol' - elif tag == 'EX': - readabletag = 'existential there' - elif tag == 'DT': - readabletag = 'determiner' - elif tag == 'MD': - readabletag = 'modal' - elif tag == 'LS': - readabletag = 'list item marker' - elif tag == 'FW': - readabletag = 'foreign word' - elif tag == 'CC': - readabletag = 'coordinating conjunction ' - elif tag == 'CD': - readabletag = 'cardinal number' - elif tag == 'TO': - readabletag = 'to' - elif tag == '.': - readabletag = 'line ending' - elif tag == ',': - readabletag = 'comma' - else: - readabletag = tag - - readabletaglist.append(readabletag) - return readabletaglist; - - -# This function creates the output -def main(): - taglist = postagger(input) - readabletaglist = postagger_readable(taglist) - stdout.write(' '.join(readabletaglist)) - stdout.write('\n') - -main() diff --git a/src/wordtagger/jquery.min.js b/src/wordtagger/jquery.min.js new file mode 100644 index 0000000..4d9b3a2 --- /dev/null +++ b/src/wordtagger/jquery.min.js @@ -0,0 +1,2 @@ +/*! jQuery v3.3.1 | (c) JS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(e,t){"use strict";var n=[],r=e.document,i=Object.getPrototypeOf,o=n.slice,a=n.concat,s=n.push,u=n.indexOf,l={},c=l.toString,f=l.hasOwnProperty,p=f.toString,d=p.call(Object),h={},g=function e(t){return"function"==typeof t&&"number"!=typeof t.nodeType},y=function e(t){return null!=t&&t===t.window},v={type:!0,src:!0,noModule:!0};function m(e,t,n){var i,o=(t=t||r).createElement("script");if(o.text=e,n)for(i in v)n[i]&&(o[i]=n[i]);t.head.appendChild(o).parentNode.removeChild(o)}function x(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?l[c.call(e)]||"object":typeof e}var b="3.3.1",w=function(e,t){return new w.fn.init(e,t)},T=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;w.fn=w.prototype={jquery:"3.3.1",constructor:w,length:0,toArray:function(){return o.call(this)},get:function(e){return null==e?o.call(this):e<0?this[e+this.length]:this[e]},pushStack:function(e){var t=w.merge(this.constructor(),e);return t.prevObject=this,t},each:function(e){return w.each(this,e)},map:function(e){return this.pushStack(w.map(this,function(t,n){return e.call(t,n,t)}))},slice:function(){return this.pushStack(o.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(e<0?t:0);return this.pushStack(n>=0&&n0&&t-1 in e)}var E=function(e){var t,n,r,i,o,a,s,u,l,c,f,p,d,h,g,y,v,m,x,b="sizzle"+1*new Date,w=e.document,T=0,C=0,E=ae(),k=ae(),S=ae(),D=function(e,t){return e===t&&(f=!0),0},N={}.hasOwnProperty,A=[],j=A.pop,q=A.push,L=A.push,H=A.slice,O=function(e,t){for(var n=0,r=e.length;n+~]|"+M+")"+M+"*"),z=new RegExp("="+M+"*([^\\]'\"]*?)"+M+"*\\]","g"),X=new RegExp(W),U=new RegExp("^"+R+"$"),V={ID:new RegExp("^#("+R+")"),CLASS:new RegExp("^\\.("+R+")"),TAG:new RegExp("^("+R+"|[*])"),ATTR:new RegExp("^"+I),PSEUDO:new RegExp("^"+W),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+P+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},G=/^(?:input|select|textarea|button)$/i,Y=/^h\d$/i,Q=/^[^{]+\{\s*\[native \w/,J=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,K=/[+~]/,Z=new RegExp("\\\\([\\da-f]{1,6}"+M+"?|("+M+")|.)","ig"),ee=function(e,t,n){var r="0x"+t-65536;return r!==r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|56320)},te=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ne=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},re=function(){p()},ie=me(function(e){return!0===e.disabled&&("form"in e||"label"in e)},{dir:"parentNode",next:"legend"});try{L.apply(A=H.call(w.childNodes),w.childNodes),A[w.childNodes.length].nodeType}catch(e){L={apply:A.length?function(e,t){q.apply(e,H.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function oe(e,t,r,i){var o,s,l,c,f,h,v,m=t&&t.ownerDocument,T=t?t.nodeType:9;if(r=r||[],"string"!=typeof e||!e||1!==T&&9!==T&&11!==T)return r;if(!i&&((t?t.ownerDocument||t:w)!==d&&p(t),t=t||d,g)){if(11!==T&&(f=J.exec(e)))if(o=f[1]){if(9===T){if(!(l=t.getElementById(o)))return r;if(l.id===o)return r.push(l),r}else if(m&&(l=m.getElementById(o))&&x(t,l)&&l.id===o)return r.push(l),r}else{if(f[2])return L.apply(r,t.getElementsByTagName(e)),r;if((o=f[3])&&n.getElementsByClassName&&t.getElementsByClassName)return L.apply(r,t.getElementsByClassName(o)),r}if(n.qsa&&!S[e+" "]&&(!y||!y.test(e))){if(1!==T)m=t,v=e;else if("object"!==t.nodeName.toLowerCase()){(c=t.getAttribute("id"))?c=c.replace(te,ne):t.setAttribute("id",c=b),s=(h=a(e)).length;while(s--)h[s]="#"+c+" "+ve(h[s]);v=h.join(","),m=K.test(e)&&ge(t.parentNode)||t}if(v)try{return L.apply(r,m.querySelectorAll(v)),r}catch(e){}finally{c===b&&t.removeAttribute("id")}}}return u(e.replace(B,"$1"),t,r,i)}function ae(){var e=[];function t(n,i){return e.push(n+" ")>r.cacheLength&&delete t[e.shift()],t[n+" "]=i}return t}function se(e){return e[b]=!0,e}function ue(e){var t=d.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function le(e,t){var n=e.split("|"),i=n.length;while(i--)r.attrHandle[n[i]]=t}function ce(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function fe(e){return function(t){return"input"===t.nodeName.toLowerCase()&&t.type===e}}function pe(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function de(e){return function(t){return"form"in t?t.parentNode&&!1===t.disabled?"label"in t?"label"in t.parentNode?t.parentNode.disabled===e:t.disabled===e:t.isDisabled===e||t.isDisabled!==!e&&ie(t)===e:t.disabled===e:"label"in t&&t.disabled===e}}function he(e){return se(function(t){return t=+t,se(function(n,r){var i,o=e([],n.length,t),a=o.length;while(a--)n[i=o[a]]&&(n[i]=!(r[i]=n[i]))})})}function ge(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}n=oe.support={},o=oe.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return!!t&&"HTML"!==t.nodeName},p=oe.setDocument=function(e){var t,i,a=e?e.ownerDocument||e:w;return a!==d&&9===a.nodeType&&a.documentElement?(d=a,h=d.documentElement,g=!o(d),w!==d&&(i=d.defaultView)&&i.top!==i&&(i.addEventListener?i.addEventListener("unload",re,!1):i.attachEvent&&i.attachEvent("onunload",re)),n.attributes=ue(function(e){return e.className="i",!e.getAttribute("className")}),n.getElementsByTagName=ue(function(e){return e.appendChild(d.createComment("")),!e.getElementsByTagName("*").length}),n.getElementsByClassName=Q.test(d.getElementsByClassName),n.getById=ue(function(e){return h.appendChild(e).id=b,!d.getElementsByName||!d.getElementsByName(b).length}),n.getById?(r.filter.ID=function(e){var t=e.replace(Z,ee);return function(e){return e.getAttribute("id")===t}},r.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&g){var n=t.getElementById(e);return n?[n]:[]}}):(r.filter.ID=function(e){var t=e.replace(Z,ee);return function(e){var n="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return n&&n.value===t}},r.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&g){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),r.find.TAG=n.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):n.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},r.find.CLASS=n.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&g)return t.getElementsByClassName(e)},v=[],y=[],(n.qsa=Q.test(d.querySelectorAll))&&(ue(function(e){h.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&y.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||y.push("\\["+M+"*(?:value|"+P+")"),e.querySelectorAll("[id~="+b+"-]").length||y.push("~="),e.querySelectorAll(":checked").length||y.push(":checked"),e.querySelectorAll("a#"+b+"+*").length||y.push(".#.+[+~]")}),ue(function(e){e.innerHTML="";var t=d.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&y.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&y.push(":enabled",":disabled"),h.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&y.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),y.push(",.*:")})),(n.matchesSelector=Q.test(m=h.matches||h.webkitMatchesSelector||h.mozMatchesSelector||h.oMatchesSelector||h.msMatchesSelector))&&ue(function(e){n.disconnectedMatch=m.call(e,"*"),m.call(e,"[s!='']:x"),v.push("!=",W)}),y=y.length&&new RegExp(y.join("|")),v=v.length&&new RegExp(v.join("|")),t=Q.test(h.compareDocumentPosition),x=t||Q.test(h.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return f=!0,0;var r=!e.compareDocumentPosition-!t.compareDocumentPosition;return r||(1&(r=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!n.sortDetached&&t.compareDocumentPosition(e)===r?e===d||e.ownerDocument===w&&x(w,e)?-1:t===d||t.ownerDocument===w&&x(w,t)?1:c?O(c,e)-O(c,t):0:4&r?-1:1)}:function(e,t){if(e===t)return f=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e===d?-1:t===d?1:i?-1:o?1:c?O(c,e)-O(c,t):0;if(i===o)return ce(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?ce(a[r],s[r]):a[r]===w?-1:s[r]===w?1:0},d):d},oe.matches=function(e,t){return oe(e,null,null,t)},oe.matchesSelector=function(e,t){if((e.ownerDocument||e)!==d&&p(e),t=t.replace(z,"='$1']"),n.matchesSelector&&g&&!S[t+" "]&&(!v||!v.test(t))&&(!y||!y.test(t)))try{var r=m.call(e,t);if(r||n.disconnectedMatch||e.document&&11!==e.document.nodeType)return r}catch(e){}return oe(t,d,null,[e]).length>0},oe.contains=function(e,t){return(e.ownerDocument||e)!==d&&p(e),x(e,t)},oe.attr=function(e,t){(e.ownerDocument||e)!==d&&p(e);var i=r.attrHandle[t.toLowerCase()],o=i&&N.call(r.attrHandle,t.toLowerCase())?i(e,t,!g):void 0;return void 0!==o?o:n.attributes||!g?e.getAttribute(t):(o=e.getAttributeNode(t))&&o.specified?o.value:null},oe.escape=function(e){return(e+"").replace(te,ne)},oe.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},oe.uniqueSort=function(e){var t,r=[],i=0,o=0;if(f=!n.detectDuplicates,c=!n.sortStable&&e.slice(0),e.sort(D),f){while(t=e[o++])t===e[o]&&(i=r.push(o));while(i--)e.splice(r[i],1)}return c=null,e},i=oe.getText=function(e){var t,n="",r=0,o=e.nodeType;if(o){if(1===o||9===o||11===o){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=i(e)}else if(3===o||4===o)return e.nodeValue}else while(t=e[r++])n+=i(t);return n},(r=oe.selectors={cacheLength:50,createPseudo:se,match:V,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(Z,ee),e[3]=(e[3]||e[4]||e[5]||"").replace(Z,ee),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||oe.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&oe.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return V.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=a(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(Z,ee).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=E[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&E(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r){var i=oe.attr(r,e);return null==i?"!="===t:!t||(i+="","="===t?i===n:"!="===t?i!==n:"^="===t?n&&0===i.indexOf(n):"*="===t?n&&i.indexOf(n)>-1:"$="===t?n&&i.slice(-n.length)===n:"~="===t?(" "+i.replace($," ")+" ").indexOf(n)>-1:"|="===t&&(i===n||i.slice(0,n.length+1)===n+"-"))}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),a="last"!==e.slice(-4),s="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,u){var l,c,f,p,d,h,g=o!==a?"nextSibling":"previousSibling",y=t.parentNode,v=s&&t.nodeName.toLowerCase(),m=!u&&!s,x=!1;if(y){if(o){while(g){p=t;while(p=p[g])if(s?p.nodeName.toLowerCase()===v:1===p.nodeType)return!1;h=g="only"===e&&!h&&"nextSibling"}return!0}if(h=[a?y.firstChild:y.lastChild],a&&m){x=(d=(l=(c=(f=(p=y)[b]||(p[b]={}))[p.uniqueID]||(f[p.uniqueID]={}))[e]||[])[0]===T&&l[1])&&l[2],p=d&&y.childNodes[d];while(p=++d&&p&&p[g]||(x=d=0)||h.pop())if(1===p.nodeType&&++x&&p===t){c[e]=[T,d,x];break}}else if(m&&(x=d=(l=(c=(f=(p=t)[b]||(p[b]={}))[p.uniqueID]||(f[p.uniqueID]={}))[e]||[])[0]===T&&l[1]),!1===x)while(p=++d&&p&&p[g]||(x=d=0)||h.pop())if((s?p.nodeName.toLowerCase()===v:1===p.nodeType)&&++x&&(m&&((c=(f=p[b]||(p[b]={}))[p.uniqueID]||(f[p.uniqueID]={}))[e]=[T,x]),p===t))break;return(x-=i)===r||x%r==0&&x/r>=0}}},PSEUDO:function(e,t){var n,i=r.pseudos[e]||r.setFilters[e.toLowerCase()]||oe.error("unsupported pseudo: "+e);return i[b]?i(t):i.length>1?(n=[e,e,"",t],r.setFilters.hasOwnProperty(e.toLowerCase())?se(function(e,n){var r,o=i(e,t),a=o.length;while(a--)e[r=O(e,o[a])]=!(n[r]=o[a])}):function(e){return i(e,0,n)}):i}},pseudos:{not:se(function(e){var t=[],n=[],r=s(e.replace(B,"$1"));return r[b]?se(function(e,t,n,i){var o,a=r(e,null,i,[]),s=e.length;while(s--)(o=a[s])&&(e[s]=!(t[s]=o))}):function(e,i,o){return t[0]=e,r(t,null,o,n),t[0]=null,!n.pop()}}),has:se(function(e){return function(t){return oe(e,t).length>0}}),contains:se(function(e){return e=e.replace(Z,ee),function(t){return(t.textContent||t.innerText||i(t)).indexOf(e)>-1}}),lang:se(function(e){return U.test(e||"")||oe.error("unsupported lang: "+e),e=e.replace(Z,ee).toLowerCase(),function(t){var n;do{if(n=g?t.lang:t.getAttribute("xml:lang")||t.getAttribute("lang"))return(n=n.toLowerCase())===e||0===n.indexOf(e+"-")}while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===h},focus:function(e){return e===d.activeElement&&(!d.hasFocus||d.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:de(!1),disabled:de(!0),checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,!0===e.selected},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!r.pseudos.empty(e)},header:function(e){return Y.test(e.nodeName)},input:function(e){return G.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:he(function(){return[0]}),last:he(function(e,t){return[t-1]}),eq:he(function(e,t,n){return[n<0?n+t:n]}),even:he(function(e,t){for(var n=0;n=0;)e.push(r);return e}),gt:he(function(e,t,n){for(var r=n<0?n+t:n;++r1?function(t,n,r){var i=e.length;while(i--)if(!e[i](t,n,r))return!1;return!0}:e[0]}function be(e,t,n){for(var r=0,i=t.length;r-1&&(o[l]=!(a[l]=f))}}else v=we(v===a?v.splice(h,v.length):v),i?i(null,a,v,u):L.apply(a,v)})}function Ce(e){for(var t,n,i,o=e.length,a=r.relative[e[0].type],s=a||r.relative[" "],u=a?1:0,c=me(function(e){return e===t},s,!0),f=me(function(e){return O(t,e)>-1},s,!0),p=[function(e,n,r){var i=!a&&(r||n!==l)||((t=n).nodeType?c(e,n,r):f(e,n,r));return t=null,i}];u1&&xe(p),u>1&&ve(e.slice(0,u-1).concat({value:" "===e[u-2].type?"*":""})).replace(B,"$1"),n,u0,i=e.length>0,o=function(o,a,s,u,c){var f,h,y,v=0,m="0",x=o&&[],b=[],w=l,C=o||i&&r.find.TAG("*",c),E=T+=null==w?1:Math.random()||.1,k=C.length;for(c&&(l=a===d||a||c);m!==k&&null!=(f=C[m]);m++){if(i&&f){h=0,a||f.ownerDocument===d||(p(f),s=!g);while(y=e[h++])if(y(f,a||d,s)){u.push(f);break}c&&(T=E)}n&&((f=!y&&f)&&v--,o&&x.push(f))}if(v+=m,n&&m!==v){h=0;while(y=t[h++])y(x,b,a,s);if(o){if(v>0)while(m--)x[m]||b[m]||(b[m]=j.call(u));b=we(b)}L.apply(u,b),c&&!o&&b.length>0&&v+t.length>1&&oe.uniqueSort(u)}return c&&(T=E,l=w),x};return n?se(o):o}return s=oe.compile=function(e,t){var n,r=[],i=[],o=S[e+" "];if(!o){t||(t=a(e)),n=t.length;while(n--)(o=Ce(t[n]))[b]?r.push(o):i.push(o);(o=S(e,Ee(i,r))).selector=e}return o},u=oe.select=function(e,t,n,i){var o,u,l,c,f,p="function"==typeof e&&e,d=!i&&a(e=p.selector||e);if(n=n||[],1===d.length){if((u=d[0]=d[0].slice(0)).length>2&&"ID"===(l=u[0]).type&&9===t.nodeType&&g&&r.relative[u[1].type]){if(!(t=(r.find.ID(l.matches[0].replace(Z,ee),t)||[])[0]))return n;p&&(t=t.parentNode),e=e.slice(u.shift().value.length)}o=V.needsContext.test(e)?0:u.length;while(o--){if(l=u[o],r.relative[c=l.type])break;if((f=r.find[c])&&(i=f(l.matches[0].replace(Z,ee),K.test(u[0].type)&&ge(t.parentNode)||t))){if(u.splice(o,1),!(e=i.length&&ve(u)))return L.apply(n,i),n;break}}}return(p||s(e,d))(i,t,!g,n,!t||K.test(e)&&ge(t.parentNode)||t),n},n.sortStable=b.split("").sort(D).join("")===b,n.detectDuplicates=!!f,p(),n.sortDetached=ue(function(e){return 1&e.compareDocumentPosition(d.createElement("fieldset"))}),ue(function(e){return e.innerHTML="","#"===e.firstChild.getAttribute("href")})||le("type|href|height|width",function(e,t,n){if(!n)return e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),n.attributes&&ue(function(e){return e.innerHTML="",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||le("value",function(e,t,n){if(!n&&"input"===e.nodeName.toLowerCase())return e.defaultValue}),ue(function(e){return null==e.getAttribute("disabled")})||le(P,function(e,t,n){var r;if(!n)return!0===e[t]?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),oe}(e);w.find=E,w.expr=E.selectors,w.expr[":"]=w.expr.pseudos,w.uniqueSort=w.unique=E.uniqueSort,w.text=E.getText,w.isXMLDoc=E.isXML,w.contains=E.contains,w.escapeSelector=E.escape;var k=function(e,t,n){var r=[],i=void 0!==n;while((e=e[t])&&9!==e.nodeType)if(1===e.nodeType){if(i&&w(e).is(n))break;r.push(e)}return r},S=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},D=w.expr.match.needsContext;function N(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()}var A=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,t,n){return g(t)?w.grep(e,function(e,r){return!!t.call(e,r,e)!==n}):t.nodeType?w.grep(e,function(e){return e===t!==n}):"string"!=typeof t?w.grep(e,function(e){return u.call(t,e)>-1!==n}):w.filter(t,e,n)}w.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?w.find.matchesSelector(r,e)?[r]:[]:w.find.matches(e,w.grep(t,function(e){return 1===e.nodeType}))},w.fn.extend({find:function(e){var t,n,r=this.length,i=this;if("string"!=typeof e)return this.pushStack(w(e).filter(function(){for(t=0;t1?w.uniqueSort(n):n},filter:function(e){return this.pushStack(j(this,e||[],!1))},not:function(e){return this.pushStack(j(this,e||[],!0))},is:function(e){return!!j(this,"string"==typeof e&&D.test(e)?w(e):e||[],!1).length}});var q,L=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(w.fn.init=function(e,t,n){var i,o;if(!e)return this;if(n=n||q,"string"==typeof e){if(!(i="<"===e[0]&&">"===e[e.length-1]&&e.length>=3?[null,e,null]:L.exec(e))||!i[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(i[1]){if(t=t instanceof w?t[0]:t,w.merge(this,w.parseHTML(i[1],t&&t.nodeType?t.ownerDocument||t:r,!0)),A.test(i[1])&&w.isPlainObject(t))for(i in t)g(this[i])?this[i](t[i]):this.attr(i,t[i]);return this}return(o=r.getElementById(i[2]))&&(this[0]=o,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):g(e)?void 0!==n.ready?n.ready(e):e(w):w.makeArray(e,this)}).prototype=w.fn,q=w(r);var H=/^(?:parents|prev(?:Until|All))/,O={children:!0,contents:!0,next:!0,prev:!0};w.fn.extend({has:function(e){var t=w(e,this),n=t.length;return this.filter(function(){for(var e=0;e-1:1===n.nodeType&&w.find.matchesSelector(n,e))){o.push(n);break}return this.pushStack(o.length>1?w.uniqueSort(o):o)},index:function(e){return e?"string"==typeof e?u.call(w(e),this[0]):u.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(w.uniqueSort(w.merge(this.get(),w(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}});function P(e,t){while((e=e[t])&&1!==e.nodeType);return e}w.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return k(e,"parentNode")},parentsUntil:function(e,t,n){return k(e,"parentNode",n)},next:function(e){return P(e,"nextSibling")},prev:function(e){return P(e,"previousSibling")},nextAll:function(e){return k(e,"nextSibling")},prevAll:function(e){return k(e,"previousSibling")},nextUntil:function(e,t,n){return k(e,"nextSibling",n)},prevUntil:function(e,t,n){return k(e,"previousSibling",n)},siblings:function(e){return S((e.parentNode||{}).firstChild,e)},children:function(e){return S(e.firstChild)},contents:function(e){return N(e,"iframe")?e.contentDocument:(N(e,"template")&&(e=e.content||e),w.merge([],e.childNodes))}},function(e,t){w.fn[e]=function(n,r){var i=w.map(this,t,n);return"Until"!==e.slice(-5)&&(r=n),r&&"string"==typeof r&&(i=w.filter(r,i)),this.length>1&&(O[e]||w.uniqueSort(i),H.test(e)&&i.reverse()),this.pushStack(i)}});var M=/[^\x20\t\r\n\f]+/g;function R(e){var t={};return w.each(e.match(M)||[],function(e,n){t[n]=!0}),t}w.Callbacks=function(e){e="string"==typeof e?R(e):w.extend({},e);var t,n,r,i,o=[],a=[],s=-1,u=function(){for(i=i||e.once,r=t=!0;a.length;s=-1){n=a.shift();while(++s-1)o.splice(n,1),n<=s&&s--}),this},has:function(e){return e?w.inArray(e,o)>-1:o.length>0},empty:function(){return o&&(o=[]),this},disable:function(){return i=a=[],o=n="",this},disabled:function(){return!o},lock:function(){return i=a=[],n||t||(o=n=""),this},locked:function(){return!!i},fireWith:function(e,n){return i||(n=[e,(n=n||[]).slice?n.slice():n],a.push(n),t||u()),this},fire:function(){return l.fireWith(this,arguments),this},fired:function(){return!!r}};return l};function I(e){return e}function W(e){throw e}function $(e,t,n,r){var i;try{e&&g(i=e.promise)?i.call(e).done(t).fail(n):e&&g(i=e.then)?i.call(e,t,n):t.apply(void 0,[e].slice(r))}catch(e){n.apply(void 0,[e])}}w.extend({Deferred:function(t){var n=[["notify","progress",w.Callbacks("memory"),w.Callbacks("memory"),2],["resolve","done",w.Callbacks("once memory"),w.Callbacks("once memory"),0,"resolved"],["reject","fail",w.Callbacks("once memory"),w.Callbacks("once memory"),1,"rejected"]],r="pending",i={state:function(){return r},always:function(){return o.done(arguments).fail(arguments),this},"catch":function(e){return i.then(null,e)},pipe:function(){var e=arguments;return w.Deferred(function(t){w.each(n,function(n,r){var i=g(e[r[4]])&&e[r[4]];o[r[1]](function(){var e=i&&i.apply(this,arguments);e&&g(e.promise)?e.promise().progress(t.notify).done(t.resolve).fail(t.reject):t[r[0]+"With"](this,i?[e]:arguments)})}),e=null}).promise()},then:function(t,r,i){var o=0;function a(t,n,r,i){return function(){var s=this,u=arguments,l=function(){var e,l;if(!(t=o&&(r!==W&&(s=void 0,u=[e]),n.rejectWith(s,u))}};t?c():(w.Deferred.getStackHook&&(c.stackTrace=w.Deferred.getStackHook()),e.setTimeout(c))}}return w.Deferred(function(e){n[0][3].add(a(0,e,g(i)?i:I,e.notifyWith)),n[1][3].add(a(0,e,g(t)?t:I)),n[2][3].add(a(0,e,g(r)?r:W))}).promise()},promise:function(e){return null!=e?w.extend(e,i):i}},o={};return w.each(n,function(e,t){var a=t[2],s=t[5];i[t[1]]=a.add,s&&a.add(function(){r=s},n[3-e][2].disable,n[3-e][3].disable,n[0][2].lock,n[0][3].lock),a.add(t[3].fire),o[t[0]]=function(){return o[t[0]+"With"](this===o?void 0:this,arguments),this},o[t[0]+"With"]=a.fireWith}),i.promise(o),t&&t.call(o,o),o},when:function(e){var t=arguments.length,n=t,r=Array(n),i=o.call(arguments),a=w.Deferred(),s=function(e){return function(n){r[e]=this,i[e]=arguments.length>1?o.call(arguments):n,--t||a.resolveWith(r,i)}};if(t<=1&&($(e,a.done(s(n)).resolve,a.reject,!t),"pending"===a.state()||g(i[n]&&i[n].then)))return a.then();while(n--)$(i[n],s(n),a.reject);return a.promise()}});var B=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;w.Deferred.exceptionHook=function(t,n){e.console&&e.console.warn&&t&&B.test(t.name)&&e.console.warn("jQuery.Deferred exception: "+t.message,t.stack,n)},w.readyException=function(t){e.setTimeout(function(){throw t})};var F=w.Deferred();w.fn.ready=function(e){return F.then(e)["catch"](function(e){w.readyException(e)}),this},w.extend({isReady:!1,readyWait:1,ready:function(e){(!0===e?--w.readyWait:w.isReady)||(w.isReady=!0,!0!==e&&--w.readyWait>0||F.resolveWith(r,[w]))}}),w.ready.then=F.then;function _(){r.removeEventListener("DOMContentLoaded",_),e.removeEventListener("load",_),w.ready()}"complete"===r.readyState||"loading"!==r.readyState&&!r.documentElement.doScroll?e.setTimeout(w.ready):(r.addEventListener("DOMContentLoaded",_),e.addEventListener("load",_));var z=function(e,t,n,r,i,o,a){var s=0,u=e.length,l=null==n;if("object"===x(n)){i=!0;for(s in n)z(e,t,s,n[s],!0,o,a)}else if(void 0!==r&&(i=!0,g(r)||(a=!0),l&&(a?(t.call(e,r),t=null):(l=t,t=function(e,t,n){return l.call(w(e),n)})),t))for(;s1,null,!0)},removeData:function(e){return this.each(function(){K.remove(this,e)})}}),w.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=J.get(e,t),n&&(!r||Array.isArray(n)?r=J.access(e,t,w.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=w.queue(e,t),r=n.length,i=n.shift(),o=w._queueHooks(e,t),a=function(){w.dequeue(e,t)};"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,a,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return J.get(e,n)||J.access(e,n,{empty:w.Callbacks("once memory").add(function(){J.remove(e,[t+"queue",n])})})}}),w.fn.extend({queue:function(e,t){var n=2;return"string"!=typeof e&&(t=e,e="fx",n--),arguments.length\x20\t\r\n\f]+)/i,he=/^$|^module$|\/(?:java|ecma)script/i,ge={option:[1,""],thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};ge.optgroup=ge.option,ge.tbody=ge.tfoot=ge.colgroup=ge.caption=ge.thead,ge.th=ge.td;function ye(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&N(e,t)?w.merge([e],n):n}function ve(e,t){for(var n=0,r=e.length;n-1)i&&i.push(o);else if(l=w.contains(o.ownerDocument,o),a=ye(f.appendChild(o),"script"),l&&ve(a),n){c=0;while(o=a[c++])he.test(o.type||"")&&n.push(o)}return f}!function(){var e=r.createDocumentFragment().appendChild(r.createElement("div")),t=r.createElement("input");t.setAttribute("type","radio"),t.setAttribute("checked","checked"),t.setAttribute("name","t"),e.appendChild(t),h.checkClone=e.cloneNode(!0).cloneNode(!0).lastChild.checked,e.innerHTML="",h.noCloneChecked=!!e.cloneNode(!0).lastChild.defaultValue}();var be=r.documentElement,we=/^key/,Te=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ce=/^([^.]*)(?:\.(.+)|)/;function Ee(){return!0}function ke(){return!1}function Se(){try{return r.activeElement}catch(e){}}function De(e,t,n,r,i,o){var a,s;if("object"==typeof t){"string"!=typeof n&&(r=r||n,n=void 0);for(s in t)De(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=ke;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return w().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=w.guid++)),e.each(function(){w.event.add(this,t,i,r,n)})}w.event={global:{},add:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,y=J.get(e);if(y){n.handler&&(n=(o=n).handler,i=o.selector),i&&w.find.matchesSelector(be,i),n.guid||(n.guid=w.guid++),(u=y.events)||(u=y.events={}),(a=y.handle)||(a=y.handle=function(t){return"undefined"!=typeof w&&w.event.triggered!==t.type?w.event.dispatch.apply(e,arguments):void 0}),l=(t=(t||"").match(M)||[""]).length;while(l--)d=g=(s=Ce.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=w.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=w.event.special[d]||{},c=w.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&w.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(e,r,h,a)||e.addEventListener&&e.addEventListener(d,a)),f.add&&(f.add.call(e,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),w.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,y=J.hasData(e)&&J.get(e);if(y&&(u=y.events)){l=(t=(t||"").match(M)||[""]).length;while(l--)if(s=Ce.exec(t[l])||[],d=g=s[1],h=(s[2]||"").split(".").sort(),d){f=w.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,y.handle)||w.removeEvent(e,d,y.handle),delete u[d])}else for(d in u)w.event.remove(e,d+t[l],n,r,!0);w.isEmptyObject(u)&&J.remove(e,"handle events")}},dispatch:function(e){var t=w.event.fix(e),n,r,i,o,a,s,u=new Array(arguments.length),l=(J.get(this,"events")||{})[t.type]||[],c=w.event.special[t.type]||{};for(u[0]=t,n=1;n=1))for(;l!==this;l=l.parentNode||this)if(1===l.nodeType&&("click"!==e.type||!0!==l.disabled)){for(o=[],a={},n=0;n-1:w.find(i,this,null,[l]).length),a[i]&&o.push(r);o.length&&s.push({elem:l,handlers:o})}return l=this,u\x20\t\r\n\f]*)[^>]*)\/>/gi,Ae=/\s*$/g;function Le(e,t){return N(e,"table")&&N(11!==t.nodeType?t:t.firstChild,"tr")?w(e).children("tbody")[0]||e:e}function He(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Oe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Pe(e,t){var n,r,i,o,a,s,u,l;if(1===t.nodeType){if(J.hasData(e)&&(o=J.access(e),a=J.set(t,o),l=o.events)){delete a.handle,a.events={};for(i in l)for(n=0,r=l[i].length;n1&&"string"==typeof y&&!h.checkClone&&je.test(y))return e.each(function(i){var o=e.eq(i);v&&(t[0]=y.call(this,i,o.html())),Re(o,t,n,r)});if(p&&(i=xe(t,e[0].ownerDocument,!1,e,r),o=i.firstChild,1===i.childNodes.length&&(i=o),o||r)){for(u=(s=w.map(ye(i,"script"),He)).length;f")},clone:function(e,t,n){var r,i,o,a,s=e.cloneNode(!0),u=w.contains(e.ownerDocument,e);if(!(h.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||w.isXMLDoc(e)))for(a=ye(s),r=0,i=(o=ye(e)).length;r0&&ve(a,!u&&ye(e,"script")),s},cleanData:function(e){for(var t,n,r,i=w.event.special,o=0;void 0!==(n=e[o]);o++)if(Y(n)){if(t=n[J.expando]){if(t.events)for(r in t.events)i[r]?w.event.remove(n,r):w.removeEvent(n,r,t.handle);n[J.expando]=void 0}n[K.expando]&&(n[K.expando]=void 0)}}}),w.fn.extend({detach:function(e){return Ie(this,e,!0)},remove:function(e){return Ie(this,e)},text:function(e){return z(this,function(e){return void 0===e?w.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=e)})},null,e,arguments.length)},append:function(){return Re(this,arguments,function(e){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||Le(this,e).appendChild(e)})},prepend:function(){return Re(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=Le(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return Re(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return Re(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++)1===e.nodeType&&(w.cleanData(ye(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return w.clone(this,e,t)})},html:function(e){return z(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e&&1===t.nodeType)return t.innerHTML;if("string"==typeof e&&!Ae.test(e)&&!ge[(de.exec(e)||["",""])[1].toLowerCase()]){e=w.htmlPrefilter(e);try{for(;n=0&&(u+=Math.max(0,Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-o-u-s-.5))),u}function et(e,t,n){var r=$e(e),i=Fe(e,t,r),o="border-box"===w.css(e,"boxSizing",!1,r),a=o;if(We.test(i)){if(!n)return i;i="auto"}return a=a&&(h.boxSizingReliable()||i===e.style[t]),("auto"===i||!parseFloat(i)&&"inline"===w.css(e,"display",!1,r))&&(i=e["offset"+t[0].toUpperCase()+t.slice(1)],a=!0),(i=parseFloat(i)||0)+Ze(e,t,n||(o?"border":"content"),a,r,i)+"px"}w.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Fe(e,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,a,s=G(t),u=Xe.test(t),l=e.style;if(u||(t=Je(s)),a=w.cssHooks[t]||w.cssHooks[s],void 0===n)return a&&"get"in a&&void 0!==(i=a.get(e,!1,r))?i:l[t];"string"==(o=typeof n)&&(i=ie.exec(n))&&i[1]&&(n=ue(e,t,i),o="number"),null!=n&&n===n&&("number"===o&&(n+=i&&i[3]||(w.cssNumber[s]?"":"px")),h.clearCloneStyle||""!==n||0!==t.indexOf("background")||(l[t]="inherit"),a&&"set"in a&&void 0===(n=a.set(e,n,r))||(u?l.setProperty(t,n):l[t]=n))}},css:function(e,t,n,r){var i,o,a,s=G(t);return Xe.test(t)||(t=Je(s)),(a=w.cssHooks[t]||w.cssHooks[s])&&"get"in a&&(i=a.get(e,!0,n)),void 0===i&&(i=Fe(e,t,r)),"normal"===i&&t in Ve&&(i=Ve[t]),""===n||n?(o=parseFloat(i),!0===n||isFinite(o)?o||0:i):i}}),w.each(["height","width"],function(e,t){w.cssHooks[t]={get:function(e,n,r){if(n)return!ze.test(w.css(e,"display"))||e.getClientRects().length&&e.getBoundingClientRect().width?et(e,t,r):se(e,Ue,function(){return et(e,t,r)})},set:function(e,n,r){var i,o=$e(e),a="border-box"===w.css(e,"boxSizing",!1,o),s=r&&Ze(e,t,r,a,o);return a&&h.scrollboxSize()===o.position&&(s-=Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-parseFloat(o[t])-Ze(e,t,"border",!1,o)-.5)),s&&(i=ie.exec(n))&&"px"!==(i[3]||"px")&&(e.style[t]=n,n=w.css(e,t)),Ke(e,n,s)}}}),w.cssHooks.marginLeft=_e(h.reliableMarginLeft,function(e,t){if(t)return(parseFloat(Fe(e,"marginLeft"))||e.getBoundingClientRect().left-se(e,{marginLeft:0},function(){return e.getBoundingClientRect().left}))+"px"}),w.each({margin:"",padding:"",border:"Width"},function(e,t){w.cssHooks[e+t]={expand:function(n){for(var r=0,i={},o="string"==typeof n?n.split(" "):[n];r<4;r++)i[e+oe[r]+t]=o[r]||o[r-2]||o[0];return i}},"margin"!==e&&(w.cssHooks[e+t].set=Ke)}),w.fn.extend({css:function(e,t){return z(this,function(e,t,n){var r,i,o={},a=0;if(Array.isArray(t)){for(r=$e(e),i=t.length;a1)}});function tt(e,t,n,r,i){return new tt.prototype.init(e,t,n,r,i)}w.Tween=tt,tt.prototype={constructor:tt,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||w.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(w.cssNumber[n]?"":"px")},cur:function(){var e=tt.propHooks[this.prop];return e&&e.get?e.get(this):tt.propHooks._default.get(this)},run:function(e){var t,n=tt.propHooks[this.prop];return this.options.duration?this.pos=t=w.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):tt.propHooks._default.set(this),this}},tt.prototype.init.prototype=tt.prototype,tt.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=w.css(e.elem,e.prop,""))&&"auto"!==t?t:0},set:function(e){w.fx.step[e.prop]?w.fx.step[e.prop](e):1!==e.elem.nodeType||null==e.elem.style[w.cssProps[e.prop]]&&!w.cssHooks[e.prop]?e.elem[e.prop]=e.now:w.style(e.elem,e.prop,e.now+e.unit)}}},tt.propHooks.scrollTop=tt.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},w.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:"swing"},w.fx=tt.prototype.init,w.fx.step={};var nt,rt,it=/^(?:toggle|show|hide)$/,ot=/queueHooks$/;function at(){rt&&(!1===r.hidden&&e.requestAnimationFrame?e.requestAnimationFrame(at):e.setTimeout(at,w.fx.interval),w.fx.tick())}function st(){return e.setTimeout(function(){nt=void 0}),nt=Date.now()}function ut(e,t){var n,r=0,i={height:e};for(t=t?1:0;r<4;r+=2-t)i["margin"+(n=oe[r])]=i["padding"+n]=e;return t&&(i.opacity=i.width=e),i}function lt(e,t,n){for(var r,i=(pt.tweeners[t]||[]).concat(pt.tweeners["*"]),o=0,a=i.length;o1)},removeAttr:function(e){return this.each(function(){w.removeAttr(this,e)})}}),w.extend({attr:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return"undefined"==typeof e.getAttribute?w.prop(e,t,n):(1===o&&w.isXMLDoc(e)||(i=w.attrHooks[t.toLowerCase()]||(w.expr.match.bool.test(t)?dt:void 0)),void 0!==n?null===n?void w.removeAttr(e,t):i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:(e.setAttribute(t,n+""),n):i&&"get"in i&&null!==(r=i.get(e,t))?r:null==(r=w.find.attr(e,t))?void 0:r)},attrHooks:{type:{set:function(e,t){if(!h.radioValue&&"radio"===t&&N(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r=0,i=t&&t.match(M);if(i&&1===e.nodeType)while(n=i[r++])e.removeAttribute(n)}}),dt={set:function(e,t,n){return!1===t?w.removeAttr(e,n):e.setAttribute(n,n),n}},w.each(w.expr.match.bool.source.match(/\w+/g),function(e,t){var n=ht[t]||w.find.attr;ht[t]=function(e,t,r){var i,o,a=t.toLowerCase();return r||(o=ht[a],ht[a]=i,i=null!=n(e,t,r)?a:null,ht[a]=o),i}});var gt=/^(?:input|select|textarea|button)$/i,yt=/^(?:a|area)$/i;w.fn.extend({prop:function(e,t){return z(this,w.prop,e,t,arguments.length>1)},removeProp:function(e){return this.each(function(){delete this[w.propFix[e]||e]})}}),w.extend({prop:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return 1===o&&w.isXMLDoc(e)||(t=w.propFix[t]||t,i=w.propHooks[t]),void 0!==n?i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=w.find.attr(e,"tabindex");return t?parseInt(t,10):gt.test(e.nodeName)||yt.test(e.nodeName)&&e.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),h.optSelected||(w.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),w.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){w.propFix[this.toLowerCase()]=this});function vt(e){return(e.match(M)||[]).join(" ")}function mt(e){return e.getAttribute&&e.getAttribute("class")||""}function xt(e){return Array.isArray(e)?e:"string"==typeof e?e.match(M)||[]:[]}w.fn.extend({addClass:function(e){var t,n,r,i,o,a,s,u=0;if(g(e))return this.each(function(t){w(this).addClass(e.call(this,t,mt(this)))});if((t=xt(e)).length)while(n=this[u++])if(i=mt(n),r=1===n.nodeType&&" "+vt(i)+" "){a=0;while(o=t[a++])r.indexOf(" "+o+" ")<0&&(r+=o+" ");i!==(s=vt(r))&&n.setAttribute("class",s)}return this},removeClass:function(e){var t,n,r,i,o,a,s,u=0;if(g(e))return this.each(function(t){w(this).removeClass(e.call(this,t,mt(this)))});if(!arguments.length)return this.attr("class","");if((t=xt(e)).length)while(n=this[u++])if(i=mt(n),r=1===n.nodeType&&" "+vt(i)+" "){a=0;while(o=t[a++])while(r.indexOf(" "+o+" ")>-1)r=r.replace(" "+o+" "," ");i!==(s=vt(r))&&n.setAttribute("class",s)}return this},toggleClass:function(e,t){var n=typeof e,r="string"===n||Array.isArray(e);return"boolean"==typeof t&&r?t?this.addClass(e):this.removeClass(e):g(e)?this.each(function(n){w(this).toggleClass(e.call(this,n,mt(this),t),t)}):this.each(function(){var t,i,o,a;if(r){i=0,o=w(this),a=xt(e);while(t=a[i++])o.hasClass(t)?o.removeClass(t):o.addClass(t)}else void 0!==e&&"boolean"!==n||((t=mt(this))&&J.set(this,"__className__",t),this.setAttribute&&this.setAttribute("class",t||!1===e?"":J.get(this,"__className__")||""))})},hasClass:function(e){var t,n,r=0;t=" "+e+" ";while(n=this[r++])if(1===n.nodeType&&(" "+vt(mt(n))+" ").indexOf(t)>-1)return!0;return!1}});var bt=/\r/g;w.fn.extend({val:function(e){var t,n,r,i=this[0];{if(arguments.length)return r=g(e),this.each(function(n){var i;1===this.nodeType&&(null==(i=r?e.call(this,n,w(this).val()):e)?i="":"number"==typeof i?i+="":Array.isArray(i)&&(i=w.map(i,function(e){return null==e?"":e+""})),(t=w.valHooks[this.type]||w.valHooks[this.nodeName.toLowerCase()])&&"set"in t&&void 0!==t.set(this,i,"value")||(this.value=i))});if(i)return(t=w.valHooks[i.type]||w.valHooks[i.nodeName.toLowerCase()])&&"get"in t&&void 0!==(n=t.get(i,"value"))?n:"string"==typeof(n=i.value)?n.replace(bt,""):null==n?"":n}}}),w.extend({valHooks:{option:{get:function(e){var t=w.find.attr(e,"value");return null!=t?t:vt(w.text(e))}},select:{get:function(e){var t,n,r,i=e.options,o=e.selectedIndex,a="select-one"===e.type,s=a?null:[],u=a?o+1:i.length;for(r=o<0?u:a?o:0;r-1)&&(n=!0);return n||(e.selectedIndex=-1),o}}}}),w.each(["radio","checkbox"],function(){w.valHooks[this]={set:function(e,t){if(Array.isArray(t))return e.checked=w.inArray(w(e).val(),t)>-1}},h.checkOn||(w.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})}),h.focusin="onfocusin"in e;var wt=/^(?:focusinfocus|focusoutblur)$/,Tt=function(e){e.stopPropagation()};w.extend(w.event,{trigger:function(t,n,i,o){var a,s,u,l,c,p,d,h,v=[i||r],m=f.call(t,"type")?t.type:t,x=f.call(t,"namespace")?t.namespace.split("."):[];if(s=h=u=i=i||r,3!==i.nodeType&&8!==i.nodeType&&!wt.test(m+w.event.triggered)&&(m.indexOf(".")>-1&&(m=(x=m.split(".")).shift(),x.sort()),c=m.indexOf(":")<0&&"on"+m,t=t[w.expando]?t:new w.Event(m,"object"==typeof t&&t),t.isTrigger=o?2:3,t.namespace=x.join("."),t.rnamespace=t.namespace?new RegExp("(^|\\.)"+x.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,t.result=void 0,t.target||(t.target=i),n=null==n?[t]:w.makeArray(n,[t]),d=w.event.special[m]||{},o||!d.trigger||!1!==d.trigger.apply(i,n))){if(!o&&!d.noBubble&&!y(i)){for(l=d.delegateType||m,wt.test(l+m)||(s=s.parentNode);s;s=s.parentNode)v.push(s),u=s;u===(i.ownerDocument||r)&&v.push(u.defaultView||u.parentWindow||e)}a=0;while((s=v[a++])&&!t.isPropagationStopped())h=s,t.type=a>1?l:d.bindType||m,(p=(J.get(s,"events")||{})[t.type]&&J.get(s,"handle"))&&p.apply(s,n),(p=c&&s[c])&&p.apply&&Y(s)&&(t.result=p.apply(s,n),!1===t.result&&t.preventDefault());return t.type=m,o||t.isDefaultPrevented()||d._default&&!1!==d._default.apply(v.pop(),n)||!Y(i)||c&&g(i[m])&&!y(i)&&((u=i[c])&&(i[c]=null),w.event.triggered=m,t.isPropagationStopped()&&h.addEventListener(m,Tt),i[m](),t.isPropagationStopped()&&h.removeEventListener(m,Tt),w.event.triggered=void 0,u&&(i[c]=u)),t.result}},simulate:function(e,t,n){var r=w.extend(new w.Event,n,{type:e,isSimulated:!0});w.event.trigger(r,null,t)}}),w.fn.extend({trigger:function(e,t){return this.each(function(){w.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];if(n)return w.event.trigger(e,t,n,!0)}}),h.focusin||w.each({focus:"focusin",blur:"focusout"},function(e,t){var n=function(e){w.event.simulate(t,e.target,w.event.fix(e))};w.event.special[t]={setup:function(){var r=this.ownerDocument||this,i=J.access(r,t);i||r.addEventListener(e,n,!0),J.access(r,t,(i||0)+1)},teardown:function(){var r=this.ownerDocument||this,i=J.access(r,t)-1;i?J.access(r,t,i):(r.removeEventListener(e,n,!0),J.remove(r,t))}}});var Ct=e.location,Et=Date.now(),kt=/\?/;w.parseXML=function(t){var n;if(!t||"string"!=typeof t)return null;try{n=(new e.DOMParser).parseFromString(t,"text/xml")}catch(e){n=void 0}return n&&!n.getElementsByTagName("parsererror").length||w.error("Invalid XML: "+t),n};var St=/\[\]$/,Dt=/\r?\n/g,Nt=/^(?:submit|button|image|reset|file)$/i,At=/^(?:input|select|textarea|keygen)/i;function jt(e,t,n,r){var i;if(Array.isArray(t))w.each(t,function(t,i){n||St.test(e)?r(e,i):jt(e+"["+("object"==typeof i&&null!=i?t:"")+"]",i,n,r)});else if(n||"object"!==x(t))r(e,t);else for(i in t)jt(e+"["+i+"]",t[i],n,r)}w.param=function(e,t){var n,r=[],i=function(e,t){var n=g(t)?t():t;r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(null==n?"":n)};if(Array.isArray(e)||e.jquery&&!w.isPlainObject(e))w.each(e,function(){i(this.name,this.value)});else for(n in e)jt(n,e[n],t,i);return r.join("&")},w.fn.extend({serialize:function(){return w.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=w.prop(this,"elements");return e?w.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!w(this).is(":disabled")&&At.test(this.nodeName)&&!Nt.test(e)&&(this.checked||!pe.test(e))}).map(function(e,t){var n=w(this).val();return null==n?null:Array.isArray(n)?w.map(n,function(e){return{name:t.name,value:e.replace(Dt,"\r\n")}}):{name:t.name,value:n.replace(Dt,"\r\n")}}).get()}});var qt=/%20/g,Lt=/#.*$/,Ht=/([?&])_=[^&]*/,Ot=/^(.*?):[ \t]*([^\r\n]*)$/gm,Pt=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Mt=/^(?:GET|HEAD)$/,Rt=/^\/\//,It={},Wt={},$t="*/".concat("*"),Bt=r.createElement("a");Bt.href=Ct.href;function Ft(e){return function(t,n){"string"!=typeof t&&(n=t,t="*");var r,i=0,o=t.toLowerCase().match(M)||[];if(g(n))while(r=o[i++])"+"===r[0]?(r=r.slice(1)||"*",(e[r]=e[r]||[]).unshift(n)):(e[r]=e[r]||[]).push(n)}}function _t(e,t,n,r){var i={},o=e===Wt;function a(s){var u;return i[s]=!0,w.each(e[s]||[],function(e,s){var l=s(t,n,r);return"string"!=typeof l||o||i[l]?o?!(u=l):void 0:(t.dataTypes.unshift(l),a(l),!1)}),u}return a(t.dataTypes[0])||!i["*"]&&a("*")}function zt(e,t){var n,r,i=w.ajaxSettings.flatOptions||{};for(n in t)void 0!==t[n]&&((i[n]?e:r||(r={}))[n]=t[n]);return r&&w.extend(!0,e,r),e}function Xt(e,t,n){var r,i,o,a,s=e.contents,u=e.dataTypes;while("*"===u[0])u.shift(),void 0===r&&(r=e.mimeType||t.getResponseHeader("Content-Type"));if(r)for(i in s)if(s[i]&&s[i].test(r)){u.unshift(i);break}if(u[0]in n)o=u[0];else{for(i in n){if(!u[0]||e.converters[i+" "+u[0]]){o=i;break}a||(a=i)}o=o||a}if(o)return o!==u[0]&&u.unshift(o),n[o]}function Ut(e,t,n,r){var i,o,a,s,u,l={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)l[a.toLowerCase()]=e.converters[a];o=c.shift();while(o)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!u&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u=o,o=c.shift())if("*"===o)o=u;else if("*"!==u&&u!==o){if(!(a=l[u+" "+o]||l["* "+o]))for(i in l)if((s=i.split(" "))[1]===o&&(a=l[u+" "+s[0]]||l["* "+s[0]])){!0===a?a=l[i]:!0!==l[i]&&(o=s[0],c.unshift(s[1]));break}if(!0!==a)if(a&&e["throws"])t=a(t);else try{t=a(t)}catch(e){return{state:"parsererror",error:a?e:"No conversion from "+u+" to "+o}}}return{state:"success",data:t}}w.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Ct.href,type:"GET",isLocal:Pt.test(Ct.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":$t,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":w.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?zt(zt(e,w.ajaxSettings),t):zt(w.ajaxSettings,e)},ajaxPrefilter:Ft(It),ajaxTransport:Ft(Wt),ajax:function(t,n){"object"==typeof t&&(n=t,t=void 0),n=n||{};var i,o,a,s,u,l,c,f,p,d,h=w.ajaxSetup({},n),g=h.context||h,y=h.context&&(g.nodeType||g.jquery)?w(g):w.event,v=w.Deferred(),m=w.Callbacks("once memory"),x=h.statusCode||{},b={},T={},C="canceled",E={readyState:0,getResponseHeader:function(e){var t;if(c){if(!s){s={};while(t=Ot.exec(a))s[t[1].toLowerCase()]=t[2]}t=s[e.toLowerCase()]}return null==t?null:t},getAllResponseHeaders:function(){return c?a:null},setRequestHeader:function(e,t){return null==c&&(e=T[e.toLowerCase()]=T[e.toLowerCase()]||e,b[e]=t),this},overrideMimeType:function(e){return null==c&&(h.mimeType=e),this},statusCode:function(e){var t;if(e)if(c)E.always(e[E.status]);else for(t in e)x[t]=[x[t],e[t]];return this},abort:function(e){var t=e||C;return i&&i.abort(t),k(0,t),this}};if(v.promise(E),h.url=((t||h.url||Ct.href)+"").replace(Rt,Ct.protocol+"//"),h.type=n.method||n.type||h.method||h.type,h.dataTypes=(h.dataType||"*").toLowerCase().match(M)||[""],null==h.crossDomain){l=r.createElement("a");try{l.href=h.url,l.href=l.href,h.crossDomain=Bt.protocol+"//"+Bt.host!=l.protocol+"//"+l.host}catch(e){h.crossDomain=!0}}if(h.data&&h.processData&&"string"!=typeof h.data&&(h.data=w.param(h.data,h.traditional)),_t(It,h,n,E),c)return E;(f=w.event&&h.global)&&0==w.active++&&w.event.trigger("ajaxStart"),h.type=h.type.toUpperCase(),h.hasContent=!Mt.test(h.type),o=h.url.replace(Lt,""),h.hasContent?h.data&&h.processData&&0===(h.contentType||"").indexOf("application/x-www-form-urlencoded")&&(h.data=h.data.replace(qt,"+")):(d=h.url.slice(o.length),h.data&&(h.processData||"string"==typeof h.data)&&(o+=(kt.test(o)?"&":"?")+h.data,delete h.data),!1===h.cache&&(o=o.replace(Ht,"$1"),d=(kt.test(o)?"&":"?")+"_="+Et+++d),h.url=o+d),h.ifModified&&(w.lastModified[o]&&E.setRequestHeader("If-Modified-Since",w.lastModified[o]),w.etag[o]&&E.setRequestHeader("If-None-Match",w.etag[o])),(h.data&&h.hasContent&&!1!==h.contentType||n.contentType)&&E.setRequestHeader("Content-Type",h.contentType),E.setRequestHeader("Accept",h.dataTypes[0]&&h.accepts[h.dataTypes[0]]?h.accepts[h.dataTypes[0]]+("*"!==h.dataTypes[0]?", "+$t+"; q=0.01":""):h.accepts["*"]);for(p in h.headers)E.setRequestHeader(p,h.headers[p]);if(h.beforeSend&&(!1===h.beforeSend.call(g,E,h)||c))return E.abort();if(C="abort",m.add(h.complete),E.done(h.success),E.fail(h.error),i=_t(Wt,h,n,E)){if(E.readyState=1,f&&y.trigger("ajaxSend",[E,h]),c)return E;h.async&&h.timeout>0&&(u=e.setTimeout(function(){E.abort("timeout")},h.timeout));try{c=!1,i.send(b,k)}catch(e){if(c)throw e;k(-1,e)}}else k(-1,"No Transport");function k(t,n,r,s){var l,p,d,b,T,C=n;c||(c=!0,u&&e.clearTimeout(u),i=void 0,a=s||"",E.readyState=t>0?4:0,l=t>=200&&t<300||304===t,r&&(b=Xt(h,E,r)),b=Ut(h,b,E,l),l?(h.ifModified&&((T=E.getResponseHeader("Last-Modified"))&&(w.lastModified[o]=T),(T=E.getResponseHeader("etag"))&&(w.etag[o]=T)),204===t||"HEAD"===h.type?C="nocontent":304===t?C="notmodified":(C=b.state,p=b.data,l=!(d=b.error))):(d=C,!t&&C||(C="error",t<0&&(t=0))),E.status=t,E.statusText=(n||C)+"",l?v.resolveWith(g,[p,C,E]):v.rejectWith(g,[E,C,d]),E.statusCode(x),x=void 0,f&&y.trigger(l?"ajaxSuccess":"ajaxError",[E,h,l?p:d]),m.fireWith(g,[E,C]),f&&(y.trigger("ajaxComplete",[E,h]),--w.active||w.event.trigger("ajaxStop")))}return E},getJSON:function(e,t,n){return w.get(e,t,n,"json")},getScript:function(e,t){return w.get(e,void 0,t,"script")}}),w.each(["get","post"],function(e,t){w[t]=function(e,n,r,i){return g(n)&&(i=i||r,r=n,n=void 0),w.ajax(w.extend({url:e,type:t,dataType:i,data:n,success:r},w.isPlainObject(e)&&e))}}),w._evalUrl=function(e){return w.ajax({url:e,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,"throws":!0})},w.fn.extend({wrapAll:function(e){var t;return this[0]&&(g(e)&&(e=e.call(this[0])),t=w(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstElementChild)e=e.firstElementChild;return e}).append(this)),this},wrapInner:function(e){return g(e)?this.each(function(t){w(this).wrapInner(e.call(this,t))}):this.each(function(){var t=w(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=g(e);return this.each(function(n){w(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(e){return this.parent(e).not("body").each(function(){w(this).replaceWith(this.childNodes)}),this}}),w.expr.pseudos.hidden=function(e){return!w.expr.pseudos.visible(e)},w.expr.pseudos.visible=function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)},w.ajaxSettings.xhr=function(){try{return new e.XMLHttpRequest}catch(e){}};var Vt={0:200,1223:204},Gt=w.ajaxSettings.xhr();h.cors=!!Gt&&"withCredentials"in Gt,h.ajax=Gt=!!Gt,w.ajaxTransport(function(t){var n,r;if(h.cors||Gt&&!t.crossDomain)return{send:function(i,o){var a,s=t.xhr();if(s.open(t.type,t.url,t.async,t.username,t.password),t.xhrFields)for(a in t.xhrFields)s[a]=t.xhrFields[a];t.mimeType&&s.overrideMimeType&&s.overrideMimeType(t.mimeType),t.crossDomain||i["X-Requested-With"]||(i["X-Requested-With"]="XMLHttpRequest");for(a in i)s.setRequestHeader(a,i[a]);n=function(e){return function(){n&&(n=r=s.onload=s.onerror=s.onabort=s.ontimeout=s.onreadystatechange=null,"abort"===e?s.abort():"error"===e?"number"!=typeof s.status?o(0,"error"):o(s.status,s.statusText):o(Vt[s.status]||s.status,s.statusText,"text"!==(s.responseType||"text")||"string"!=typeof s.responseText?{binary:s.response}:{text:s.responseText},s.getAllResponseHeaders()))}},s.onload=n(),r=s.onerror=s.ontimeout=n("error"),void 0!==s.onabort?s.onabort=r:s.onreadystatechange=function(){4===s.readyState&&e.setTimeout(function(){n&&r()})},n=n("abort");try{s.send(t.hasContent&&t.data||null)}catch(e){if(n)throw e}},abort:function(){n&&n()}}}),w.ajaxPrefilter(function(e){e.crossDomain&&(e.contents.script=!1)}),w.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(e){return w.globalEval(e),e}}}),w.ajaxPrefilter("script",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET")}),w.ajaxTransport("script",function(e){if(e.crossDomain){var t,n;return{send:function(i,o){t=w(" + + + + + +

+ {% for item, value in words_and_tags.items() %} + {{words_and_tags[item]['POS']}}  + {% endfor %} +

+
+ + diff --git a/src/wordtagger/wordtagger.py b/src/wordtagger/wordtagger.py new file mode 100644 index 0000000..d2ae1f3 --- /dev/null +++ b/src/wordtagger/wordtagger.py @@ -0,0 +1,156 @@ +# LIBS +import nltk +import json +import os +from sys import stdin, stdout +from nltk import ne_chunk, pos_tag, word_tokenize +from nltk.sentiment.vader import SentimentIntensityAnalyzer +from nltk.corpus import stopwords +from jinja2 import Template + +# == INPUT AND TOKENIZE == +# Define input, tokenize and safe tokens to dictionary. Use index as ID for each word. +input = stdin.read() +words = nltk.word_tokenize(input) +words_and_tags = {'item ' + str(index) : {'word':word} for index , word in enumerate(words)} +print(words_and_tags) + +# == FILTER FUNCTIONS == + +# === 1. POS_tagger & Named Entity Recognizer === +# This function cuts a string into words. Then runs a POS tagger for each word. Returns a list with tags +def POS_tagger(list): + taggedwordlist = nltk.pos_tag(list) + + + for word, pos in nltk.pos_tag(list): + taggedwordlist = nltk.pos_tag(list) + #print('{0} is a {1}'.format(word,pos)) # Comment out to print the analysis step + print(taggedwordlist) + taglist = [ pos for word,pos in taggedwordlist ] + POS_tags = [] + + for tag in taglist: + if tag in {"NNP","NNS","NN","NNPS"}: + POS_tag = 'noun' + elif tag in {'VB','VBD','VBG','VBN','VBP','VBZ'}: + POS_tag = 'verb' + elif tag in {'RB','RBR','RBS','WRB'}: + POS_tag = 'adverb' + elif tag in {'PRP','PRP$'}: + POS_tag = 'pronoun' + elif tag in {'JJ','JJR','JJS'}: + POS_tag = 'adjective' + elif tag == 'IN': + POS_tag = 'preposition' + elif tag == 'WDT': + POS_tag = 'determiner' + elif tag in {'WP','WP$'}: + POS_tag = 'pronoun' + elif tag == 'UH': + POS_tag = 'interjection' + elif tag == 'POS': + POS_tag = 'possesive ending' + elif tag == 'SYM': + POS_tag = 'symbol' + elif tag == 'EX': + POS_tag = 'existential there' + elif tag == 'DT': + POS_tag = 'determiner' + elif tag == 'MD': + POS_tag = 'modal' + elif tag == 'LS': + POS_tag = 'list item marker' + elif tag == 'FW': + POS_tag = 'foreign word' + elif tag == 'CC': + POS_tag = 'coordinating conjunction ' + elif tag == 'CD': + POS_tag = 'cardinal number' + elif tag == 'TO': + POS_tag = 'to' + elif tag == '.': + POS_tag = 'line ending' + elif tag == ',': + POS_tag = 'comma' + else: + POS_tag = tag + POS_tags.append(POS_tag) + #print(POS_tag) + return POS_tags; + +# === 2. Sentiment tagger === +# Sentiment analyzer based on the NLTK VADER tagger. +# This function uses words as an input. It tags each word based on its sentiment: negative, neutral or positive +def sentiment_tagger(word): + analyzer = SentimentIntensityAnalyzer() + score = analyzer.polarity_scores(word).get("compound") + + if score < 0: + sentiment_tag = 'negative' + elif score > 0: + sentiment_tag = 'positive' + else: + sentiment_tag = 'neutral' + + return sentiment_tag + +# === 3. Stopword tagger === +# Labels words on being a keyword or a stopword, based on the list in the NLTK corpus +def stopword_tagger(word): + + stopWords = set(stopwords.words('english')) + + if word in stopWords: + stopword_tag = 'stopword' + else: + stopword_tag = 'keyword' + + return stopword_tag + + +# Run POS tagger +# This tagger outputs a list for all items in the dict at once +# To avoid double work, it is better to keep this outside the for loop +POS_tags = POS_tagger(words) +i = 0 + +# Adding tags to words in dictionary, which will be exported as a json file +# {'item 0' : {'word' : word, 'tagger 1': value 1}} +for item, value in words_and_tags.items(): + word = words_and_tags[item]['word'] + + # POS + pos_tag = POS_tags[i] + words_and_tags[item]['POS'] = pos_tag + i = i+1 + + # Add sentiment tag + sentiment_tag = sentiment_tagger(word) + words_and_tags[item]['sentiment'] = sentiment_tag + + # Add stopword tag + stopword_tag = stopword_tagger(word) + words_and_tags[item]['wordtype'] = stopword_tag + + # Add entity tag + # Not functional yet + +# Save data into a json file +print(words_and_tags) +#with open("data.json", 'w') as f: +with open(os.path.dirname(os.path.dirname(os.path.dirname( __file__ ))) + "output/wordtagger/data.json", 'w') as f: + json.dump(words_and_tags, f, ensure_ascii=False) + +#let's bind it to a jinja2 template +# Jinja moves up one level by default, so I do not need to do it myself as in line 141 +template_open = open("src/wordtagger/template.html", "r") +template = Template(template_open.read()) +index_render = template.render(words_and_tags=words_and_tags) +#print(text_render) + +# And render an html file! +print(index_render) +index_open = open("output/wordtagger/index.html", "w") +index_open.write(index_render) +index_open.close()