public static String HighlightExtractedLatinWords(M_ARABICDARIJAENTRY arabicDarijaEntry, List <M_ARABICDARIJAENTRY_LATINWORD> ArabicDarijaEntryLatinWords)
        {
            // in this method ArabicDarijaEntryLatinWords are not pre-filtered

            // Highlith and add label of counts of variantes

            // find arabic darija text
            String arabicDarijaText = arabicDarijaEntry.ArabicDarijaText;

            // limit to concerned latin words
            List <M_ARABICDARIJAENTRY_LATINWORD> arabicDarijaEntryLatinWords = ArabicDarijaEntryLatinWords.FindAll(m => m.ID_ARABICDARIJAENTRY == arabicDarijaEntry.ID_ARABICDARIJAENTRY);

            foreach (var arabicDarijaEntryLatinWord in arabicDarijaEntryLatinWords)
            {
                var    mostPopularVariant = arabicDarijaEntryLatinWord.MostPopularVariant;
                var    latinWord          = arabicDarijaEntryLatinWord.LatinWord;
                var    translation        = arabicDarijaEntryLatinWord.Translation;
                var    count = arabicDarijaEntryLatinWord.VariantsCount;
                var    guid  = arabicDarijaEntryLatinWord.ID_ARABICDARIJAENTRY_LATINWORD;
                String newhtml;
                if (count > 0)
                {
                    if (String.IsNullOrEmpty(translation) == false)
                    {
                        newhtml = $@"&rlm;<b><mark>" + translation + "</mark></b>";
                    }
                    else
                    {
                        if (guid != Guid.Empty)
                        {
                            newhtml = $@"&rlm;<b><mark data-toggle='tooltip' title='{mostPopularVariant}'>{latinWord}</mark></b>
                                    <a href='/Train/Train_AddToCorpus/?arabiziWord={latinWord}&arabiziWordGuid={guid}'>
                                        <span class='badge'>{count}</span>
                                    </a>";
                        }
                        else
                        {
                            newhtml = $@"&rlm;<b><mark data-toggle='tooltip' title='{mostPopularVariant}'>{latinWord}</mark></b>
                                    <span class='badge'>{count}</span>";
                        }
                    }
                }
                else
                {
                    if (String.IsNullOrEmpty(translation) == false)
                    {
                        newhtml = $@"&rlm;<b><mark>" + translation + "</mark></b>";
                    }
                    else
                    {
                        newhtml = $@"&rlm;<b><mark>" + latinWord + "</mark></b>";
                    }
                }
                var regex = new Regex(RegexConstant.notPreceededByMark + latinWord, RegexOptions.IgnoreCase);
                arabicDarijaText = regex.Replace(arabicDarijaText, newhtml, 1);
            }

            //
            return(arabicDarijaText);
        }
        public static String DisplayEntitiesType(M_ARABICDARIJAENTRY arabicDarijaEntry, List <M_ARABICDARIJAENTRY_TEXTENTITY> TextEntities)
        {
            // limit to concerned text entities
            List <M_ARABICDARIJAENTRY_TEXTENTITY> textEntities = TextEntities.FindAll(m => m.ID_ARABICDARIJAENTRY == arabicDarijaEntry.ID_ARABICDARIJAENTRY);

            String entitiesString = String.Empty;

            foreach (var textEntity in textEntities)
            {
                if (TextEntities.IndexOf(textEntity) % 4 == 0)
                {
                    entitiesString += "<span class=\"label label-primary\">" + textEntity.TextEntity.Type + "</span> ";
                }
                else if (TextEntities.IndexOf(textEntity) % 4 == 1)
                {
                    entitiesString += "<span class=\"label label-default\">" + textEntity.TextEntity.Type + "</span> ";
                }
                else if (TextEntities.IndexOf(textEntity) % 4 == 2)
                {
                    entitiesString += "<span class=\"label label-success\">" + textEntity.TextEntity.Type + "</span> ";
                }
                else
                {
                    entitiesString += "<span class=\"label label-info\">" + textEntity.TextEntity.Type + "</span> ";
                }
            }

            return(entitiesString);
        }
        public IHttpActionResult GetArabicDarijaEntry(/*[FromBody]*/ string token, String text)
        {
            var errorMessage = string.Empty;

            if (ValidateToken(token, "GetArabicDarijaEntry", out errorMessage))
            {
                M_ARABICDARIJAENTRY arabicDarijaEntry = null;

                M_ARABIZIENTRY arabiziEntry = new M_ARABIZIENTRY
                {
                    ArabiziText      = text,
                    ArabiziEntryDate = DateTime.Now
                };

                // Arabizi to arabic script via direct call to perl script
                var textConverter = new TextConverter();

                //
                List <M_ARABICDARIJAENTRY_LATINWORD> arabicDarijaEntryLatinWords = new List <M_ARABICDARIJAENTRY_LATINWORD>();

                // Arabizi to arabic from perl script
                if (arabiziEntry.ArabiziText != null)
                {
                    lock (thisLock)
                    {
                        // complete arabizi entry
                        arabiziEntry.ID_ARABIZIENTRY = Guid.NewGuid();

                        // prepare darija from perl script
                        var arabicText = textConverter.Convert(arabiziEntry.ArabiziText);
                        arabicDarijaEntry = new M_ARABICDARIJAENTRY
                        {
                            ID_ARABICDARIJAENTRY = Guid.NewGuid(),
                            ID_ARABIZIENTRY      = arabiziEntry.ID_ARABIZIENTRY,
                            ArabicDarijaText     = arabicText
                        };

                        // Save arabiziEntry to Serialization
                        String path = HostingEnvironment.MapPath("~/App_Data/data_M_ARABIZIENTRY.txt");
                        new TextPersist().Serialize <M_ARABIZIENTRY>(arabiziEntry, path);

                        // Save arabicDarijaEntry to Serialization
                        path = HostingEnvironment.MapPath("~/App_Data/data_M_ARABICDARIJAENTRY.txt");
                        new TextPersist().Serialize <M_ARABICDARIJAENTRY>(arabicDarijaEntry, path);

                        // latin words
                        MatchCollection matches = TextTools.ExtractLatinWords(arabicDarijaEntry.ArabicDarijaText);

                        // save every match
                        // also calculate on the fly the number of varaiants
                        foreach (Match match in matches)
                        {
                            // do not consider words in the bidict as latin words
                            if (new TextFrequency().BidictContainsWord(match.Value))
                            {
                                continue;
                            }

                            String arabiziWord   = match.Value;
                            int    variantsCount = new TextConverter().GetAllTranscriptions(arabiziWord).Count;

                            var latinWord = new M_ARABICDARIJAENTRY_LATINWORD
                            {
                                ID_ARABICDARIJAENTRY_LATINWORD = Guid.NewGuid(),
                                ID_ARABICDARIJAENTRY           = arabicDarijaEntry.ID_ARABICDARIJAENTRY,
                                LatinWord     = arabiziWord,
                                VariantsCount = variantsCount
                            };

                            //
                            arabicDarijaEntryLatinWords.Add(latinWord);

                            // Save to Serialization
                            path = HostingEnvironment.MapPath("~/App_Data/data_M_ARABICDARIJAENTRY_LATINWORD.txt");
                            new TextPersist().Serialize <M_ARABICDARIJAENTRY_LATINWORD>(latinWord, path);
                        }
                    }
                }

                //
                if (arabicDarijaEntry == null)
                {
                    return(NotFound());
                }
                // return Ok(arabicDarijaEntry);

                // use expando to merge the json ouptuts : arabizi + arabic + latin words
                dynamic expando = new ExpandoObject();
                expando.M_ARABIZIENTRY                = arabiziEntry;
                expando.M_ARABICDARIJAENTRY           = arabicDarijaEntry;
                expando.M_ARABICDARIJAENTRY_LATINWORD = arabicDarijaEntryLatinWords;
                return(Ok(expando));
            }
            else
            {
                var message = new HttpResponseMessage();
                message.StatusCode = HttpStatusCode.NotAcceptable;
                message.Content    = new StringContent(errorMessage);
                return(Ok(message));
            }
        }