From 3184e7f201af05429bedb4fb8a6300e024946c2a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ale=C5=A1=20Smodi=C5=A1?= Date: Thu, 24 Sep 2015 14:31:13 +0200 Subject: Implemented: CodeQ event queue, basic translation infrastructure, reimplemented problem index from JSON data. --- js/codeq/core.js | 111 ++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 110 insertions(+), 1 deletion(-) (limited to 'js/codeq/core.js') diff --git a/js/codeq/core.js b/js/codeq/core.js index 61ef607..148cdeb 100644 --- a/js/codeq/core.js +++ b/js/codeq/core.js @@ -147,7 +147,10 @@ regexpWhiteSpaceBeforeTag = new RegExp('[ \r\n\t]+(?=<)', 'g'), regexpWhiteSpaceAfterTag = new RegExp('>[ \r\n\t]+', 'g'), regexpWhiteSpace = new RegExp('[ \\r\\n\\t]+'), - regexpWhiteSpaceTrim = new RegExp('^[ \\t\\r\\n]*(.*[^ \\t\\r\\n])[ \\t\\r\\n]*$', 'm'); + regexpWhiteSpaceTrim = new RegExp('^[ \\t\\r\\n]*(.*[^ \\t\\r\\n])[ \\t\\r\\n]*$', 'm'), + regexpAmp = new RegExp('&', 'g'), + regexpLt = new RegExp('<', 'g'), + regexpGt = new RegExp('>', 'g'); // convert a string into its definition (javascript literal) var stringToDef = function (str) { @@ -160,11 +163,76 @@ return html.replace(regexpWhiteSpaceBeforeTag, '').split(regexpWhiteSpaceAfterTag).join('>'); }; + var lang = 'en'; // this is overridden in the boot sequence below, if the browser uses a supported language + + var eventListeners = {}, // keyed by event name, value is an array of listeners + asyncTimer = null, + queuedEvents = [], + fireEvents = function () { + if (asyncTimer !== null) return; + asyncTimer = setTimeout(function () { + var N = queuedEvents.length, + i, event, args, listeners, j; + asyncTimer = null; + for (i = 0; i < N; i++) { + event = queuedEvents[i]; + listeners = eventListeners[event.name]; + if (!listeners) continue; + args = event.args; + listeners = listeners.slice(); // make a copy of the list, so we're unaffected of any changes + for (j = 0; j < listeners.length; j++) { + try { + listeners[j](args); + } + catch (e) { + codeq.log.error('Error while invoking an event handler for ' + event.name + ': ' + e, e); + } + } + } + queuedEvents.splice(0, N); + if (queuedEvents.length > 0) fireEvents(); + }, 0); + }; + window.codeq = { 'jsonize': jsonize, 'log': log, + 'supportedLangs': { + 'en': 'English', + 'sl': 'Slovenščina' + }, + 'getLang': function () { + return lang; + }, + + 'setLang': function (newLang) { + lang = newLang; + codeq.fire('langchange', {'lang': newLang}); + }, + + 'chooseTranslation': function (translations, language) { + var tr, lang; + if ((typeof translations !== 'object') || (translations === null)) return {}; + tr = translations[language || codeq.lang]; + if ((typeof tr === 'object') && (tr !== null)) return tr; + // default fallback + tr = translations['en']; + if ((typeof tr === 'object') && (tr !== null)) return tr; + // fallback to whatever is available + for (lang in translations) { + tr = translations[lang]; + if ((typeof tr === 'object') && (tr !== null)) return tr; + } + // all options were exhausted, we have nothing + return {}; + }, + + 'escapeHtml': function (s) { + return ('' + s).replace(regexpAmp, '&').replace(regexpLt, '<').replace(regexpGt, '>'); + }, + /** * Returns the number of Unicode code points in the given string. * @@ -262,6 +330,38 @@ if ((typeof args !== 'object') || (args === null)) args = {}; return f.apply(args); }; + }, + + // codeq event handling + + 'fire': function (eventName, args) { + queuedEvents.push({'name': eventName, 'args': args}); + fireEvents(); + }, + + 'on': function (eventName, callback) { + var listeners = eventListeners[eventName], + i; + if (listeners) { + for (i = listeners.length - 1; i >= 0; i--) { + if (listeners[i] === callback) return; // already registered + } + } + else { + listeners = []; + eventListeners[eventName] = listeners; + } + listeners.push(callback); + }, + + 'off': function (eventName, callback) { + var listeners = eventListeners[eventName], + i; + if (listeners) { + for (i = listeners.length - 1; i >= 0; i--) { + if (listeners[i] === callback) listeners.splice(i, 1); + } + } } }; @@ -270,6 +370,15 @@ // ================================================================================ $(document).ready(function () { + // set the language + var lang = navigator.language || navigator.browserLanguage; + if (typeof lang === 'string') { + lang = lang.split('-')[0]; // truncate the language variant, in eg. en-US + if (lang in codeq.supportedLangs) codeq.lang = lang; + } + codeq.setLang(lang); // initial language setting + + // go to login codeq.globalStateMachine.transition('login'); }); })(); -- cgit v1.2.1