Ejemplo n.º 1
0
        public async override Task <Yngdieng.Frontend.V3.Protos.Word> GetWord(GetWordRequest request,
                                                                              ServerCallContext context)
        {
            if (string.IsNullOrEmpty(request.Name))
            {
                throw new RpcException(new Status(StatusCode.InvalidArgument, "name must not be empty"));
            }
            var docId = ResourceNames.ToDocId(request.Name);

            if (_indexHolder.GetIndex().DocIdRedirections.ContainsKey(docId))
            {
                var redirectionTarget = _indexHolder.GetIndex().DocIdRedirections[docId];
                _logger.LogInformation($"DocId Redirection: {docId} -> {redirectionTarget}");
                docId = redirectionTarget;
            }
            DocRef docRef;

            try
            {
                docRef = DocRefs.Decode(docId);
            }
            catch (Exception e)
            {
                throw new RpcException(new Status(StatusCode.InvalidArgument, $"{request.Name} is not a valid name.", e));
            }
            var userPreference = UserPreferences.FromContext(context);
            var zhConverter    = new ZhConverter(_openCc, userPreference.ZhConversionPreference);

            return(await Words.GetWord(_indexHolder, _dbContext, zhConverter, docRef));
        }
Ejemplo n.º 2
0
        public async override Task <ListWordListWordsResponse> ListWordListWords(ListWordListWordsRequest request,
                                                                                 ServerCallContext context)
        {
            if (string.IsNullOrEmpty(request.Parent))
            {
                throw new RpcException(new Status(StatusCode.InvalidArgument, "parent must not be empty"));
            }
            var wordListId = ResourceNames.ToWordListId(request.Parent);

            var pageSize = Math.Min(MaxPageSize, request.PageSize > 0 ? request.PageSize : DefaultPageSize);
            var offset   = ParsePageToken(request.PageToken);
            var wordIds  = await _dbContext.WordListWords
                           .Where(w => w.WordListId == wordListId)
                           .OrderBy(w => w.Ordering)
                           .Select(w => w.WordId)
                           .Skip(offset)
                           .Take(pageSize)
                           .ToListAsync();

            var words          = new List <Yngdieng.Frontend.V3.Protos.Word>();
            var userPreference = UserPreferences.FromContext(context);
            var zhConverter    = new ZhConverter(_openCc, userPreference.ZhConversionPreference);

            foreach (var wordId in wordIds)
            {
                words.Add(await Words.GetWord(_indexHolder, _dbContext, zhConverter, ResourceNames.ToDocRef(wordId), Words.Mode.Snippet));
            }
            return(new ListWordListWordsResponse
            {
                Words = { words },
                NextPageToken = (offset + words.Count).ToString()
            });
        }
Ejemplo n.º 3
0
        public static async Task <Word> GetWord(
            IIndexHolder _indexHolder,
            AdminContext _dbContext,
            ZhConverter zhConverter,
            DocRef docRef,
            Mode mode = Mode.Full)
        {
            var maybeYngdiengDocument = _indexHolder.GetIndex().YngdiengDocuments
                                        .SingleOrDefault(yDoc => yDoc.DocId == DocRefs.Encode(docRef));
            var maybeWordId = string.IsNullOrEmpty(docRef.ZingzeuId)
                ? (int?)null : int.Parse(docRef.ZingzeuId, NumberStyles.HexNumber);
            var maybeWord = maybeWordId == null
                ? null
                : await _dbContext.Words
                            .Where(w => w.WordId == maybeWordId)
                            .Include(w => w.PreferredSandhiAudio)
                            .SingleOrDefaultAsync();

            if (maybeYngdiengDocument == null && maybeWord == null)
            {
                throw new RpcException(new Status(StatusCode.NotFound, "Not found."));
            }
            var extensions = await _dbContext.Extensions.Where(e => e.WordId == maybeWordId).ToListAsync();

            var prons = await _dbContext.Prons.Where(p => p.WordId == maybeWordId).ToListAsync();

            var hanzi            = zhConverter.tH(await GetHanzi(_dbContext, maybeYngdiengDocument, maybeWordId));
            var recommendedProns = mode == Mode.Snippet
                ? PronChooser.GetSnippetPronunciations(maybeYngdiengDocument, prons, maybeWord?.PreferredSandhiAudio)
                : PronChooser.GetRecommendedPronunciations(maybeYngdiengDocument, prons, maybeWord?.PreferredSandhiAudio);
            var explanations = mode == Mode.Snippet
                ? Enumerable.Empty <RichTextNode>()
                : GetExplanations(zhConverter, hanzi, maybeYngdiengDocument, extensions);
            var audioCards = mode == Mode.Snippet ? Enumerable.Empty <Word.Types.AudioCard>()
                : await GetAudioCards(_dbContext, recommendedProns, maybeWordId);

            var wordLists = mode == Mode.Full && maybeWordId.HasValue
                ? await Queries.QueryWordListsByWordId(_dbContext, maybeWordId.Value).Select(wl => Renderers.ToWordList(wl)).ToListAsync()
                : Enumerable.Empty <WordList>();

            return(new Word
            {
                Name = ResourceNames.ToWordName(docRef),
                Hanzi = hanzi,
                Pronunciations = { recommendedProns },
                Explanation = { explanations },
                Snippet = zhConverter.tH(GetSnippet(maybeYngdiengDocument, extensions)),
                AudioCards = { audioCards },
                WordLists =
                {
                    wordLists
                }
            });
        }
