diff --git a/web/samples/issue103/samplehdr.js b/web/samples/issue103/samplehdr.js new file mode 100644 index 0000000000..f80e863a08 --- /dev/null +++ b/web/samples/issue103/samplehdr.js @@ -0,0 +1,115 @@ +// JavaScript Document samplehdr.js: Keyboard management for KeymanWeb demonstration pages + +/* + The keyboard name and/or ISO language code must be specified for each keyboard that is to be available. + If the same keyboard is used for several languages, it must be listed for each + language, but the keyboard itself will only be loaded once. + If two (or more) keyboards are to be available for a given language, both must be listed. + Any number of keyboards may be specified in one or more calls. + Keyboard paths may be absolute (with respect to the server root) or relative to the keyboards option path. + The actual keyboard object will be downloaded asynchronously when first selected for use. + + Each argument to addKeyboards() is a string, for example: + european2 loads the current version of the Eurolatin 2 keyboard (for its default language) + european2@fra loads the current version of the Eurolatin 2 keyboard for French + european2@fra@1.2 loads version 1.2 of the Eurolatin 2 keyboard for French + + Argument syntax also supports the following extensions: + @fra load the current version of the default keyboard for French + @fra$ load all available keyboards (current version) for French + + Each call to addKeyboards() requires a single call to the remote server, + (unless all keyboards listed are local and fully specified) so it is better + to use multiple arguments rather than separate function calls. + + Calling addKeyboards() with no arguments returns a list of *all* available keyboards. + The Toolbar (desktop browser) UI is best suited for allowing users to select + the appropriate language and keyboard in this case. + + Keyboards may also be specified by language name using addKeyboardsForLanguage() + for example: + keymanweb.addKeyboardsForLanguage('Burmese'); + + Appending $ to the language name will again cause all available keyboards for that + language to be loaded rather than the default keyboard. + + The first call to addKeyboardsForLanguage() makes an additional call to the + keyman API to load the current list of keyboard/language associations. + + In this example, the following function loads the indicated keyboards, + and is called when the page loads. +*/ + + function loadKeyboards() + { + var kmw=tavultesoft.keymanweb; + + // The first keyboard added will be the default keyboard for touch devices. + // For faster loading, it may be best for the default keybaord to be + // locally sourced. + kmw.addKeyboards({id:'us',name:'English',language:{id:'eng',name:'English'}, + filename:'../us-1.0.js'}); + + // Add more keyboards to the language menu, by keyboard name, + // keyboard name and language code, or just the ISO 639 language code. + kmw.addKeyboards('french','european2@swe','european2@swe','european2@swe','european2@swe','european2@swe','european2@swe','european2@nor','@heb'); + kmw.addKeyboards('@heb'); + kmw.addKeyboards('@heb'); + + // Add a keyboard by language name. Note that the name must be spelled + // correctly, or the keyboard will not be found. (Using ISO codes is + // usually easier.) + kmw.addKeyboardsForLanguage('Dzongkha'); + + // Add a fully-specified, locally-sourced, keyboard with custom font + kmw.addKeyboards({id:'lao_2008_basic',name:'Lao Basic', + language:{ + id:'lao',name:'Lao',region:'Asia', + font:{family:'LaoWeb',source:['../font/saysettha_web.ttf','../font/saysettha_web.woff','../font/saysettha_web.eot']} + }, + filename:'../lao_2008_basic.js' + }); + + // The following two optional calls should be delayed until language menus are fully loaded: + // (a) a specific mapped input element input is focused, to ensure that the OSK appears + // (b) a specific keyboard is loaded, rather than the keyboard last used. + //window.setTimeout(function(){kmw.setActiveElement('ta1',true);},2500); + //window.setTimeout(function(){kmw.setActiveKeyboard('Keyboard_french','fra');},3000); + + // Note that locally specified keyboards will be listed before keyboards + // requested from the remote server by user interfaces that do not order + // keyboards alphabetically by language. + } + + // Script to allow a user to add any keyboard to the keyboard menu + function addKeyboard(n) + { + var sKbd,kmw=tavultesoft.keymanweb; + switch(n) + { + case 1: + sKbd=document.getElementById('kbd_id1').value; + kmw.addKeyboards(sKbd); + break; + case 2: + sKbd=document.getElementById('kbd_id2').value.toLowerCase(); + var rx=new RegExp(/^\w{3,3}$\$?/); + if(rx.test(sKbd)) + kmw.addKeyboards('@'+sKbd); + else + alert('An ISO 639 language code must be exactly 3 letters long!'); + break; + case 3: + sKbd=document.getElementById('kbd_id3').value; + kmw.addKeyboardsForLanguage(sKbd); + break; + } + } + + // Add keyboard on Enter (as well as pressing button) + function clickOnEnter(e,id) + { + e = e || window.event; + if(e.keyCode == 13) addKeyboard(id); + } + diff --git a/web/samples/issue103/uncompiled.html b/web/samples/issue103/uncompiled.html new file mode 100644 index 0000000000..c0a83ad95c --- /dev/null +++ b/web/samples/issue103/uncompiled.html @@ -0,0 +1,111 @@ + + + + + + + + + + + + + + + KeymanWeb Sample Page - Uncompiled Source + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

KeymanWeb Sample Page - Uncompiled Source

+ +
+ +
+ +

Type in your language in this text area:

+ + +

or in this input field:

+ + + +

Add a keyboard by keyboard name:

+ + + +

Add a keyboard by ISO 639 language code:

+ + + +

Add a keyboard by language name:

+ + + + +

Return to testing home page

+
+ + + + + diff --git a/web/source/keymanweb.js b/web/source/keymanweb.js index 2825f33d46..1cd2c53d7e 100644 --- a/web/source/keymanweb.js +++ b/web/source/keymanweb.js @@ -1376,6 +1376,29 @@ if(!window['tavultesoft']['keymanweb']['initialized']) { // Create a temporary array of metadata objects from the arguments used var i,j,kp,kbid,lgid,kvid,cmd='',comma=''; keymanweb.cloudList=[]; + + /** + * Function isUniqueRequest + * Scope Private + * @param {object} + * Description Checks to ensure that the stub isn't already loaded within KMW or subject + * to an already-pending request. + */ + var isUniqueRequest = function(tEntry) { + var k; + + if(keymanweb.findStub(tEntry['id'], tEntry['language']) == null) { + for(k=0; k < keymanweb.cloudList.length; k++) { + if(keymanweb.cloudList[k]['id'] == tEntry['id'] && keymanweb.cloudList[k]['language'] == tEntry['language']) { + return false; + } + } + return true; + } else { + return false; + } + }; + for(i=0; i 0) @@ -1391,7 +1414,12 @@ if(!window['tavultesoft']['keymanweb']['initialized']) { tEntry={'id':pList[0]}; if(lList[j] != '') tEntry['language']=lList[j]; if(pList.length > 2) tEntry['version']=pList[2]; - keymanweb.cloudList.push(tEntry); + + // If we've already registered or requested a stub for this keyboard-language pairing, + // don't bother with a cloud request. + if(isUniqueRequest(tEntry)) { + keymanweb.cloudList.push(tEntry); + } } } if(typeof(x[i]) == 'object' && x[i] != null) @@ -1410,17 +1438,20 @@ if(!window['tavultesoft']['keymanweb']['initialized']) { //Array or single entry? if(typeof(lList.length) == 'number') { - for(j=0; j