Пример #1
0
        public async Task <IActionResult> AddWordExample(int wordId, [FromBody] Example example)
        {
            var wordFromDb = await _repo.GetOneWithCondition <Word>(word => word.Id == wordId);

            var exampleFromDb = await _repo.GetOneWithCondition <Example>(example => example.Eng.TrimStart().TrimEnd().Equals(example.Eng.TrimStart().TrimEnd()) || example.Vie.TrimStart().TrimEnd().Equals(example.Vie.TrimStart().TrimEnd()));

            if (wordFromDb == null)
            {
                return(NotFound());
            }
            if (exampleFromDb == null)
            {
                var newExample = new Example()
                {
                    Eng      = example.Eng,
                    Vie      = example.Vie,
                    Inserted = DateTime.Now
                };
                _repo.Create(newExample);
                var wordExample = new WordExample()
                {
                    WordId    = wordId,
                    ExampleId = newExample.Id
                };
                _repo.Create(wordExample);
            }
            else
            {
                var wordExample = new WordExample()
                {
                    WordId    = wordId,
                    ExampleId = exampleFromDb.Id
                };
                _repo.Create(wordExample);
            }

            if (await _repo.SaveAll())
            {
                return(Ok());
            }
            return(BadRequest("Error on adding example"));
        }
Пример #2
0
 public bool Update(WordExample model)
 {
     throw new NotImplementedException();
 }
Пример #3
0
 public WordExample Create(WordExample model)
 {
     throw new NotImplementedException();
 }
Пример #4
0
        private void ReadWordSenseParts(XElement itemElement, Item item)
        {
            // item/gc*
            int gcLetter = (char)('a' - 1);
            int rank     = 0;

            foreach (XElement gc in itemElement.Elements("gc"))
            {
                gcLetter++;
                string pos = gc.Element("pos")?.Value;

                // item/gc/sns+
                foreach (XElement sns in gc.Elements("sns"))
                {
                    rank++;
                    WordSensePart part = new WordSensePart
                    {
                        ItemId  = item.Id,
                        UserId  = USERID,
                        Rank    = rank,
                        SenseId = $"{(char)gcLetter}.{rank}",
                        // assume for sns the 1st tip/usg child if any
                        Tip   = sns.Element("tip")?.Value,
                        Usage = sns.Element("usg")?.Value
                    };

                    // item/gc/sns/t+
                    // Ideally we should have only 1 t for 1 sns, but who knows
                    StringBuilder sb = new StringBuilder();
                    foreach (XElement t in sns.Elements("t"))
                    {
                        // by now, as a best guess, just keep only hi, qf, x, xr, and text
                        XElement filtered = FilterElement(t, _tAllowedChildren);
                        if (sb.Length > 0)
                        {
                            sb.Append(" | ");
                        }
                        sb.Append(filtered.Value);
                    }
                    // TODO determine when it's a list of words
                    part.Explanation.Value = sb.ToString();

                    // item/gc/sns/ex+ and its ext if any
                    string lemma = itemElement.Element("lemma").Value;
                    foreach (XElement ex in sns.Elements("ex"))
                    {
                        WordExample example = new WordExample
                        {
                            Usage  = ex.Element("usg")?.Value,
                            Tip    = ex.Element("tip")?.Value,
                            Source = ex.Element("src")?.Value
                        };
                        // filter ex
                        XElement filtered = FilterElement(ex, _exAllowedChildren);
                        // expand q in ex (assume expansion is lemma)
                        foreach (XElement q in filtered.Elements("q").ToList())
                        {
                            q.Value = lemma;
                        }
                        example.Value = filtered.Value;

                        // ext, filtered
                        XElement next = ex.ElementsAfterSelf().FirstOrDefault();
                        if (next?.Name.LocalName == "ext")
                        {
                            example.Explanation = FilterElement(next, _extAllowedChildren).Value;
                        }

                        part.Examples.Add(example);
                    }

                    // item/gc/sns/related*
                    foreach (XElement related in sns.Elements("related"))
                    {
                        string type = related.ReadOptionalAttribute("t", null);
                        foreach (XElement qf in related.Elements("qf"))
                        {
                            var t = ParseLemmaHom(qf.Value);
                            part.Links.Add(new WordLink
                            {
                                Type        = type ?? "-",
                                TargetId    = BuildWordKey(t.Item1, t.Item2),
                                TargetLabel = qf.Value
                            });
                        }
                    }

                    item.Parts.Add(part);
                }
            }
        }