Ejemplo n.º 4
0
        public override Task <SearchV2Response> SearchV2(SearchV2Request request,
                                                         ServerCallContext context)
        {
            var userPreference  = UserPreferences.FromContext(context);
            var query           = GetLuceneQuery(QueryParser.Parse(request.Query));
            var desiredPageSize = request.PageSize > 0 ? request.PageSize : DefaultPageSize;
            var searcher        = this._indexHolder.LuceneIndexSearcher;

            var resultCards = new List <SearchV2Response.Types.SearchCard>();

            TopDocs results;

            if (string.IsNullOrEmpty(request.PageToken))
            {
                // Is first page
                results = searcher.Search(query, userPreference.ShowSourcelessSearchResults ? null : FilterSourcelessDocs, desiredPageSize + 1);
                // first page && no results
                if (results.ScoreDocs.Length == 0)
                {
                    return(Task.FromResult(new SearchV2Response
                    {
                        ResultCards = { NoResultsCard() }
                    }));
                }
            }
            else
            {
                var lastPage     = PaginationTokens.Parse(request.PageToken);
                var lastScoreDoc = new ScoreDoc(lastPage.LastDoc.Doc, lastPage.LastDoc.Score);
                results = searcher.SearchAfter(lastScoreDoc, query, userPreference.ShowSourcelessSearchResults ? null : FilterSourcelessDocs, desiredPageSize + 1);
            }

            var zhConverter    = new ZhConverter(_openCc, userPreference.ZhConversionPreference);
            var response       = new SearchV2Response();
            var isEndOfResults = results.ScoreDocs.Length < desiredPageSize + 1;

            if (isEndOfResults)
            {
                resultCards.AddRange(RenderDocs(results.ScoreDocs, zhConverter));
                resultCards.Add(EndOfResultsCard());
            }
            else
            {
                var visibleRange  = results.ScoreDocs.Take(desiredPageSize);
                var nextPageToken = PaginationTokens.FromScoreDoc(visibleRange.Last());
                response.NextPageToken = nextPageToken;
                resultCards.AddRange(RenderDocs(visibleRange, zhConverter));
            }

            response.ResultCards.AddRange(resultCards);
            return(Task.FromResult(response));
        }
    public override void SetContent(int index, Dictionary <string, object> data)
    {
        m_poemData = (poemDataGenerate)data["poemData"];

        if (LanguageManager.s_currentLanguage == SystemLanguage.ChineseTraditional)
        {
            SetText("Text_poemName", ZhConverter.Convert(m_poemData.m_poemName, ZhConverter.To.Traditional));
            SetText("Text_author", ZhConverter.Convert(m_poemData.m_author, ZhConverter.To.Traditional));
        }
        else
        {
            SetText("Text_poemName", m_poemData.m_poemName);
            SetText("Text_author", m_poemData.m_author);
        }
    }
    public override void SetContent(int index, Dictionary <string, object> data)
    {
        string content = (string)data["content"];

        if (content.Contains("space"))
        {
            SetText("Text", "");
        }
        else
        {
            if (LanguageManager.s_currentLanguage == SystemLanguage.ChineseTraditional)
            {
                SetText("Text", ZhConverter.Convert(content, ZhConverter.To.Traditional));
            }
            else
            {
                SetText("Text", content);
            }
        }
    }
