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 Spanish(es_ES).
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 = ['uno', 'dos', 'tres', 'cuatro', 'sinco', 'seis', 'siete', 'ocho', 'nueve', 'diez',
229 'on ce', 'doce', 'trece', 'catorce', 'quince', 'dieciseis', 'diecisiete', 'dieciocho', 'diecinueve', 'veinte',
230 'veinti uno', 'veinti dos', 'veinti tres', 'veinti cuatro', 'veinti sinco', 'veinti seis', 'veinti siete', 'veinti ocho', 'veinti nueve', 'treinta',
231 'treinta y uno', 'treinta y dos', 'treinta y tres', 'treinta y cuatro', 'treinta y sinco', 'treinta y seis', 'treinta y siete', 'treinta y ocho', 'treinta y nueve', 'cuarenta',
232 'cuarenta y uno', 'cuarenta y dos', 'cuarenta y tres', 'cuarenta y cuatro', 'cuarenta y sinco', 'cuarenta y seis', 'cuarenta y siete', 'cuarenta y ocho', 'cuarenta y nueve', 'cincuenta',
233 'cincuenta y uno', 'cincuenta y dos', 'cincuenta y tres', 'cincuenta y cuatro', 'cincuenta y sinco', 'cincuenta y seis', 'cincuenta y siete', 'cincuenta y ocho', 'cincuenta y nueve', 'sesenta',
234 'sesenta y uno', 'sesenta y dos', 'sesenta y tres', 'sesenta y cuatro', 'sesenta y sinco', 'sesenta y seis', 'sesenta y siete', 'sesenta y ocho', 'sesenta y nueve', 'setenta',
235 'setenta y uno', 'setenta y dos', 'setenta y tres', 'setenta y cuatro', 'setenta y sinco', 'setenta y seis', 'setenta y siete', 'setenta y ocho', 'setenta y nueve', 'ochenta',
236 'ochenta y uno', 'ochenta y dos', 'ochenta y tres', 'ochenta y cuatro', 'ochenta y sinco', 'ochenta y seis', 'ochenta y siete', 'ochenta y ocho', 'ochenta y nueve', 'noventa',
237 'noventa y uno', 'noventa y dos', 'noventa y tres', 'noventa y cuatro', 'noventa y sinco', 'noventa y seis', 'noventa y siete', 'noventa y ocho', 'noventa y nueve', 'cien'];
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();
278 if (0 < (idx_sep = result.param.includes('º ')) && !isNaN(result.param.substr(0, idx_sep))) {
279 if (idx_sep == result.param.length - 1) {
280 result.cmd = parseFloat(result.param.substr(0, idx_sep));
283 result.cmd = parseFloat(result.param.substr(0, idx_sep));
284 result.param = result.param.substr(idx_sep + 2, result.param.length);
286 } else if (0 < (idx_sep = result.param.includes('ª ')) && !isNaN(result.param.substr(0, idx_sep))) {
287 if (idx_sep == result.param.length - 1) {
288 result.cmd = parseFloat(result.param.substr(0, idx_sep));
291 result.cmd = parseFloat(result.param.substr(0, idx_sep));
292 result.param = result.param.substr(idx_sep + 2, result.param.length);
300 * vc_check_web_control function check some special keyword and run it.
302 * @param spokenWord voice recognized result string.
304 function vc_check_web_control(text) {
305 text = text.toLowerCase();
306 var convert = text.replace(/ /g, '');
307 var googleSearch = 'busca no google';
308 var googleSearch2 = ['buscar', 'en google'];
309 var youtubeSearch = 'busca no youtube';
310 var youtubeSearch2 = ['buscar', 'en youtube'];
312 if (text.startsWith(googleSearch) == true) {
313 location.href = 'https://www.google.com/search?q=' + (text.substr(googleSearch.length)).trim();
314 } else if (text.startsWith(googleSearch2[0]) && text.endsWith(googleSearch2[1])) {
315 var query = text.substr(googleSearch2[0].length, text.length - googleSearch2[0].length - googleSearch2[1].length);
316 location.href = 'https://www.google.com/search?q=' + query.trim();
317 } else if (text.startsWith(youtubeSearch) == true) {
318 location.href = 'https://www.youtube.com/results?search_query=' + (text.substr(youtubeSearch.length)).trim();
319 } else if (text.startsWith(youtubeSearch2[0]) && text.endsWith(youtubeSearch2[1])) {
320 var query = text.substr(youtubeSearch2[0].length, text.length - youtubeSearch2[0].length - youtubeSearch2[1].length);
321 location.href = 'https://www.youtube.com/results?search_query=' + query.trim();
322 } else if (convert == 'refrescar') {
324 } else if (convert == 'google') {
325 location.href = 'https://www.google.com/';
326 } else if (convert == 'facebook') {
327 location.href = 'https://www.facebook.com/';
328 } else if (convert == 'amazon') {
329 location.href = 'https://www.amazon.com/';
330 } else if (convert == 'yahoo') {
331 location.href = 'https://www.yahoo.com/';
332 } else if (convert == 'youtube') {
333 location.href = 'https://www.youtube.com/';
334 } else if (convert == 'scrolldown') {
335 vc_scroll_event_firing('DOWN');
336 } else if (convert == 'scrollup') {
337 vc_scroll_event_firing('UP');
338 } else if (convert == 'iralacima') {
339 vc_scroll_event_firing('TOP');
340 } else if (convert == 'código fuente') {
342 } else if (convert == 'siguiente' || convert == 'adelante') {
344 } else if (convert == 'antes' || convert == 'espalda' || convert == 'previo' || convert == 'previa') {
346 } else if (convert == 'playlog' && vc_flag_log) {
347 if (vc_log_area.style.visibility == 'visible') vc_log_area.style.visibility = 'hidden';
348 else vc_log_area.style.visibility = 'visible';