summaryrefslogtreecommitdiff
path: root/js/codeq/core.js
diff options
context:
space:
mode:
authorAleš Smodiš <aless@guru.si>2015-09-24 14:31:13 +0200
committerAleš Smodiš <aless@guru.si>2015-09-24 14:31:13 +0200
commit3184e7f201af05429bedb4fb8a6300e024946c2a (patch)
treee660f5b50fd56cb7ac51deb32d8ab4a8f98552e3 /js/codeq/core.js
parent652164680ac0d1b4ace0ae9ec55f69b28740d11a (diff)
Implemented: CodeQ event queue, basic translation infrastructure, reimplemented problem index from JSON data.
Diffstat (limited to 'js/codeq/core.js')
-rw-r--r--js/codeq/core.js111
1 files changed, 110 insertions, 1 deletions
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, '&amp;').replace(regexpLt, '&lt;').replace(regexpGt, '&gt;');
+ },
+
/**
* 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');
});
})();