diff options
author | Camil Staps | 2019-12-30 16:57:13 +0100 |
---|---|---|
committer | Camil Staps | 2020-01-03 19:06:02 +0100 |
commit | ad10a6467f76822b9289832eeb0d0ac2038b32d1 (patch) | |
tree | 1d78251ad49be1a744dc4573a1b3cf54e295e3a4 /public/js | |
parent | Clarify 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.js | 11 | ||||
-rw-r--r-- | public/js/luoparsetrainer.js (renamed from public/js/hebrewparsetrainer.js) | 286 | ||||
-rw-r--r-- | public/js/moderators.js | 118 |
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">×</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(' '); + input_field.append(but).append(' '); + + 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; - }); -}); |