コード例 #1
0
        private (List <string> questions, List <Error> errors) ExtractMoreQuestions(LUFileParser.QnaSectionContext parseTree)
        {
            var questions     = new List <string>();
            var errors        = new List <Error>();
            var questionsBody = parseTree.qnaDefinition().moreQuestionsBody();

            foreach (var errorQuestionStr in questionsBody.errorQuestionString())
            {
                if (!string.IsNullOrEmpty(errorQuestionStr.GetText().Trim()))
                {
                    errors.Add(
                        Diagnostic.BuildDiagnostic(
                            message: $"Invalid QnA question line, did you miss '-' at line begin",
                            context: errorQuestionStr));
                }
            }

            foreach (var question in questionsBody.moreQuestion())
            {
                var questionText = question.GetText().Trim();
                questions.Add(questionText.Substring(1).Trim());
            }

            return(questions, errors);
        }
コード例 #2
0
        private string ExtractAnswer(LUFileParser.QnaSectionContext parseTree)
        {
            var multiLineAnswer = parseTree.qnaDefinition().qnaAnswerBody().multiLineAnswer().GetText().Trim();

            // trim first and last line
            // TODO: validate this regex
            var answerRegexp = new Regex(@"^```(markdown)?\r*\n(?<answer>(.|\n|\r\n|\t| )*)\r?\n.*?```$", RegexOptions.IgnoreCase | RegexOptions.Multiline);
            var answer_match = answerRegexp.Match(multiLineAnswer);
            var answer_group = answer_match.Groups["answer"];

            return(answer_group.Success ? answer_group.Value : string.Empty);
        }
コード例 #3
0
        private string ExtractSourceInfo(LUFileParser.QnaSectionContext parseTree)
        {
            var srcAssignment = parseTree.qnaDefinition().qnaSourceInfo();

            if (srcAssignment != null)
            {
                var srcRegExp = new Regex(@"^[ ]*\>[ ]*!#[ ]*@qna.pair.source[ ]*=[ ]*(?<sourceInfo>.*?)$", RegexOptions.Multiline | RegexOptions.IgnoreCase);
                var srcMatch  = srcRegExp.Match(srcAssignment.GetText().Trim());
                return(srcMatch.Groups["sourceInfo"].Success ? srcMatch.Groups["sourceInfo"].Value : QNAGENERICSOURCE);
            }

            return(QNAGENERICSOURCE);
        }
コード例 #4
0
        private string ExtractAssignedId(LUFileParser.QnaSectionContext parseTree)
        {
            var idAssignment = parseTree.qnaDefinition().qnaIdMark();

            if (idAssignment != null)
            {
                var idTextRegExp = new Regex(@"^\<a[ ]*id[ ]*=[ ]*[""\'](?<idCaptured>.*?)[""\'][ ]*>[ ]*\<\/a\>$", RegexOptions.Multiline | RegexOptions.IgnoreCase);
                var idTextMatch  = idTextRegExp.Match(idAssignment.GetText().Trim());
                return(idTextMatch.Groups["idCaptured"].Success ? idTextMatch.Groups["idCaptured"].Value : null);
            }

            return(null);
        }
コード例 #5
0
        /// <summary>
        /// Initializes a new instance of the <see cref="QnaSection"/> class.
        /// </summary>
        /// <param name="parseTree">The qna context from the parse tree.</param>
        public QnaSection(LUFileParser.QnaSectionContext parseTree)
        {
            if (parseTree == null)
            {
                throw new ArgumentNullException(nameof(parseTree));
            }

            SectionType = SectionType.QnaSection;
            Questions   = new List <string>()
            {
                ExtractQuestion(parseTree)
            };
            var result = ExtractMoreQuestions(parseTree);

            Questions.AddRange(result.questions);
            Errors = result.errors;
            var result2 = ExtractFilterPairs(parseTree);

            FilterPairs = result2.filterPairs;
            Errors.AddRange(result2.errors);
            Answer = ExtractAnswer(parseTree);
            var result3 = ExtractPrompts(parseTree);

            Prompts     = result3.promptDefinitions;
            PromptsText = result3.promptTextList;
            Errors.AddRange(result3.errors);
            QAPairId = ExtractAssignedId(parseTree);
            Source   = ExtractSourceInfo(parseTree);
            var startPosition = new Position {
                Line = parseTree.Start.Line, Character = parseTree.Start.Column
            };
            var stopPosition = new Position {
                Line = parseTree.Stop.Line, Character = parseTree.Stop.Column + parseTree.Stop.Text.Length
            };

            Range = new Range {
                Start = startPosition, End = stopPosition
            };
        }
