mirror of
https://github.com/keymanapp/keyman.git
synced 2026-08-05 08:25:32 +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
|
||||
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<x.length; i++)
|
||||
{
|
||||
if(typeof(x[i]) == 'string' && x[i].length > 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<lList.length; j++)
|
||||
keymanweb.cloudList.push(
|
||||
{'id':x[i]['id'],'language':x[i]['language'][j]['id']}
|
||||
);
|
||||
for(j=0; j<lList.length; j++) {
|
||||
var tEntry = {'id':x[i]['id'],'language':x[i]['language'][j]['id']};
|
||||
if(isUniqueRequest(tEntry)) {
|
||||
keymanweb.cloudList.push(tEntry);
|
||||
}
|
||||
}
|
||||
}
|
||||
// Single language element
|
||||
else
|
||||
{
|
||||
keymanweb.cloudList.push(
|
||||
{'id':x[i]['id'],'language':x[i]['language']['id']}
|
||||
);
|
||||
var tEntry = {'id':x[i]['id'],'language':x[i]['language'][j]['id']};
|
||||
if(isUniqueRequest(tEntry)) {
|
||||
keymanweb.cloudList.push(tEntry);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue