mirror of
https://github.com/keymanapp/keyman.git
synced 2026-08-28 19:27:44 +00:00
Addresses point 1 of #103 - prevents duplicate requests for identical keyboard-language pairings.
This commit is contained in:
parent
15ed1b65f0
commit
602edbe11b
3 changed files with 265 additions and 8 deletions
115
web/samples/issue103/samplehdr.js
Normal file
115
web/samples/issue103/samplehdr.js
Normal file
|
|
@ -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);
|
||||||
|
}
|
||||||
|
|
||||||
111
web/samples/issue103/uncompiled.html
Normal file
111
web/samples/issue103/uncompiled.html
Normal file
|
|
@ -0,0 +1,111 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
|
||||||
|
|
||||||
|
<!-- Set the viewport width to match phone and tablet device widths -->
|
||||||
|
<meta name="viewport" content="width=device-width,user-scalable=no" />
|
||||||
|
|
||||||
|
<!-- Allow KeymanWeb to be saved to the iPhone home screen -->
|
||||||
|
<meta name="apple-mobile-web-app-capable" content="yes" />
|
||||||
|
|
||||||
|
<!-- Enable IE9 Standards mode -->
|
||||||
|
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
|
||||||
|
|
||||||
|
<title>KeymanWeb Sample Page - Uncompiled Source</title>
|
||||||
|
|
||||||
|
<!-- Your page CSS -->
|
||||||
|
<style type='text/css'>
|
||||||
|
body {font-family: Tahoma,helvetica;}
|
||||||
|
h3 {font-size: 1em;font-weight:normal;color: darkred; margin-bottom: 4px}
|
||||||
|
.test {font-size: 1.5em; width:80%; min-height:30px; border: 1px solid gray;}
|
||||||
|
#KeymanWebControl {width:50%;min-width:600px;}
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<!-- Insert uncompiled KeymanWeb source scripts -->
|
||||||
|
<script src="../../source/kmwstring.js" type="application/javascript"></script>
|
||||||
|
<script src="../../source/kmwbase.js" type="application/javascript"></script>
|
||||||
|
<script src="../../source/keymanweb.js" type="application/javascript"></script>
|
||||||
|
<script src="../../source/kmwosk.js" type="application/javascript"></script>
|
||||||
|
<script src="../../source/kmwnative.js" type="application/javascript"></script>
|
||||||
|
<script src="../../source/kmwcallback.js" type="application/javascript"></script>
|
||||||
|
<script src="../../source/kmwkeymaps.js" type="application/javascript"></script>
|
||||||
|
<script src="../../source/kmwlayout.js" type="application/javascript"></script>
|
||||||
|
<script src="../../source/kmwinit.js" type="application/javascript"></script>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
For desktop browsers, a script for the user interface must be inserted here.
|
||||||
|
|
||||||
|
Standard UIs are toggle, button, float and toolbar.
|
||||||
|
The toolbar UI is best for any page designed to support keyboards for
|
||||||
|
a large number of languages.
|
||||||
|
-->
|
||||||
|
<script src="../../source/kmwuitoggle.js"></script>
|
||||||
|
|
||||||
|
<!-- Initialization: set paths to keyboards, resources and fonts as required -->
|
||||||
|
<script>
|
||||||
|
var kmw=window.tavultesoft.keymanweb;
|
||||||
|
kmw.init({
|
||||||
|
attachType:'auto',
|
||||||
|
resources:'resources'
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<!-- Add keyboard management script for local selection of keyboards to use -->
|
||||||
|
<script src="./samplehdr.js"></script>
|
||||||
|
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<!-- Sample page HTML -->
|
||||||
|
<body onload='loadKeyboards();'>
|
||||||
|
<h2>KeymanWeb Sample Page - Uncompiled Source</h2>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<!--
|
||||||
|
The following DIV is used to position the Button or Toolbar User Interfaces on the page.
|
||||||
|
If omitted, those User Interfaces will appear at the top of the document body.
|
||||||
|
(It is ignored by other User Interfaces.)
|
||||||
|
-->
|
||||||
|
<div id='KeymanWebControl'></div>
|
||||||
|
|
||||||
|
<h3>Type in your language in this text area:</h3>
|
||||||
|
<textarea id='ta1' class='test' placeholder='Type here'></textarea>
|
||||||
|
|
||||||
|
<h3>or in this input field:</h3>
|
||||||
|
<input class='test' value='' placeholder='or here'/>
|
||||||
|
|
||||||
|
<!-- The following elements show how the language menu can be dynamically extended at any time -->
|
||||||
|
<h3>Add a keyboard by keyboard name:</h3>
|
||||||
|
<input type='input' id='kbd_id1' class='kmw-disabled' onkeypress="clickOnEnter(event,1);"/>
|
||||||
|
<input type='button' id='btn1' onclick='addKeyboard(1);' value='Add' />
|
||||||
|
|
||||||
|
<h3>Add a keyboard by ISO 639 language code:</h3>
|
||||||
|
<input type='input' id='kbd_id2' class='kmw-disabled' onkeypress="clickOnEnter(event,2);"/>
|
||||||
|
<input type='button' id='btn2' onclick='addKeyboard(2);' value='Add' />
|
||||||
|
|
||||||
|
<h3>Add a keyboard by language name:</h3>
|
||||||
|
<input type='input' id='kbd_id3' class='kmw-disabled' onkeypress="clickOnEnter(event,3);"/>
|
||||||
|
<input type='button' id='btn3' onclick='addKeyboard(3);' value='Add' />
|
||||||
|
|
||||||
|
|
||||||
|
<h3><a href="../samples/index.html">Return to testing home page</a></h3>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
*** DEVELOPER NOTE -- FIREFOX CONFIGURATION FOR TESTING ***
|
||||||
|
*
|
||||||
|
* If the URL bar starts with <b>file://</b>, Firefox may not load the font used
|
||||||
|
* to display the special characters used in the On-Screen Keyboard.
|
||||||
|
*
|
||||||
|
* To work around this Firefox bug, navigate to <b>about:config</b>
|
||||||
|
* and set <b>security.fileuri.strict_origin_policy</b> to <b>false</b>
|
||||||
|
* while testing.
|
||||||
|
*
|
||||||
|
* Firefox resolves website-based CSS URI references correctly without needing
|
||||||
|
* any configuration change, so this change should only be made for file-based testing.
|
||||||
|
*
|
||||||
|
***
|
||||||
|
-->
|
||||||
|
</html>
|
||||||
|
|
@ -1376,6 +1376,29 @@ if(!window['tavultesoft']['keymanweb']['initialized']) {
|
||||||
// Create a temporary array of metadata objects from the arguments used
|
// Create a temporary array of metadata objects from the arguments used
|
||||||
var i,j,kp,kbid,lgid,kvid,cmd='',comma='';
|
var i,j,kp,kbid,lgid,kvid,cmd='',comma='';
|
||||||
keymanweb.cloudList=[];
|
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<x.length; i++)
|
for(i=0; i<x.length; i++)
|
||||||
{
|
{
|
||||||
if(typeof(x[i]) == 'string' && x[i].length > 0)
|
if(typeof(x[i]) == 'string' && x[i].length > 0)
|
||||||
|
|
@ -1391,7 +1414,12 @@ if(!window['tavultesoft']['keymanweb']['initialized']) {
|
||||||
tEntry={'id':pList[0]};
|
tEntry={'id':pList[0]};
|
||||||
if(lList[j] != '') tEntry['language']=lList[j];
|
if(lList[j] != '') tEntry['language']=lList[j];
|
||||||
if(pList.length > 2) tEntry['version']=pList[2];
|
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)
|
if(typeof(x[i]) == 'object' && x[i] != null)
|
||||||
|
|
@ -1410,17 +1438,20 @@ if(!window['tavultesoft']['keymanweb']['initialized']) {
|
||||||
|
|
||||||
//Array or single entry?
|
//Array or single entry?
|
||||||
if(typeof(lList.length) == 'number') {
|
if(typeof(lList.length) == 'number') {
|
||||||
for(j=0; j<lList.length; j++)
|
for(j=0; j<lList.length; j++) {
|
||||||
keymanweb.cloudList.push(
|
var tEntry = {'id':x[i]['id'],'language':x[i]['language'][j]['id']};
|
||||||
{'id':x[i]['id'],'language':x[i]['language'][j]['id']}
|
if(isUniqueRequest(tEntry)) {
|
||||||
);
|
keymanweb.cloudList.push(tEntry);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
// Single language element
|
// Single language element
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
keymanweb.cloudList.push(
|
var tEntry = {'id':x[i]['id'],'language':x[i]['language'][j]['id']};
|
||||||
{'id':x[i]['id'],'language':x[i]['language']['id']}
|
if(isUniqueRequest(tEntry)) {
|
||||||
);
|
keymanweb.cloudList.push(tEntry);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue