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 English(en_US).
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 /* second, 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 /* first, 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 = ['one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine', 'ten'];
229 var convert = text.toLowerCase();
232 for (var i = 0; numbers.length > i; i++) {
233 if (true == convert.startsWith(numbers[i]) && (' ' == text[numbers[i].length] || text.length == numbers[i].length)) {
234 var partial = text.substr(numbers[i].length);
236 if (vc_visible_hints[i].type == 'input' || text.length == numbers[i].length) {
239 param : partial.trim()
246 if (true == convert.startsWith('to') && (' ' == text[2] || text.length == 2)) {
247 if (vc_visible_hints[1].type == 'input' || text.length == 2) {
250 param : text.substr(3).trim()
254 } else if (true == convert.startsWith('for') && (' ' == text[3] || text.length == 3)) {
255 if (vc_visible_hints[3].type == 'input' || text.length == 3) {
258 param : text.substr(4).trim()
273 * vc_correct_parameter function correct the voice recognition result.
275 * @param text text string from voice-control-webview.cpp.
277 function vc_correct_parameter(text) {
278 var result = vc_is_included_number(text),
279 words = result.param.split(' ');
281 if (isNaN(result.cmd) == true && isNaN(words[0]) == false) {
282 result.cmd = parseFloat(words[0]);
283 result.param = result.param.substr(words[0].length + 1).trim();
290 * vc_check_web_control function check some special keyword and run it.
292 * @param spokenWord voice recognized result string.
294 function vc_check_web_control(text) {
295 text = text.toLowerCase();
296 var convert = text.replace(/ /g, '');
297 var googleSearch = 'google search';
298 var youtubeSearch = 'youtube search';
300 if (text.startsWith(googleSearch) == true) {
301 location.href = 'https://www.google.co.kr/search?q=' + (text.substr(googleSearch.length)).trim();
302 } else if (text.startsWith(youtubeSearch) == true) {
303 location.href = 'https://www.youtube.com/results?search_query=' + (text.substr(youtubeSearch.length)).trim();
304 } else if (convert == 'refresh') {
306 } else if (convert == 'google') {
307 location.href = 'https://www.google.co.kr/';
308 } else if (convert == 'facebook') {
309 location.href = 'https://www.facebook.com/';
310 } else if (convert == 'amazon') {
311 location.href = 'https://www.amazon.com/';
312 } else if (convert == 'yahoo') {
313 location.href = 'https://www.yahoo.com/';
314 } else if (convert == 'youtube') {
315 location.href = 'https://www.youtube.com/';
316 } else if (convert == 'scrolldown') {
317 vc_scroll_event_firing('DOWN');
318 } else if (convert == 'scrollup') {
319 vc_scroll_event_firing('UP');
320 } else if (convert == 'tothetop') {
321 vc_scroll_event_firing('TOP');
322 } else if (convert == 'showsourcecode') {
324 } else if (convert == 'next' || convert == 'forward') {
326 } else if (convert == 'before' || convert == 'back' || convert == 'previous') {
328 } else if (convert == 'playlog' && vc_flag_log) {
329 if (vc_log_area.style.visibility == 'visible') vc_log_area.style.visibility = 'hidden';
330 else vc_log_area.style.visibility = 'visible';