コード例 #6
0
 /// <summary>
 /// Visit a parse tree produced by <see cref="LUFileParser.qnaSection"/>.
 /// <para>
 /// The default implementation returns the result of calling <see cref="AbstractParseTreeVisitor{Result}.VisitChildren(IRuleNode)"/>
 /// on <paramref name="context"/>.
 /// </para>
 /// </summary>
 /// <param name="context">The parse tree.</param>
 /// <return>The visitor result.</return>
 public virtual Result VisitQnaSection([NotNull] LUFileParser.QnaSectionContext context)
 {
     return(VisitChildren(context));
 }
コード例 #7
0
        private (List <PromptDefinition> promptDefinitions, List <string> promptTextList, List <Error> errors) ExtractPrompts(LUFileParser.QnaSectionContext parseTree)
        {
            var promptDefinitions = new List <PromptDefinition>();
            var promptTextList    = new List <string>();
            var errors            = new List <Error>();
            var promptSection     = parseTree.qnaDefinition().promptSection();

            if (promptSection == null)
            {
                return(promptDefinitions, promptTextList : null, errors);
            }

            if (promptSection.errorFilterLine() != null)
            {
                foreach (var errorFilterLineStr in promptSection.errorFilterLine())
                {
                    if (!string.IsNullOrEmpty(errorFilterLineStr.GetText().Trim()))
                    {
                        errors.Add(
                            Diagnostic.BuildDiagnostic(
                                message: $"Invalid QnA prompt line, expecting '-' prefix for each line.",
                                context: errorFilterLineStr));
                    }
                }
            }

            foreach (var promptLine in promptSection.filterLine())
            {
                var filterLineText = promptLine.GetText().Trim();
                filterLineText = filterLineText.Substring(1).Trim();
                promptTextList.Add(filterLineText);
                var promptConfigurationRegExp = new Regex(@"^\[(?<displayText>.*?)]\([ ]*\#[ ]*[ ?]*(?<linkedQuestion>.*?)\)[ ]*(?<contextOnly>\`context-only\`)?.*?$", RegexOptions.Multiline | RegexOptions.IgnoreCase);
                var splitLineMatch            = promptConfigurationRegExp.Match(filterLineText);
                if (!splitLineMatch.Success)
                {
                    errors.Add(
                        Diagnostic.BuildDiagnostic(
                            message: $"Invalid QnA prompt definition. Unable to parse prompt. Please verify syntax as well as question link.",
                            context: promptLine));
                }

                promptDefinitions.Add(
                    new PromptDefinition()
                {
                    DisplayText    = splitLineMatch.Groups["displayText"].Value,
                    LinkedQuestion = splitLineMatch.Groups["linkedQuestion"].Value,
                    ContextOnly    = splitLineMatch.Groups["linkedQuestion"].Value
                });
            }

            return(promptDefinitions, promptTextList, errors);
        }
コード例 #8
0
        private (List <QnaTuple> filterPairs, List <Error> errors) ExtractFilterPairs(LUFileParser.QnaSectionContext parseTree)
        {
            var filterPairs   = new List <QnaTuple>();
            var errors        = new List <Error>();
            var filterSection = parseTree.qnaDefinition().qnaAnswerBody().filterSection();

            if (filterSection != null)
            {
                if (filterSection.errorFilterLine() != null)
                {
                    foreach (var errorFilterLineStr in filterSection.errorFilterLine())
                    {
                        if (!string.IsNullOrEmpty(errorFilterLineStr.GetText().Trim()))
                        {
                            errors.Add(
                                Diagnostic.BuildDiagnostic(
                                    message: $"Invalid QnA filter line, did you miss '-' at line begin",
                                    context: errorFilterLineStr));
                        }
                    }
                }

                foreach (var filterLine in filterSection.filterLine())
                {
                    var filterLineText = filterLine.GetText().Trim();
                    filterLineText = filterLineText.Substring(1).Trim();
                    var filterPair = filterLineText.Split('=');
                    var key        = filterPair[0].Trim();
                    var value      = filterPair[1].Trim();
                    filterPairs.Add(new QnaTuple {
                        Key = key, Value = value
                    });
                }
            }

            return(filterPairs, errors);
        }
コード例 #9
0
 private string ExtractQuestion(LUFileParser.QnaSectionContext parseTree)
 {
     return(parseTree.qnaDefinition().qnaQuestion().questionText().GetText().Trim());
 }
コード例 #10
0
 /// <summary>
 /// Exit a parse tree produced by <see cref="LUFileParser.qnaSection"/>.
 /// <para>The default implementation does nothing.</para>
 /// </summary>
 /// <param name="context">The parse tree.</param>
 public virtual void ExitQnaSection([NotNull] LUFileParser.QnaSectionContext context)
 {
 }