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 Russian(ru_RU).
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 = ['один', 'два', 'три', 'четыре', 'пять', 'шесть', 'семь', 'восемь', 'девять', 'десять',
229 'одиннадцать', 'двенадцать', 'тринадцать', 'четырнадцать', 'пятнадцать', 'шестнадцать', 'семнадцать', 'восемнадцать', 'девятнадцать', 'двадцать',
230 'двадцать один', 'двадцать два', 'двадцать три', 'двадцать четыре', 'двадцать пять', 'двадцать шесть', 'двадцать семь', 'двадцать восемь', 'двадцать девять', 'тридцать',
231 'тридцать один', 'тридцать два', 'тридцать три', 'тридцать четыре', 'тридцать пять', 'тридцать шесть', 'тридцать семь', 'тридцать восемь', 'тридцать девять', 'сорок',
232 'сорок один', 'сорок два', 'сорок три', 'сорок четыре', 'сорок пять', 'сорок шесть', 'сорок семь', 'сорок восемь', 'сорок девять', 'пятьдесят',
233 'пятьдесят один', 'пятьдесят два', 'пятьдесят три', 'пятьдесят четыре', 'пятьдесят пять', 'пятьдесят шесть', 'пятьдесят семь', 'пятьдесят восемь', 'пятьдесят девять', 'шестьдесят',
234 'шестьдесят один', 'шестьдесят два', 'шестьдесят три', 'шестьдесят четыре', 'шестьдесят пять', 'шестьдесят шесть', 'шестьдесят семь', 'шестьдесят восемь', 'шестьдесят девять', 'семьдесят',
235 'семьдесят один', 'семьдесят два', 'семьдесят три', 'семьдесят четыре', 'семьдесят пять', 'семьдесят шесть', 'семьдесят семь', 'семьдесят восемь', 'семьдесят девять', 'восемьдесят',
236 'восемьдесят один', 'восемьдесят два', 'восемьдесят три', 'восемьдесят четыре', 'восемьдесят пять', 'восемьдесят шесть', 'восемьдесят семь', 'восемьдесят восемь', 'восемьдесят девять', 'девяносто',
237 'девяносто один', 'девяносто два', 'девяносто три', 'девяносто четыре', 'девяносто пять', 'девяносто шесть', 'девяносто семь', 'девяносто восемь', 'девяносто девять', 'сто'];
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 = 'поиск в google';
289 var googleSearch2 = ['поиска', 'в google'];
290 var youtubeSearch = 'поиск в youtube';
291 var youtubeSearch2 = ['поиска', 'в 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 == 'обновите') {
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 == 'перейтикначалу') {
320 vc_scroll_event_firing('TOP');
321 } else if (convert == 'исходныйкод') {
323 } else if (convert == 'следующий' || convert == 'вперед') {
325 } else if (convert == 'предыдущие') {
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';