2 * Copyright 2017 Samsung Electronics Co., Ltd.
4 * Licensed under the Flora License, Version 1.1 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://floralicense.org/license/
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
20 * This source code is a language specified script for French(fr_FR).
24 * vc_search_word function found the text with similarity calculated using words in the @param.
26 * @param param param from voice-control.
27 * @param replace If replace true, function correct some confused charaters and try again.
29 function vc_search_word(param, replace) {
30 /* phase 2. search partial word in the webpage */
31 /* First, compare with links in html documents */
32 if (vc_flag_log == true) {
33 vc_rec_result.style.background = 'rgba(0, 100, 200, 1)';
35 var resultTokenArr = param.split(' ');
36 var threshold = resultTokenArr.length * 0.3;
40 vc_print_log('=== start vc_search_word');
42 for (var i = 0; i < vc_text_indicators.length; ++i) {
43 var text = vc_text_indicators[i].textContent.replace(/[ `~!‘’@#$%^&*()_|+\-=?;:'",.<>\{\}\[\]\\\/]/gi, '').toLowerCase();
46 for (var j = 0; j < resultTokenArr.length; j++) {
47 if (vc_is_visible(vc_text_indicators[i], vc_scr, true) && text.indexOf(resultTokenArr[j].toLowerCase()) != -1) {
55 for (var i = 0; i < vc_text_indicators.length; i++) {
56 if (temp[i] >= threshold && (max == -1 || temp[i] > temp[max])) {
57 el = vc_text_indicators[i];
62 if (el != undefined) {
66 /* Second, compare with whole text of elements in html documents */
68 for (var i = 0; i < resultTokenArr.length; i++) {
69 var obj = vc_selector([resultTokenArr[i]]);
70 for (var j = 0; j < obj.length; j++) {
72 if (temp.childElementCount === 0) {
73 if (temp.hasAttribute('vc_count') == false) {
74 temp.setAttribute('vc_count', 1);
77 temp.setAttribute('vc_count', parseInt(temp.getAttribute('vc_count')) + 1);
83 for (var i = 0; i < result.length; i++) {
84 var vccnt = parseInt(result[i].getAttribute('vc_count'));
85 if (vccnt >= threshold && (el == undefined || vccnt > parseInt(el.getAttribute('vc_count')))) {
90 for (var i = 0; i < result.length; i++) {
91 result[i].removeAttribute('vc_count');
94 if (el != undefined) {
98 return vc_search_character(param);
102 * vc_search_word function found the text with similarity calculated using characters in the @param.
104 * @param param param from voice-control.
106 function vc_search_character(param) {
107 vc_print_log('=== start searching(character level)');
108 if (vc_flag_log == true) {
109 vc_rec_result.style.background = 'rgba(200, 100, 0, 1)';
114 param = param.toLowerCase().split(' ');
115 for (var i = 0; i < vc_all_elem.length; i++) {
116 if (vc_all_elem[i].childElementCount == 0 && vc_is_visible(vc_all_elem[i]) == true) {
117 var text = vc_all_elem[i].textContent.replace(/[`~!‘’@#$%^&*()_|+\-=?;:'",.<>\{\}\[\]\\\/]/gi, ' ').toLowerCase().split(' ');
120 for(var k = 0; k < param.length; k++) {
121 var min = 2147483647;
123 if (3 > param[k].length) {
127 for(var j = 0; j < text.length; j++) {
128 if (3 > text[j].length) {
136 if (text[j].length > param[k].length) {
144 for (var l = 0; l <= longStr.length; l++) {
148 for (var s = 1; s <= shortStr.length; s++) {
151 for (var l = 1; l <= longStr.length; l++) {
152 var match = shortStr[s - 1] == longStr[l - 1] ? 0 : 1;
154 var rep = cost[l - 1] + match;
155 var ins = cost[l] + 1;
156 var del = ncost[l - 1] + 1;
158 ncost[l] = Math.min(rep, ins, del);
166 if (param[k].length * 0.25 >= cost[longStr.length] && min > cost[longStr.length]) {
167 min = cost[longStr.length];
171 if (min < 2147483647) {
174 score = score + param[k].length;
178 similarity.push(score);
180 similarity.push(2147483647);
184 vc_print_log('=== finish searching(character level)');
186 var min = 2147483647;
187 for (var i = 0; i < similarity.length; i++) {
188 if (min > similarity[i]) {
193 for (var i = 0; i < param.length; i++) {
194 if (3 <= param[i].length) {
195 threshold = threshold + param[i].length;
199 if (threshold > min) {
200 return vc_all_elem[similarity.indexOf(min)];
207 * vc_search_word function found the text with similarity calculated using pronunciation keys in the @param.
209 * @param param param from voice-control.
211 function vc_search_pronunciation(param) {
214 /* TODO: Fill the logic here to find the link or text include the pronunciation keys in param.
215 * If you find the link or text, then allocate that into el.
216 * If the language does not need to pronunciation comapring, you can erase this function.
223 * vc_is_included_number function separate a number value from the @text.
225 * @param text text string from voice-control-webview.cpp.
227 function vc_is_included_number(text) {
228 var numbers = ['un', 'deux', 'trois', 'quatre', 'cinq', 'six', 'sept', 'huit', 'neuf', 'dix',
229 'onze', 'douze', 'treize', 'quatorze', 'quinze', 'seize', 'dix-sept', 'dix-huit', 'dix-neuf', 'vingt',
230 'vingt et un', 'vingt-deux', 'vingt-trois', 'vingt-quatre', 'vingt-cinq', 'vingt-six', 'vingt-sept', 'vingt-huit', 'vingt-neuf', 'trente',
231 'trente et un', 'trente-deux', 'trente-trois', 'trente-quatre', 'trente-cinq', 'trente-six', 'trente-sept', 'trente-huit', 'trente-neuf', 'quarante',
232 'quarante et un', 'quarante-deux', 'quarante-trois', 'quarante-quatre', 'quarante-cinq', 'quarante-six', 'quarante-sept', 'quarante-huit', 'quarante-neuf', 'cinquante',
233 'cinquante et un', 'cinquante-deux', 'cinquante-trois', 'cinquante-quatre', 'cinquante-cinq', 'cinquante-six', 'cinquante-sept', 'cinquante-huit', 'cinquante-neuf',
234 'soixante', 'soixante et un', 'soixante-deux', 'soixante-trois', 'soixante-quatre', 'soixante-cinq', 'soixante-six', 'soixante-sept', 'soixante-huit', 'soixante-neuf', 'soixante-dix',
235 'soixante et onze', 'soixante-douze', 'soixante-treize', 'soixante-quatorze', 'soixante-quinze', 'soixante-seize', 'soixante-dix-sept', 'soixante-dix-huit', 'soixante-dix-neuf','quatre-vingts',
236 'quatre-vingt-un', 'quatre-vingt-deux', 'quatre-vingt-trois', 'quatre-vingt-quatre', 'quatre-vingt-cinq', 'quatre-vingt-six', 'quatre-vingt-sept', 'quatre-vingt-huit', 'quatre-vingt-neuf', 'quatre-vingt-dix',
237 'quatre-vingt-onze', 'quatre-vingt-douze', 'quatre-vingt-treize', 'quatre-vingt-quatorze', 'quatre-vingt-quinze', 'quatre-vingt-seize', 'quatre-vingt-dix-sept', 'quatre-vingt-dix-huit', 'quatre-vingt-dix-neuf', 'cent'];
238 var convert = text.toLowerCase();
241 for (var i = 0; numbers.length > i; i++) {
242 if (true == convert.startsWith(numbers[i]) && (' ' == text[numbers[i].length] || text.length == numbers[i].length)) {
243 var partial = text.substr(numbers[i].length);
245 if (vc_visible_hints[i].type == 'input' || text.length == numbers[i].length) {
248 param : partial.trim()
264 * vc_correct_parameter function correct the voice recognition result.
266 * @param text text string from voice-control-webview.cpp.
268 function vc_correct_parameter(text) {
269 var result = vc_is_included_number(text),
270 words = result.param.split(' ');
272 if (isNaN(result.cmd) == true && isNaN(words[0]) == false) {
273 result.cmd = parseFloat(words[0]);
274 result.param = result.param.substr(words[0].length + 1).trim();
281 * vc_check_web_control function check some special keyword and run it.
283 * @param spokenWord voice recognized result string.
285 function vc_check_web_control(text) {
286 text = text.toLowerCase();
287 var convert = text.replace(/ /g, '');
288 var googleSearch = 'rechercher google';
289 var googleSearch2 = ['rechercher', 'sur google'];
290 var youtubeSearch = 'rechercher youtube';
291 var youtubeSearch2 = ['rechercher', 'sur youtube'];
293 if (text.startsWith(googleSearch) == true) {
294 location.href = 'https://www.google.com/search?q=' + (text.substr(googleSearch.length)).trim();
295 } else if (text.startsWith(googleSearch2[0]) && text.endsWith(googleSearch2[1])) {
296 var query = text.substr(googleSearch2[0].length, text.length - googleSearch2[0].length - googleSearch2[1].length);
297 location.href = 'https://www.google.com/search?q=' + query.trim();
298 } else if (text.startsWith(youtubeSearch) == true) {
299 location.href = 'https://www.youtube.com/results?search_query=' + (text.substr(youtubeSearch.length)).trim();
300 } else if (text.startsWith(youtubeSearch2[0]) && text.endsWith(youtubeSearch2[1])) {
301 var query = text.substr(youtubeSearch2[0].length, text.length - youtubeSearch2[0].length - youtubeSearch2[1].length);
302 location.href = 'https://www.youtube.com/results?search_query=' + query.trim();
303 } else if (convert == 'recharger' || convert == 'rafraîchir') {
305 } else if (convert == 'google') {
306 location.href = 'https://www.google.com/';
307 } else if (convert == 'facebook') {
308 location.href = 'https://www.facebook.com/';
309 } else if (convert == 'amazon') {
310 location.href = 'https://www.amazon.com/';
311 } else if (convert == 'yahoo') {
312 location.href = 'https://www.yahoo.com/';
313 } else if (convert == 'youtube') {
314 location.href = 'https://www.youtube.com/';
315 } else if (convert == 'scrolldown') {
316 vc_scroll_event_firing('DOWN');
317 } else if (convert == 'scrollup') {
318 vc_scroll_event_firing('UP');
319 } else if (convert == 'allerausommet') {
320 vc_scroll_event_firing('TOP');
321 } else if (convert == 'codesource') {
323 } else if (convert == 'prochain' || convert == "vers l'avant") {
325 } else if (convert == 'avant' || convert == 'arrière' || convert == 'précédent') {
327 } else if (convert == 'playlog' && vc_flag_log) {
328 if (vc_log_area.style.visibility == 'visible') vc_log_area.style.visibility = 'hidden';
329 else vc_log_area.style.visibility = 'visible';