-

   rss_rss_hh_new

 - e-mail

 

 -

 LiveInternet.ru:
: 17.03.2011
:
:
: 51

:


, 09 2017 . 00:32 +
. Android Lingualeo, , .

. . API . API Yandex API (API API ).

. .

JavaScript JQuery.

:

            var oneWord = function() {
                $.post("https://dictionary.yandex.net/api/v1/dicservice.json/lookup",
                    {
                        key: apiKey, 
                        lang: lang, 
                        text: words[index].text
                    }, function(data) 
                    {
                        words[index].tr = "";
                        words[index].ts = "";
                        for (var j = 0; j < data.def.length; j++) {
                            var def = data.def[j];
                            for (var k = 0; k < def.tr.length; k++) {
                                var tr = def.tr[k];
                                words[index].tr += tr.text + "; ";
                            }					
                            if (def.ts)
                                words[index].ts = def.ts;
                        }
                        if (words[index].tr == "") {
                            translateWords();
                            tsWords();
                            return;
                        } else {
                            var str = words[index].tr;
                            words[index].tr = str.substring(0, str.length - 2);
                        }
                        complete();
                    }, 
                "json");
            };
            var tsWords = function() {
                var text = words[index].text;
                var tsText = "";
                var tsWords = text.match(/\S+/gi);
                var tsIndex = 0;
                var tsPost = function() {
                    $.post("https://dictionary.yandex.net/api/v1/dicservice.json/lookup",
                        {
                            key: apiKey, 
                            lang: lang, 
                            text: tsWords[tsIndex]
                        }, function(data) 
                        {
                            var ts = "";
                            for (var j = 0; j < data.def.length; j++) {
                                    var def = data.def[j];
                                    if (def.ts)
                                            ts = def.ts;
                            }
                            tsText += ts + " ";
                            if ((tsIndex < (tsWords.length - 1)) && (tsIndex < 5)) {
                                tsIndex++;
                                tsPost();
                            } else {
                                words[index].ts = tsText.trim();
                                complete(false, true);
                            }
                        },
                    "json");
                };
                tsPost();
            };
            var translateWords = function() {
                $.post("https://translate.yandex.net/api/v1.5/tr.json/translate",
                    {
                        key: apiKeyTranslate, 
                        lang: slang, 
                        text: words[index].text
                    }, function(data) 
                    {
                        words[index].tr = "";
                        for (var j = 0; j < data.text.length; j++) {
                            var text = data.text[j];
                            words[index].tr += text + "; ";
                        }
                        var str = words[index].tr;
                        words[index].tr = str.substring(0, str.length - 2);
                        complete(true, false);
                    },
                "json");
            };
            var qu = function() {
                if (!words[index].tr) {
                    oneWord();
                } else {
                    complete();
                } 
            };
            qu();

oneWord , tsWords ( , ), translateWords .

complete :

        var complete = function(tr, ts) {
            if (ts == undefined) ts = true;
            if (tr == undefined) tr = true;
            var word = words[index];
            if (tr) $("#text").html(word.text);
            if (ts) $("#ts").html("[" + word.ts + "]");
            $("#tr").hide();
            $("#attempt").hide();
            $("#show").show();
            $("#tr").html(word.tr);
            $("#tts").show();
        };

words index . :

        var words = [],
            patternCount = 5,
            indexMemory = {},
            indexMemoryCount = 0,
            patternIndex = [],
            lastIndex = -1,
            lastIndexs = [],
            lastIndexsCount =  2,
            wasAttempt = false,
            wasMemory = false,
            deep = 0,
            deepMax = 100; 

        var index = nextIndex();

        var nextIndex = function() {
            deep++;
            if (lastIndexsCount - words.length >= 0) {
                lastIndexsCount = 0;
            } 
            if ((patternIndex.length < patternCount) && (indexMemoryCount < words.length)) {
                if (deep > deepMax) {
                    
                    var index = maxAttemptsIndex(true);
                    return index;
                }
                var index = Math.floor(Math.random() * words.length);
                if (indexMemory[index]) {
                    return nextIndex();
                }
                indexMemory[index] = "do";
                indexMemoryCount++;
                patternIndex.push(index);
                lastIndex = index;
                pushIndex(lastIndex);
                return index;
            } else {
                var index = Math.floor(Math.random() * (patternIndex.length + 1));
                if (index == patternIndex.length || (patternIndex.length == 0)) {
                    wasMemory = true;
                    var ind = maxAttemptsIndex();
                    if (inArray(lastIndexs, ind)) 
                    {
                        if (deep > deepMax) {
                            ind = Math.floor(Math.random() * words.length);
                            lastIndex = ind;
                            pushIndex(lastIndex);
                            return ind;
                        }
                        return nextIndex();
                    }
                    lastIndex = ind;
                    pushIndex(lastIndex);
                    return ind;
                }
                if (inArray(lastIndexs, patternIndex[index])) return nextIndex();
                lastIndex = patternIndex[index];
                pushIndex(lastIndex);
                return patternIndex[index];
            }
        };

        var maxAttemptsIndex = function(notAttempts) {
            var arr = sortMemoryIndexes(indexMemory);
            var index = getRandomFishIndex(arr, notAttempts);
            return index;
        };

       var pushIndex = function(index) {
            if (lastIndexsCount == 0) return;
            if (lastIndexs.length < lastIndexsCount) {
                lastIndexs.push(index);
            } else {
                lastIndexs[0] = lastIndexs[1];
                lastIndexs[1] = index;
            }
        };

        var inArray = function(arr, elem) {
            for (var i = 0; i < arr.length; i++) {
                if (arr[i] == elem) 
                    return true;
            }
            return false;
        };

        function getRandomFishIndex(arr, notAttempts) {
            var fishForLevel = arr;
            var fishTotalWeight = 0, fishCumWeight = 0, i;
            // sum up the weights
            for (i = 0; i < fishForLevel.length; i++) {
                fishTotalWeight += fishForLevel[i].attempts;
            }
            if (notAttempts) {
                fishTotalWeight = 0;
            }
            var random = Math.floor(Math.random() * fishTotalWeight);
            // now find which bucket out random value is in
            if (fishTotalWeight == 0) return fishForLevel[Math.floor(Math.random() * fishForLevel.length)].index;
            for (i = 0; i < fishForLevel.length; i++) {
                fishCumWeight += fishForLevel[i].attempts;
                if (random <= fishCumWeight) {
                    return fishForLevel[i].index;
                }
            }
        }

        function sortMemoryIndexes(indexMemory) {
            var arr = [];
            for (var key in indexMemory) {
                if (indexMemory[key] == "do") {
                    var word = jQuery.extend(true, {}, words[key]);
                    word.index = key;
                    arr.push(word);
                }
            }
            var sAttempt = function(first, second) {
                if (first.attempts < second.attempts)
                    return 1;
                else if (first.attempts > second.attempts)
                    return -1;
                else
                    return 0;
            };
            return arr.sort(sAttempt);
        }

, , . , .

.

        $("#attempt").click(function()
        { 
            words[index].attempts++;
            wasAttempt = true;
            $("#attempt").hide();
        });

. . HTML JavaScript Cordova Android.

EnglishWords . . . * . . . , 5 . , 5 . , . . 1000 .

yandex google api , . .

:

Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/335212/

:  

: [1] []
 

:
: 

: ( )

:

  URL