Ejemplo n.º 7
0
        private static RichTextNode[] GetExplanations(
            ZhConverter zhConverter,
            string hanzi,
            YngdiengDocument?maybeYngdiengDocument,
            IEnumerable <Extension> extensions
            )
        {
            var output   = new List <RichTextNode>();
            var fengDocs = maybeYngdiengDocument?.Sources
                           .Where(s => s.SourceCase == YngdiengDocument.Types.Source.SourceOneofCase.Feng).Select(s => s.Feng)
                           ?? Enumerable.Empty <FengDocument>();

            var fengRenderer = new FengRichTextRenderer(zhConverter);

            output.AddRange(fengDocs.Select(f => fengRenderer.ToRichTextNode(f)));
            var hDocs = maybeYngdiengDocument?.Sources
                        .Where(s => s.SourceCase == YngdiengDocument.Types.Source.SourceOneofCase.CiklinDfd)
                        .Select(s => s.CiklinDfd)
                        .ToList()
                        ?? new List <HistoricalDocument>();

            var histRenderer = new HistoricalRichTextRenderer(zhConverter);

            output.AddRange(hDocs.Select(hDoc => histRenderer.ToRichTextNode(hDoc)));

            var extRenderer = new ExtensionRichTextRenderer(zhConverter);

            output.AddRange(extensions.Select(e => extRenderer.ToRichTextNode(hanzi, e.Explanation, e.Source, e.Contributors)));
            if (extensions.Count() == 0)
            {
                var contribFromIndex = maybeYngdiengDocument?.Sources
                                       .Where(s => s.SourceCase == YngdiengDocument.Types.Source.SourceOneofCase.Contrib)
                                       .Select(s => s.Contrib) ?? Enumerable.Empty <ContribDocument>();
                var contribRenderer = new ContribRichTextRenderer(zhConverter);
                output.AddRange(contribFromIndex.Select(c => contribRenderer.ToRichTextNode(c)));
            }

            return(output.ToArray());
        }
Ejemplo n.º 8
0
    static void CreateAnswer()
    {
        PuzzleService.Reset();

        //去掉已出的所有句子
        for (int i = 0; i <= s_currentLine; i++)
        {
            PuzzleService.RemoveSentence(currentPoemData.m_content[i]);
        }

        PuzzleService.RemoveSentence(GetCurrentContent());

        s_correctIndex = GetRandomIndex(true);

        //正确答案
        m_questions[s_correctIndex] = GetCurrentContent();

        //错误答案
        m_questions[GetRandomIndex(false)] = PuzzleService.GetErrorAnswer(GetCurrentContent());
        m_questions[GetRandomIndex(false)] = PuzzleService.GetErrorAnswer(GetCurrentContent());
        m_questions[GetRandomIndex(false)] = PuzzleService.GetErrorAnswer(GetCurrentContent());

        if (LanguageManager.s_currentLanguage == SystemLanguage.ChineseTraditional)
        {
            m_questions[0] = ZhConverter.Convert(m_questions[0], ZhConverter.To.Traditional);
            m_questions[1] = ZhConverter.Convert(m_questions[1], ZhConverter.To.Traditional);
            m_questions[2] = ZhConverter.Convert(m_questions[2], ZhConverter.To.Traditional);
            m_questions[3] = ZhConverter.Convert(m_questions[3], ZhConverter.To.Traditional);
        }

        if (s_GameModel == GameModel.Arcade && HP == 0)
        {
            return;
        }

        GlobalEvent.DispatchEvent(GameEventEnum.QuestionChange);
    }
Ejemplo n.º 9
0
        private IEnumerable <SearchV2Response.Types.SearchCard> RenderDocs(IEnumerable <ScoreDoc> scoreDocs, ZhConverter zhConverter)
        {
            var searcher = this._indexHolder.LuceneIndexSearcher;

            return(scoreDocs.Select(sd =>
            {
                var docId = searcher.Doc(sd.Doc).GetField(LuceneUtils.Fields.DocId).GetStringValue();
                var ydDoc = _indexHolder.GetIndex().YngdiengDocuments.Single(y => y.DocId == docId);

                return new SearchV2Response.Types.SearchCard
                {
                    Word = new SearchV2Response.Types.SearchCard.Types.WordCard
                    {
                        Id = docId,
                        Yngping = RichTextUtil.FromString(ydDoc.YngpingSandhi.OrElse(ydDoc.YngpingUnderlying)),
                        Hanzi = RichTextUtil.FromString(zhConverter.tH(HanziUtils.HanziToString(ydDoc.HanziCanonical))),
                        Details = RichTextUtil.FromString(zhConverter.tM(Yngdieng.Backend.Services.Frontend.Words.GetSnippet
                                                                             (ydDoc, new Extension[] { }))),
                        Score = sd.Score
                    }
                };
            }));
        }
Ejemplo n.º 10
0
 public FengRichTextRenderer(ZhConverter zhConverter, StructuredExplanationRenderer explanationRenderer)
 {
     this.zc = zhConverter;
     this.explanationRenderer = explanationRenderer;
 }
 public ExtensionRichTextRenderer(ZhConverter zhConverter)
 {
     this.zc = zhConverter;
     this.explanationRenderer = new StructuredExplanationRenderer(zhConverter);
 }
 public HistoricalRichTextRenderer(ZhConverter zhConverter)
 {
     this.zc = zhConverter;
 }
Ejemplo n.º 13
0
 public StructuredExplanationRenderer(ZhConverter zhConverter)
 {
     this.zc = zhConverter;
 }