public IEnumerable <Tuple <string, NumberRoot, List <ParagraphFormatException> > > Extract(ParsedFile file) { var result = ExtractInternal(file).ToArray(); if (result.Length == 0) { yield return(new Tuple <string, NumberRoot, List <ParagraphFormatException> >("错误", new NumberRoot(), new List <ParagraphFormatException> { new SevereException("什么都没解析出来"), })); } for (var i = 0; i < result.Length; ++i) { var item = result[i]; if (i == result.Length - 1) { var maxN = NumberNodeHelper.GetMaxNumber(item.Item2); if (maxN < 15 || maxN > 30) { item.Item3.Add( new SevereException($"最后的最大题号是{maxN}, 不正常(应在15-30间)")); } } yield return(item); } }
private ParagraphFormatException?CheckLastChoiceContent(NumberNode node) { if (node.Children.Any()) { var lastChoiceContent = NodeHelper.ConcatNodeContent(node.Children.Last(), false); if (lastChoiceContent.Length > 200) { return(new NumberException( "选项内容过长,可能是中间缺少了题号,以致未能正确分割", string.Join(" ", NumberNodeHelper.GetNumberChain(node)), lastChoiceContent)); } } return(null); }
private NumberNode?ConsumeNumberFromDataView(ref IDataView data, int paragraphOrder) { var backup = _numberManager.Save(); InvalidNumberException?exception = null; foreach (var result in _decoratedNumberParser.Consume(data)) { if (result.Result.Number.IntNumber > 50) { continue; } try { var node = _numberManager.AddNumber(result.Result, paragraphOrder); data = result.DataView; exception = null; return(node); } catch (ReadingParagraphNumberException) { _numberManager.Load(backup); } catch (InvalidNumberException e) { exception = e; _numberManager.Load(backup); } } if (exception != null) { var p = _numberManager.Current; if (p == null) { throw new NumberException(exception.Message, $"Paragraph {paragraphOrder}", data.CurrentView.ToString()); } var chain = NumberNodeHelper.GetNumberChain(p); throw new NumberException(exception.Message, string.Join(" ", chain), data.CurrentView.ToString()); } return(null); }
protected override bool NumberNodeVisitor_OnVisited(NumberNode node, int level, out List <ParagraphFormatException> exceptions) { exceptions = new List <ParagraphFormatException>(); var m = _childScoreRegex.Match(node.Header); if (m.Success) { var score = double.Parse(m.Groups["score"].Value); foreach (var child in node.Children) { child.Score = score; } } m = _sumScoreRegex.Match(node.Header); if (m.Success) { var score = double.Parse(m.Groups["score"].Value); node.Score = score; } else { m = _currentScoreRegex.Match(node.Header); if (m.Success) { if (!double.TryParse(m.Groups["score"].Value, out var score)) { exceptions.Add( new NumberException( $"遇到 \"{m.Groups["score"].Value}\",应为数字", string.Join(" ", NumberNodeHelper.GetNumberChain(node)), node.Header)); } node.Score = score; } } return(true); }