Loading of examples from my API.

This commit is contained in:
Ozbolt Menegatti 2020-05-19 18:54:29 +02:00
parent ad1c0a6a28
commit ee94ab8383
2 changed files with 88 additions and 17 deletions

View File

@ -333,6 +333,16 @@
background-color: @black; background-color: @black;
color: @silver; color: @silver;
} }
.no-gf2-info {
color: @silver;
}
.bad-gf2-info {
color: @orange;
}
.good-gf2-info {
color: @black;
}
} }
} }

View File

@ -1,4 +1,4 @@
from message.simple_messages import ClickMessage, DataChgClickMessage from message.simple_messages import ClickMessage, DataChgClickMessage, NoAction
from message.message import msg, Message from message.message import msg, Message
from view import modals from view import modals
from browser import window, document from browser import window, document
@ -14,30 +14,44 @@ from model.example_clusters import ExampleClusters
class SkeExample: class SkeExample:
def __init__(self, line): COLOR_CLASS = {
None: "no-gf2-info",
True: "goof-gf2-info",
False: "bad-gf2-info"
}
def __init__(self):
self.left = "" self.left = ""
self.right = "" self.right = ""
self.mid = "" self.mid = ""
self.s_id = "" self.s_id = ""
self.gf2_good = None
@staticmethod
def fromLine(line):
result = SkeExample()
for left_el in line.Left: for left_el in line.Left:
self.left += left_el.str result.left += left_el.str
for right_el in line.Right: for right_el in line.Right:
self.right += right_el.str result.right += right_el.str
for mid_el in line.Kwic: for mid_el in line.Kwic:
self.mid += mid_el.str result.mid += mid_el.str
for ref in line.Refs: for ref in line.Refs:
if ref.startswith("s.id"): if ref.startswith("s.id"):
self.s_id = ref.split("=")[1] result.s_id = ref.split("=")[1]
return result
def view(self): def view(self):
return [h("span", {}, self.left + " "), return [h("span.{}".format(self.COLOR_CLASS[self.gf2_good]), {}, [
h("span", {}, self.left + " "),
h("span", {"style": {"font-weight": "bold"}}, self.mid), h("span", {"style": {"font-weight": "bold"}}, self.mid),
h("span", {}, self.right)] h("span", {}, self.right)])]
class SkeCollocation: class SkeCollocation:
@ -61,13 +75,32 @@ class SkeCollocation:
def get_parser(ske_index_type): def get_parser(ske_index_type):
if ske_index_type == 0: if ske_index_type == 0:
return lambda data: [SkeExample(line) for line in data.Lines] return lambda data: [SkeExample.fromLine(line) for line in data.Lines]
elif ske_index_type == 1: elif ske_index_type == 1:
return lambda data: [SkeCollocation(item) for item in data.Items] return lambda data: [SkeCollocation(item) for item in data.Items]
else: else:
raise "unknown ske index type" raise "unknown ske index type"
def match_gf2_examples(data, *args):
if type(data) is not list:
return
url = "https://gf2examples.cjvt.si/get_examples"
xhr = __new__(XMLHttpRequest())
xhr.open("POST", url, True)
request_dict = {}
for example in data:
request_dict[example.s_id] = example.mid
xhr.setRequestHeader("Content-type", "application/json");
xhr.addEventListener("load", msg(SkeModalGf2Update, *args, data))
to_send = window.JSON.stringify(request_dict)
xhr.send(to_send)
class SkeModal(ClickMessage): class SkeModal(ClickMessage):
def on_event(self, event): def on_event(self, event):
# event could be data if this is the return from external library # event could be data if this is the return from external library
@ -84,12 +117,15 @@ class SkeModal(ClickMessage):
ske_index = self.get_arg(2, int) ske_index = self.get_arg(2, int)
ske_lookup = model.ske.url_for_kind_index(ske_index) ske_lookup = model.ske.url_for_kind_index(ske_index)
next_message = msg(SkeModal, page_num, search_term, ske_index)
# could be none if empty # could be none if empty
data = self.get_arg(3) data = self.get_arg(3)
if data is None: if data is None:
params = {"additional_refs": "s.id,p.id", params = {"additional_refs": "s.id,p.id",
"page_num": page_num, "page_num": page_num,
"error_callback": msg(SkeModal, page_num, search_term, ske_index), "error_callback": next_message,
"data_parser": get_parser(ske_index)} "data_parser": get_parser(ske_index)}
gdex = get_preference("ske_gdex") gdex = get_preference("ske_gdex")
@ -99,10 +135,14 @@ class SkeModal(ClickMessage):
return return
params["gdex"] = gdex params["gdex"] = gdex
model.ske.request(search_term, model.ske.request(search_term, next_message, ske_lookup, params)
msg(SkeModal, page_num, search_term, ske_index),
ske_lookup, elif type(data) is list:
params) window.console.log(data)
# check if gf2 examples are loaded or not
if data[0].gf2_good is None:
# we get the data, we have to match it with available data on our gf2 examples API
match_gf2_examples(data, page_num, search_term, ske_index)
model.modal_set(lambda: modals.ske_list( model.modal_set(lambda: modals.ske_list(
search_term, data, page_num, model.entry.senses, model.ske.request_kinds)) search_term, data, page_num, model.entry.senses, model.ske.request_kinds))
@ -111,6 +151,27 @@ class SkeModal(ClickMessage):
return False return False
class SkeModalGf2Update(SkeModal):
def on_event(self, event):
response_data = window.JSON.parse(event.target.response)
data = self.get_arg(3)
data_dict = {}
for example in data:
example.gf_good = False
data_dict[example.s_id] = example
good_response = dict(response_data["good"])
for gf_sid, gf_data in good_response.items():
data_dict[gf_sid].left = gf_data.left
data_dict[gf_sid].mid = gf_data.mid
data_dict[gf_sid].right = gf_data.right
data_dict[gf_sid].gf2_good = True
# changed data_dict, now we can redraw!
# just let it do its thing in update_model
class ShowSkeModal(SkeModal): class ShowSkeModal(SkeModal):
def on_event(self, event): def on_event(self, event):
# if just showing first time, than show empty results and let user click search # if just showing first time, than show empty results and let user click search