spiegel-keyman/web/src/samples/samplehdr.js
2026-06-09 17:13:47 +02:00

157 lines
5.5 KiB
JavaScript

/*
* Keyman is copyright (C) SIL Global. MIT License.
*
* Keyboard management for KeymanWeb demonstration pages
*/
/*
The keyboard name and/or BCP-47 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@fr loads the current version of
the Eurolatin 2 keyboard for French european2@fr@1.2 loads
version 1.2 of the Eurolatin 2 keyboard for French
Argument syntax also supports the following extensions: @fr
load the current version of the default keyboard for French @fr$
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 errToString(err) {
// Painful? Kinda. But needed on un-updated Android API 21!
if(Array.isArray(err)) {
let result = '';
for(let i = 0; i < err.length; i++) {
const e = err[i];
if(e.error instanceof Error) {
result += e.error.message + '\n';
} else {
result += JSON.stringify(e) + '\n';
}
}
return result;
}
if(err instanceof Error) {
return err.message;
}
return JSON.stringify(err);
}
function doAddKeyboards(data) {
return keyman.addKeyboards(data).catch(function(err) {
console.error('keyman.addKeyboards failed with '+errToString(err)+' for '+JSON.stringify(data));
});
}
function doAddKeyboardsForLanguage(data) {
return keyman.addKeyboardsForLanguage(data).catch(function(err) {
console.error('keyman.addKeyboardsForLanguage failed with '+errToString(err)+' for '+JSON.stringify(data));
});
}
async function loadKeyboards(nestLevel) {
const base_prefix = '../';
let prefix = './'; // The default - when prefix == 0.
if(nestLevel !== undefined && nestLevel > 0) {
prefix = '';
for(let i=0; i < nestLevel; i++) {
prefix += base_prefix;
}
}
// The first keyboard added will be the default keyboard for touch devices.
// For faster loading, it may be best for the default keyboard to be
// locally sourced.
await doAddKeyboards({id:'us',name:'English',languages:{id:'en',name:'English'},
filename:(prefix + 'us-1.0.js')});
// Add more keyboards to the language menu by:
// 1. keyboard name ('french'),
// 2. keyboard name and language code ('sil_euro_latin@no,sv'),
// 3. or just the BCP-47 language code ('@he').
await keyman.addKeyboards('french', 'sil_euro_latin@no,sv', '@he');
// Add a keyboard by language name. Note that the name must be spelled
// correctly, or the keyboard will not be found. (Using BCP-47 codes is
// usually easier.)
await doAddKeyboardsForLanguage('Dzongkha');
// Add a fully-specified, locally-sourced, keyboard with custom font
await doAddKeyboards({
id: 'lao_2008_basic',
name: 'Lao Basic',
languages: {
id: 'lo', name: 'Lao', region: 'Asia'
},
filename: (prefix + 'lao_2008_basic-1.2.js')
});
// 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
async function addKeyboard(n) {
let sKbd;
switch(n) {
case 1:
sKbd=document.getElementById('kbd_id1').value;
await doAddKeyboards(sKbd);
break;
case 2:
sKbd=document.getElementById('kbd_id2').value.toLowerCase();
await doAddKeyboards('@'+sKbd);
break;
case 3:
// Add keyboard for comma-separated language name(s)
sKbd=document.getElementById('kbd_id3').value;
await doAddKeyboardsForLanguage(sKbd);
break;
}
}
// Add keyboard on Enter (as well as pressing button)
async function clickOnEnter(e,id)
{
e = e || window.event;
if (e.keyCode == 13) {
await addKeyboard(id);
}
}