aboutsummaryrefslogtreecommitdiff
path: root/public/js
diff options
context:
space:
mode:
authorCamil Staps2019-12-30 16:57:13 +0100
committerCamil Staps2020-01-03 19:06:02 +0100
commitad10a6467f76822b9289832eeb0d0ac2038b32d1 (patch)
tree1d78251ad49be1a744dc4573a1b3cf54e295e3a4 /public/js
parentClarify incorrect parsing message when input is short (diff)
Strip down for simple app for Greek verb λύω
Diffstat (limited to 'public/js')
-rw-r--r--public/js/alerts.js11
-rw-r--r--public/js/luoparsetrainer.js (renamed from public/js/hebrewparsetrainer.js)286
-rw-r--r--public/js/moderators.js118
3 files changed, 180 insertions, 235 deletions
diff --git a/public/js/alerts.js b/public/js/alerts.js
deleted file mode 100644
index c1763ed..0000000
--- a/public/js/alerts.js
+++ /dev/null
@@ -1,11 +0,0 @@
-$.fn.addAlert = function (kind, message) {
- var box = '<div class="alert alert-' + kind + ' alert-dismissible" role="alert">' +
- '<button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">&times;</span></button>' +
- message + '</div>';
-
- $(this).find('.alerts').append($(box));
-}
-
-$.fn.clearAlerts = function () {
- $(this).find('.alerts').html('');
-}
diff --git a/public/js/hebrewparsetrainer.js b/public/js/luoparsetrainer.js
index d875a90..11394e4 100644
--- a/public/js/hebrewparsetrainer.js
+++ b/public/js/luoparsetrainer.js
@@ -1,6 +1,6 @@
/**
- * HebrewParseTrainer - practice Hebrew verbs
- * Copyright (C) 2015 Camil Staps <info@camilstaps.nl>
+ * Luo Parse Trainer - practice Ancient Greek verb forms
+ * Copyright (C) 2015-present Camil Staps <info@camilstaps.nl>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -36,38 +36,78 @@ $(document).ready(function(){
var input_count = 0;
var checked = false;
- function stepFancyInput(step) {
+ function stepFancyInput(step, val) {
$('#trainer-input-fancy').html('');
var buts = {};
switch (step) {
case 0:
- buts = { 'Q ': 'Qal'
- , 'Hip ': 'Hiphil'
- , 'Ho ': 'Hophal'
- , 'Ni ': 'Niphal'
- , 'Pi ': 'Piel'
- , 'Pu ': 'Pual'
- , 'Hit ': 'Hitpael'
+ buts = { 'pr ': 'Praesens'
+ , 'impf ': 'Imperfectum'
+ , 'aor ': 'Aoristus'
+ , 'fut ': 'Futurum'
+ , 'pf ': 'Perfectum'
+ , 'pqpf ': 'Plusquamperfectum'
}; break;
case 1:
- buts = { 'pf ': 'Pf.'
- , 'ipf ': 'Ipf.'
- , 'coh ': 'Coh.'
- , 'imp ': 'Imp.'
- , 'ius ': 'Ius.'
- , 'infcs': 'Inf. cs.'
- , 'infabs': 'Inf. abs.'
- , 'pta ': 'Part. act.'
- , 'ptp ': 'Part. pass.'
+ buts = { 'ind ': 'Indicativus'
+ , 'conj ': 'Conjunctivus'
+ , 'opt ': 'Optativus'
+ , 'imp! ': 'Imperativus'
+ , 'ptc ': 'Participium'
+ , 'inf ': 'Infinitivus'
}; break;
case 2:
- buts = { '1': '1', '2': '2', '3': '3', '': 'N/A' }; break;
+ buts = { 'A ': 'Activum'
+ , 'M ': 'Medium'
+ , 'P ': 'Passivum'
+ , 'MP ': 'Medio-passivum'
+ }; break;
case 3:
- buts = { 'm': 'Masculine', 'f': 'Feminine', '': 'N/A' }; break;
- case 4:
- buts = { 's': 'Singular', 'p': 'Plural', '': 'N/A' }; break;
+ if (val.match(/ inf /)) {
+ /* no buttons */
+ } else if (val.match(/ ptc /)) {
+ buts = {
+ 'M nom ev': 'M nom ev',
+ 'F nom ev': 'F nom ev',
+ 'N nom ev': 'N nom ev',
+ 'M gen ev': 'M gen ev',
+ 'F gen ev': 'F gen ev',
+ 'N gen ev': 'N gen ev',
+ 'M dat ev': 'M dat ev',
+ 'F dat ev': 'F dat ev',
+ 'N dat ev': 'N dat ev',
+ 'M acc ev': 'M acc ev',
+ 'N acc ev': 'N acc ev',
+ 'F acc ev': 'F acc ev',
+ 'M nom mv': 'M nom mv',
+ 'F nom mv': 'F nom mv',
+ 'N nom mv': 'N nom mv',
+ 'M gen mv': 'M gen mv',
+ 'F gen mv': 'F gen mv',
+ 'N gen mv': 'N gen mv',
+ 'M dat mv': 'M dat mv',
+ 'F dat mv': 'F dat mv',
+ 'N dat mv': 'N dat mv',
+ 'M acc mv': 'M acc mv',
+ 'F acc mv': 'F acc mv',
+ 'N acc mv': 'N acc mv'
+ };
+ } else {
+ buts = {
+ '1 ev': '1 ev',
+ '2 ev': '2 ev',
+ '3 ev': '3 ev',
+ '1 mv': '1 mv',
+ '2 mv': '2 mv',
+ '3 mv': '3 mv',
+ };
+ }
+ break;
}
+ var input_field = $('#trainer-input-fancy');
+
+ var i = 0;
for (k in buts) {
var but = $('<button></button>');
but.addClass('btn btn-default').attr('role', 'button');
@@ -75,8 +115,8 @@ $(document).ready(function(){
but.click(function(){
var ip = $('#trainer-input-'+input_count);
ip.val(ip.val() + $(this).val()).focus();
- if (step < 4) {
- stepFancyInput(step + 1);
+ if (step < 3) {
+ stepFancyInput(step + 1, ip.val());
} else {
var done = checkInput(true);
if ($('#trainer-input-'+input_count).parent().hasClass('has-error')) {
@@ -93,7 +133,10 @@ $(document).ready(function(){
}
});
- $('#trainer-input-fancy').append(but).append('&nbsp;');
+ input_field.append(but).append('&nbsp;');
+
+ if (Object.keys(buts).length > 6 && !(++i % 3))
+ input_field.append($('<br>'));
}
}
@@ -103,7 +146,7 @@ $(document).ready(function(){
<div class='col-md-8'>\
<div class='form-group'>\
<label for='trainer-input-"+input_count+"'>Parse:</label>\
- <input type='text' class='form-control' id='trainer-input-"+input_count+"' placeholder='Q pf 3ms' spellcheck='false'/>\
+ <input type='text' class='form-control' id='trainer-input-"+input_count+"' placeholder='pr ind A 1 ev' spellcheck='false'/>\
</div>\
</div>\
<div class='col-md-4'>\
@@ -150,34 +193,33 @@ $(document).ready(function(){
$('#trainer-answer').text('');
removeInputs();
- var stems = $('input[name="stem"]:checked').map(function(){return this.value;});
+ var modes = $('input[name="mode"]:checked').map(function(){return this.value;});
var tenses = $('input[name="tense"]:checked').map(function(){return this.value;});
- var roots = $('select[name="root"]').val();
- $.ajax('verb/random/', {
+ $.ajax('form/random/', {
method: 'POST',
data: {
_token: $('#csrf').val(),
- stem: $.makeArray(stems).join(),
- tense: $.makeArray(tenses).join(),
- root: $.makeArray(roots).join()
+ mode: $.makeArray(modes).join(),
+ tense: $.makeArray(tenses).join()
},
dataType: 'json',
error: function(jqxhr, status, error) {
$('#trainer-404').fadeIn();
},
success: function(data, status, jqxhr) {
- $('#trainer-verb').text(data.verb.verb).css({color: 'black'});
+ $('#trainer-verb').text(data.form.form).css({color: 'black'});
correct_answers = [];
for (var i in data.answers) {
var answer = {
- root: data.answers[i].root,
- stem: data.answers[i].stem,
tense: data.answers[i].tense,
+ mode: data.answers[i].mode,
+ voice: data.answers[i].voice,
person: data.answers[i].person,
gender: data.answers[i].gender,
- number: data.answers[i].number
+ number: data.answers[i].number,
+ case_: data.answers[i]['case']
};
correct_answers.push(answer);
}
@@ -187,88 +229,123 @@ $(document).ready(function(){
});
}
- var stems = [];
+ var modes = [];
var tenses = [];
var tenses_abbr = [];
- function findStem(stem) {
- var stems_ = stems.filter(function(s){return s.toLowerCase().indexOf(stem.toLowerCase()) == 0;});
- if (stems_.length == 1)
- return stems_[0];
+ function findTense(tense) {
+ switch (tense) {
+ case 'pr': return 'praesens';
+ case 'impf': return 'imperfectum';
+ case 'aor': return 'aoristus';
+ case 'fut': return 'futurum';
+ case 'pf': return 'perfectum';
+ case 'pqpf': return 'plusquamperfectum';
+ default: return undefined;
+ }
}
- function findTense(tense) {
- if (tenses.indexOf(tense) != -1)
- return tense;
- if (tenses_abbr.indexOf(tense) != -1)
- return tenses[tenses_abbr.indexOf(tense)];
+ function findMode(mode) {
+ switch (mode) {
+ case 'ind': return 'indicativus';
+ case 'conj': return 'conjunctivus';
+ case 'opt': return 'optativus';
+ case 'imp!': return 'imperativus';
+ default: return undefined;
+ }
}
function parseAnswer(parsing) {
- var persons = ['1', '2', '3', null];
- var genders = ['m', 'f', 'c', null];
- var numbers = ['s', 'p', null];
+ var match = parsing.match(/^\s*(pr|impf|aor|fut|pf|pqpf)\s+(ind|conj|opt|imp!)\s+(A|M|P|MP)\s+([123])\s*([em]v)\s*$/);
+ if (match) {
+ var tense = findTense(match[1]);
+ var mode = findMode(match[2]);
- var re = /^\s*(\w+)\s+(\w+)(?:\s+(?:([123])\s*)?([mf])\s*([sp])\s*)?$/;
- var match = parsing.match(re);
- if (match == null)
- return false;
+ if (typeof tense=='undefined' || typeof mode=='undefined')
+ return false;
- var stem = findStem(match[1]);
- var tense = findTense(match[2]);
- var person = match[3] ? match[3] : null;
- var gender = match[4] ? match[4] : null;
- var number = match[5] ? match[5] : null;
+ return {
+ tense: tense,
+ mode: mode,
+ voice: match[3],
+ person: match[4],
+ gender: null,
+ number: match[5] == 'ev' ? 'sg' : 'pl',
+ case_: null
+ };
+ }
- if (typeof stem === 'undefined' || typeof tense === 'undefined' || $.inArray(person, persons) == -1 ||
- $.inArray(gender, genders) == -1 || $.inArray(number, numbers) == -1)
- return false;
+ match = parsing.match(/^\s*(pr|impf|aor|fut|pf|pqpf)\s+ptc\s+(A|M|P|MP)\s+([MFN])\s+(nom|gen|dat|acc)\s+([em]v)\s*$/);
+ if (match) {
+ var tense = findTense(match[1]);
- if (tense.indexOf('infinitive') == 0 && (person != null || gender != null || number != null))
- return false;
- if (tense.indexOf('infinitive') != 0) {
- if (gender == null || number == null)
- return false;
- if (tense.indexOf('participle') == 0 && person != null)
+ if (typeof tense=='undefined')
return false;
- if (tense.indexOf('participle') != 0 && person == null)
+
+ return {
+ tense: tense,
+ mode: 'participium',
+ voice: match[2],
+ person: null,
+ gender: match[3],
+ number: match[5] == 'ev' ? 'sg' : 'pl',
+ case_: match[4]
+ };
+ }
+
+ match = parsing.match(/^\s*(pr|impf|aor|fut|pf|pqpf)\s+inf\s+(A|M|P|MP)\s*$/);
+ if (match) {
+ var tense = findTense(match[1]);
+
+ if (typeof tense=='undefined')
return false;
+
+ return {
+ tense: tense,
+ mode: 'infinitivus',
+ voice: match[2],
+ person: null,
+ gender: null,
+ number: null,
+ case_: null
+ };
}
- return {
- stem: stem,
- tense: tense,
- person: person,
- gender: gender,
- number: number
- };
+ return false;
}
- function parsingToString(parsing, extended) {
- var genders = {
- 'm': 'masculine',
- 'f': 'feminine'
- };
- var numbers = {
- 's': 'singular',
- 'p': 'plural'
- };
-
- var prs = parsing.stem + ' ' + parsing.tense +
- (parsing.person ? (' ' + parsing.person) : '');
-
- if (extended === true) {
- prs += (parsing.gender ? (' ' + genders[parsing.gender]) : '') +
- (parsing.number ? (' ' + numbers[parsing.number]) : '');
- } else {
- prs += (parsing.gender ? (' ' + parsing.gender) : '') +
- (parsing.number ? (' ' + parsing.number) : '');
+ function abbreviate(term) {
+ switch (term) {
+ case 'praesens': return 'pr';
+ case 'imperfectum': return 'impf';
+ case 'aoristus': return 'aor';
+ case 'futurum': return 'fut';
+ case 'perfectum': return 'pf';
+ case 'plusquamperfectum': return 'pqpf';
+ case 'indicativus': return 'ind';
+ case 'conjunctivus': return 'conj';
+ case 'optativus': return 'opt';
+ case 'imperativus': return 'imp!';
+ case 'participium': return 'ptc';
+ case 'infinitivus': return 'inf';
+ default: return term;
}
+ }
- if ('root' in parsing)
- prs += ' ' + parsing.root;
-
- return prs;
+ function parsingToString(parsing, abbr) {
+ var tense = abbr === true ? abbreviate(parsing.tense) : parsing.tense;
+ var mode = abbr === true ? abbreviate(parsing.mode) : parsing.mode;
+ var number = parsing.number == 'sg' ? 'ev' : 'mv';
+ var tense_mode_voice = [tense, mode, parsing.voice].join(' ');
+
+ switch (parsing.mode) {
+ case 'infinitivus':
+ return tense_mode_voice;
+ case 'participium':
+ return [tense_mode_voice, parsing.gender, parsing.case_, number].join(' ');
+ default:
+ return [tense_mode_voice, parsing.person, number].join(' ');
+ }
}
function processInput() {
@@ -277,7 +354,7 @@ $(document).ready(function(){
if (answer === false) {
input.parent().addClass('has-error');
$('#trainer-parsed-' + input_count).val(
- input.val().length < 8 ? 'Input full parsing...' : 'Parsing error');
+ input.val().length < 10 ? 'Vul een volledige parsering in...' : 'Incorrecte invoer');
} else {
input.parent().removeClass('has-error');
$('#trainer-parsed-' + input_count).val(parsingToString(answer, true));
@@ -294,10 +371,7 @@ $(document).ready(function(){
for (var i in correct_answers) {
var correct_answer = correct_answers[i];
- var root = correct_answer['root'];
- delete correct_answer['root'];
var json = JSON.stringify(correct_answer);
- correct_answer['root'] = root;
if (JSON.stringify(answer) == json) {
$('#trainer-input-'+input_count)
.css({backgroundColor: '#dff0d8'})
@@ -327,10 +401,10 @@ $(document).ready(function(){
}
function init() {
- $.ajax('stem/', {
+ $.ajax('mode/', {
dataType: 'json',
success: function(data, status, jqxhr) {
- stems = data.map(function(d){return d.name;});
+ modes = data.map(function(d){return d.name;});
}
});
@@ -346,7 +420,7 @@ $(document).ready(function(){
reloadVerb();
}
- $('#hebrewparsetrainer-settings .reload-verb').change(function(){
+ $('#luoparsetrainer-settings .reload-verb').change(function(){
reloadVerb();
});
diff --git a/public/js/moderators.js b/public/js/moderators.js
deleted file mode 100644
index 36ec3ed..0000000
--- a/public/js/moderators.js
+++ /dev/null
@@ -1,118 +0,0 @@
-/**
- * HebrewParseTrainer - practice Hebrew verbs
- * Copyright (C) 2015 Camil Staps <info@camilstaps.nl>
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-$(document).ready(function(){
- $('.vote').click(function(){
- var vote = parseInt($(this).data('vote'));
- var verbId = $(this).data('verb');
-
- var container = $(this).closest('tr');
-
- var fail = function(msg) {
- alert('Voting failed with the message: "' + msg + '". Please try again.');
- }
-
- $.ajax({
- url: app_url + 'verb/' + verbId + '/vote/' + vote,
- error: function(jqxhr, stat, error) {
- fail(stat);
- },
- success: function(data) {
- if (!data.success) {
- fail(data.message);
- return;
- }
-
- var btns = container.find('.vote');
- if (vote) {
- $(btns[0]).removeClass('btn-danger');
- $(btns[0]).addClass('btn-default');
- $(btns[1]).addClass('btn-success');
- $(btns[1]).removeClass('btn-default');
- } else {
- $(btns[0]).addClass('btn-danger');
- $(btns[0]).removeClass('btn-default');
- $(btns[1]).removeClass('btn-success');
- $(btns[1]).addClass('btn-default');
- }
-
- container.find('.vote-count').text(data.new_vote_count);
-
- if (data.accepted) {
- alert('This verb has now been accepted!');
- container.remove();
- }
- }
- });
-
- return true;
- });
-
- $('form#suggest').submit(function(){
- var form = $(this);
-
- form.clearAlerts();
-
- $.ajax({
- url: app_url + 'verb/suggest',
- method: 'post',
- data: form.serialize(),
- error: function(jqxhr, stat, error) {
- form.addAlert('danger', stat);
- },
- success: function(data) {
- if (!data.success) {
- form.addAlert('danger', data.message);
- return;
- }
-
- if (data.accepted) {
- form.addAlert('success', 'The new verb has been <b>accepted immediately</b>.');
- } else {
- form.addAlert('success', 'The new verb has been proposed for peer review.');
- }
- }
- });
-
- return false;
- });
-
- $('form#add-root').submit(function(){
- var form = $(this);
-
- form.clearAlerts();
-
- $.ajax({
- url: app_url + 'root/create',
- method: 'post',
- data: form.serialize(),
- error: function(jqxhr, stat, error) {
- form.addAlert('danger', stat);
- },
- success: function(data) {
- if (!data.success) {
- form.addAlert('danger', data.message);
- return;
- }
-
- window.location = window.location;
- }
- });
-
- return false;
- });
-});