diff --git a/semantics/static/js/semantics_frames.js b/semantics/static/js/semantics_frames.js index 6be8fc2..1755676 100644 --- a/semantics/static/js/semantics_frames.js +++ b/semantics/static/js/semantics_frames.js @@ -93,6 +93,12 @@ function getFrameDisplay(frame_description){ display += '<table class="InactiveFrameTable">'; display += '<tr><td class="ColumnHeader">Rama:</td><td id="frame_' + frame_description.frame_id + '_" class="frame_' + frame_description.frame_id + '_" colspan="' + frame_description.colspan + '" onclick="frameClick(\'frame_' + frame_description.frame_id + '_\', \'frame_' + frame_description.frame_id + '_\')">'; display += '<span class="Opinion">' + frame_description.status + ' [' + frame_description.frame_id + ']</span>'; + // display += '</td>'; + if (frame_description.lemma.include) { + display += '<table style="float: right"><td id="' + frame_description.lemma.csv_id + '" class="' + frame_description.lemma.csv_class + '" onclick="var e = arguments[0]; e.stopPropagation(); frameClick(\'' +frame_description.lemma.csv_id + '\', \'' + frame_description.lemma.csv_class + '\')">Lemma</td></table>'; + } + display += '</td>'; + display += '</tr>'; display += '<tr>'; display += '<td class="ColumnHeader">Rola:</td>'; for (i = 0; i < frame_description.display.roles.length; i++) { @@ -155,7 +161,7 @@ function newFrame(units) { } lexical_units_num.push(units_list); - frame_content[free_frame_id] = {colspan: "1", rowspan: "1", status: "brak", frame_id: "" + x, display: {preferences:[[]], roles:[]}}; + frame_content[free_frame_id] = {colspan: "1", rowspan: "1", status: "brak", frame_id: "" + x, display: {preferences:[[]], roles:[]}, lemma: {include: false}}; frames_operations.push({operation: "create_frame", meanings: units_list, id: x}); free_frame_id = free_frame_id - 1; } @@ -240,13 +246,30 @@ function roleFree(frame_id, field_ids) { function addArgument(frame_id, field_ids, roles) { if (validateRoles(roles)) { - frame_content[frame_id].colspan = "" + (parseInt(frame_content[frame_id].colspan) + 1); - frame_content[frame_id].display.roles.push({csv_class: 'frame_' + frame_id + '_comp_' + free_complement_id + '_', csv_id: 'frame_' + frame_id + '_comp_' + free_complement_id + '_', argument: ''}); - var i; - for (i = 0; i < frame_content[frame_id].rowspan; i++) { - frame_content[frame_id].display.preferences[i].push({csv_class: 'frame_' + frame_id + '_comp_' + free_complement_id + '_', csv_id: 'frame_' + frame_id + '_comp_' + free_complement_id + '_pref_-' + i + '_', preference: ''}); + if (isLemma(roles)) { + if (frame_content[frame_id].lemma.include) { + alert("Ta rama ma już pole związane z lematem!"); + } else { + frame_content[frame_id].lemma = {include: true, csv_class: 'frame_' + frame_id + '_lemma_comp_' + free_complement_id + '_', csv_id: 'frame_' + frame_id + '_lemma_comp_' + free_complement_id + '_'}; + connected['frame_' + frame_id + '_lemma_comp_' + free_complement_id + '_'] = field_ids; + var complement_id_num = free_complement_id; + free_complement_id = free_complement_id - 1; + var complement_id = "frame_" + highlighted_id + "_lemma_comp_" + complement_id_num + "_"; + var conn_complement_id = "frame_" + highlighted_id + "_comp_" + complement_id_num + "_"; + } + } else { + frame_content[frame_id].colspan = "" + (parseInt(frame_content[frame_id].colspan) + 1); + frame_content[frame_id].display.roles.push({csv_class: 'frame_' + frame_id + '_comp_' + free_complement_id + '_', csv_id: 'frame_' + frame_id + '_comp_' + free_complement_id + '_', argument: ''}); + var i; + for (i = 0; i < frame_content[frame_id].rowspan; i++) { + frame_content[frame_id].display.preferences[i].push({csv_class: 'frame_' + frame_id + '_comp_' + free_complement_id + '_', csv_id: 'frame_' + frame_id + '_comp_' + free_complement_id + '_pref_-' + i + '_', preference: ''}); + } + connected['frame_' + frame_id + '_comp_' + free_complement_id + '_'] = field_ids; + var complement_id_num = free_complement_id; + free_complement_id = free_complement_id - 1; + var complement_id = "frame_" + highlighted_id + "_comp_" + complement_id_num + "_"; + var conn_complement_id = complement_id; } - connected['frame_' + frame_id + '_comp_' + free_complement_id + '_'] = field_ids; for(i = 0; i < field_ids.length; i++) { if (typeof(connected_reverse[field_ids[i]]) == 'undefined') { @@ -254,44 +277,46 @@ function addArgument(frame_id, field_ids, roles) { } connected_reverse[field_ids[i]].push('frame_' + frame_id + '_'); } - - var complement_id = free_complement_id; - free_complement_id = free_complement_id - 1; for (i = 0; i < frame_content[frame_id].display.roles.length; i++) { - if (frame_content[frame_id].display.roles[i].csv_id == 'frame_' + frame_id + '_comp_' + complement_id + '_') { + if (frame_content[frame_id].display.roles[i].csv_id == complement_id) { frame_content[frame_id].display.roles[i].argument = roles; } } - frames_operations.push({operation: 'add_argument', frame_id: frame_id, id: complement_id, role: roles}); + frames_operations.push({operation: 'add_argument', frame_id: frame_id, id: complement_id_num, role: roles}); for (i = 0; i < field_ids.length; i++) { - frames_operations.push({operation: 'connect', arg: 'frame_' + frame_id + '_comp_' + complement_id + '_', connect: field_ids[i]}); + frames_operations.push({operation: 'connect', arg: conn_complement_id, connect: field_ids[i]}); } return complement_id; } else { + alert("Wybrano niepoprawny zestaw ról!"); return false; } } -function removeArgument(frame_id, complement_id) { +function removeArgument(frame_id, complement_id, argument) { var pos = -1; - var arg = "frame_" + frame_id + "_comp_" + complement_id + "_" + var arg = argument; - var i; - for (i = 0; i < frame_content[frame_id].display.roles.length; i++) { - if (frame_content[frame_id].display.roles[i].csv_id == arg) { - pos = i; - } - } - - frame_content[frame_id].display.roles.splice(pos, 1); - - var j; - for (j = 0; j < frame_content[frame_id].display.preferences.length; j++) { - frame_content[frame_id].display.preferences[j].splice(pos, 1); + if (argument.split('_').length == 5) { // zwykły argument + var i; + for (i = 0; i < frame_content[frame_id].display.roles.length; i++) { + if (frame_content[frame_id].display.roles[i].csv_id == arg) { + pos = i; + } + } + + frame_content[frame_id].display.roles.splice(pos, 1); + + var j; + for (j = 0; j < frame_content[frame_id].display.preferences.length; j++) { + frame_content[frame_id].display.preferences[j].splice(pos, 1); + } + } else { // argument leksykalny + frame_content[frame_id].lemma.include = false; } frames_operations.push({operation: 'remove_argument', frame_id: frame_id, complement_id: complement_id}); @@ -462,12 +487,16 @@ function saveFrames() { else { frameClick(""); $.post(ajax_modify_frames, {"operations": JSON.stringify(frames_operations), "lemma_id": lemma_id}, function(data){ - getFrames(data.frames_display); - displayFrames(); - memorizeConnections(data.connections.connected, data.connections.connected_reverse); - $("#semantic-frames-count").empty(); - $("#semantic-frames-count").append(data.frames_count); - updateSchemataConnections(); + $.getJSON(ajax_units, {"lemma_id": window.lemma_id}, function(units) { + memorizeLexicalUnits(units.lexical_units); + basicLexicalUnitsData(units.informations); + getFrames(data.frames_display); + displayFrames(); + memorizeConnections(data.connections.connected, data.connections.connected_reverse); + $("#semantic-frames-count").empty(); + $("#semantic-frames-count").append(data.frames_count); + updateSchemataConnections(); + }); }, 'json'); frames_operations = []; } diff --git a/semantics/static/js/semantics_lexical_units.js b/semantics/static/js/semantics_lexical_units.js index c0741d2..cdb252b 100644 --- a/semantics/static/js/semantics_lexical_units.js +++ b/semantics/static/js/semantics_lexical_units.js @@ -198,34 +198,31 @@ function getMeaningsSelectionForFrame(frame_id) { display += "<div>"; - var i; - var roles = frame_content[frame_id].display.roles; - for (i = 0; i < roles.length; i++) { - if (isPOL(frame_id, i)) { - var j; - for (j = 0; j < connected[roles[i].csv_class].length; j++) { - var options = []; - var sch = connected[roles[i].csv_class][j].split("pos")[0]; - var pos = connected[roles[i].csv_class][j].split("arg")[0]; - var k; - for (k = 0; k < schemas_content[sch].display.arguments[0].length; k++) { - if (schemas_content[sch].display.arguments[0][k].csv_class == pos) { - var l; - for (l = 0; l < schemas_content[sch].display.arguments[0][k].lex.length; l++) { - options.push(schemas_content[sch].display.arguments[0][k].lex[l]); - } - } - } - var temp; // TODO: temporal solution for multiple schemata - if (hasRefl(sch)) { - temp = [['się'], options] - } else { - temp = [options]; - } - lexicalisation.push(temp); - } + if (frame_content[frame_id].lemma.include) { + var lem = frame_content[frame_id].lemma.csv_class; + var j; + for (j = 0; j < connected[lem].length; j++) { + var options = []; + var sch = connected[lem][j].split("pos")[0]; + var pos = connected[lem][j].split("arg")[0]; + var k; + for (k = 0; k < schemas_content[sch].display.arguments[0].length; k++) { + if (schemas_content[sch].display.arguments[0][k].csv_class == pos) { + var l; + for (l = 0; l < schemas_content[sch].display.arguments[0][k].lex.length; l++) { + options.push(schemas_content[sch].display.arguments[0][k].lex[l]); + } + } + } + var temp; // TODO: temporal solution for multiple schemata + if (hasRefl(sch)) { + temp = [['się'], options] + } else { + temp = [options]; + } + lexicalisation.push(temp); } - } + } display += getFormForLexicalisation(lexicalisation); @@ -293,6 +290,12 @@ function lexicalisationForm(tokenised) { var display = ""; var i; for (i = 0; i < tokenised.length; i++) { + var j; + for (j = 0; j < lexical_units.length; j++) { + if (base + " " + tokenised[i].join(" ") == lexical_units[j].base) { + return ""; + } + } display += "<input type = \"checkbox\" name = \"mwe\" value = \"" + base + " " + tokenised[i].join(" ") + "\">"; // TODO: unikalne wartości, wartość => dodanie odpowiedniej jednostki (nazwa jednostki w wartości?) display += base + " " + tokenised[i].join(" ") + "<br\>"; } diff --git a/semantics/static/js/semantics_roles.js b/semantics/static/js/semantics_roles.js index a5072a2..effafd6 100644 --- a/semantics/static/js/semantics_roles.js +++ b/semantics/static/js/semantics_roles.js @@ -45,6 +45,13 @@ function rolesToHtml(roles_display, full){ return table; } +function isLemma(roles) { + if (roles.length != 1) { + return false; + } + return (role_name[roles[0]] == 'Lemma'); +} + function memorizeRoles(roles_display, roles_full){ roles_display_table = rolesToHtml(roles_display, false); roles_display_table_full = rolesToHtml(roles_full, true); diff --git a/semantics/static/js/semantics_view.js b/semantics/static/js/semantics_view.js index 3f4066b..6a36f35 100644 --- a/semantics/static/js/semantics_view.js +++ b/semantics/static/js/semantics_view.js @@ -769,7 +769,7 @@ function removeFromFrame() { } if (op == "add_realization") { - // arg = "frame_26_comp_36_" + // arg = "frame_26_comp_36_(lemma_)" var frame_id = parseInt(arg.split('_')[1]); var complement_id = parseInt(arg.split('_')[3]); @@ -777,8 +777,8 @@ function removeFromFrame() { var h = "frame_" + highlighted_id + "_"; frameClick(h); - - removeArgument(frame_id, complement_id); + + removeArgument(frame_id, complement_id, arg); op = "add_argument"; arg = ""; @@ -812,7 +812,7 @@ function removeFromFrame() { //////////////////////////// Display //////////////////////////// function frameClick(clicked_id) { - + if (clicked_id == "") { deselect(); highlighted_id = ""; @@ -866,6 +866,38 @@ function frameClick(clicked_id) { $('#change_lus').removeAttr('disabled'); $('#change_opinion').removeAttr('disabled'); } + } else if (clicked_id.split('_')[4] == 'lemma') { // part of lemma click + frame_id = clicked_id.split('_')[1] + + if (highlighted_id != "") { + deselect(); + } + if (semantics_selected_id == clicked_id) { + highlighted_id = ""; + semantics_selected_id = ""; + op = "none"; + + $('#assign_role').attr('disabled', "True"); + $('#add_preference').attr('disabled', "True"); + $('#delete').attr('disabled', "True"); + $('#multi_lus').attr('disabled', "True"); + $('#change_lus').attr('disabled', "True"); + $('#change_opinion').attr('disabled', "True"); + } else { + select(frame_id, clicked_id); + + highlighted_id = frame_id; + semantics_selected_id = clicked_id; + op = "add_realization"; + arg = clicked_id //.split('pref')[0] + + $('#assign_role').attr('disabled', "True"); + $('#add_preference').attr('disabled', "True"); + $('#delete').removeAttr('disabled'); + $('#multi_lus').removeAttr('disabled'); + $('#change_lus').removeAttr('disabled'); + $('#change_opinion').removeAttr('disabled'); + } } else { // argument click frame_id = clicked_id.split('_')[1] @@ -947,6 +979,19 @@ function selectFrame(frame_id, clicked_id) { $('#' + functionCsvId(connected[roles[i].csv_class][j])).css('color', ''); } } + + var lemma = frame_content[frame_id].lemma; + if (lemma.include) { + var style = {type: 'background-color', value: 'white'}; + $('#' + lemma.csv_id).css(style.type, style.value); + var j; + for (j = 0; j < connected[lemma.csv_class].length; j++) { + $('#' + connected[lemma.csv_class][j]).css(style.type, style.value); + $('#' + connected[lemma.csv_class][j]).css('color', ''); + $('#' + functionCsvId(connected[lemma.csv_class][j])).css(style.type, style.value); + $('#' + functionCsvId(connected[lemma.csv_class][j])).css('color', ''); + } + } $("#" + clicked_id).css('border-width', '5px'); @@ -1119,7 +1164,7 @@ function schemaClick(class_id, lex) { } field_ids = [class_id]; } - + if (control == "connect") { if (op == "none") { return; @@ -1153,7 +1198,7 @@ function schemaClick(class_id, lex) { if (complement_id) { var h = "frame_" + highlighted_id + "_"; - var a = "frame_" + highlighted_id + "_comp_" + complement_id + "_"; + var a = complement_id; //"frame_" + highlighted_id + "_comp_" + complement_id + "_"; // re-draw and re-color frame frameClick(h); @@ -1162,9 +1207,9 @@ function schemaClick(class_id, lex) { result = true; $.prompt.close(); - } else { + } /*else { alert("Wybrano niepoprawne role!"); - } + } */ } } @@ -1188,7 +1233,11 @@ function schemaClick(class_id, lex) { if (arg == "") { return; } else { - // arg = "frame_26_comp_36_" + // arg = "frame_26_comp_36_(lemma_)" + if (arg.split('_')[4] == 'lemma' && lex.length == 0) { + alert("Nie można podłączyć do lematu!"); + return; + } var frame_id = parseInt(parseInt(arg.split('_')[1])); var i, j; var can_connect = false; diff --git a/semantics/views.py b/semantics/views.py index 8a4001d..8ea0817 100644 --- a/semantics/views.py +++ b/semantics/views.py @@ -115,7 +115,10 @@ def create_frames_context(lemma_id, user): frame_display["lexical_units"].append({"id": str(lu.id), "base": lu.base, "sense": str(lu.sense)}) for frame in type_frames[t]: # frame_complements = Complement.objects.filter(frame=frame) - frame_complements = frame.complements.all() + # frame_complements = frame.complements.all() + lemma_role = SemanticRole.objects.get(role="Lemma") + frame_complements = frame.complements.all().exclude(roles=lemma_role) + lemma_argument = frame.complements.filter(roles=lemma_role) # classes and first frame/position part of identifiers frame_ids = [u'frame_' + str(frame.id) + '_comp_' + str(complement.id) + '_' for complement in frame_complements] @@ -174,7 +177,29 @@ def create_frames_context(lemma_id, user): status = u'pewna' else: status = frame.opinion.value - frame_display["frames"].append({"frame_id": str(frame.id), "colspan": str(max(len(frame_roles), 1)), "rowspan": str(frame_preferences_rowspan), "status": status, "display": display}) + if len(lemma_argument) > 0: + csv = u'frame_' + str(frame.id) + '_comp_' + str(lemma_argument[0].id) + '_lemma_' + lemma_info = {"include": True, "csv_id": csv, "csv_class": csv} + if csv not in complement_arguments: + complement_arguments[csv] = [] + + for schema_position in lemma_argument[0].realizations.all(): + schema = schema_position.frame + position = schema_position.position + argument = schema_position.argument + alternation = schema_position.alternation + realization_id = u'schema_' + str(schema.id) + u'_pos_' + str(position.id) + '_arg_' + str(argument.id) + '_' + 'alt_' + str(alternation) + '_' + complement_arguments[csv].append(realization_id) + if realization_id not in arguments_frame_connected: + arguments_frame_connected[realization_id] = [] + arguments_frame_connected[realization_id].append('frame_' + str(frame.id) + '_') + if schema.id in alternations[frame.id]: + alternations[frame.id][schema.id] = max(alternations[frame.id][schema.id], alternation) + else: + alternations[frame.id][schema.id] = alternation + else: + lemma_info = {"include": False} + frame_display["frames"].append({"frame_id": str(frame.id), "colspan": str(max(len(frame_roles), 1)), "rowspan": str(frame_preferences_rowspan), "status": status, "display": display, "lemma": lemma_info}) for complement, complement_class in zip(frame_complements, frame_ids): if complement_class not in complement_arguments: