public virtual IEnumerable <ParsedResult <BaseNumber> > Consume(IDataView data) { if (data.EndOfStream) { yield break; } var m = regex.Match(data.CurrentView.ToString()); if (!m.Success) { yield break; } var rawNumber = m.Value; var number = ParseRawNumber(rawNumber); if (!number.HasValue) { yield break; } yield return(new ParsedResult <BaseNumber>( result: ConstructNumber(rawNumber, number.Value), dataView: data.CloneByDelta(m.Index + m.Length))); }
public override IEnumerable <ParsedResult <BaseDecoratedNumber> > Consume(IDataView data) { if (data.EndOfStream) { yield break; } Match m; foreach (var numberResult in ConsumeNumber(data)) { data = numberResult.DataView; var number = numberResult.Result; string delimiter; if (!(m = delimiterRegex.Match(data.CurrentView.ToString())).Success) { if (number is RomanNumber && data.CurrentView.Length > 0 && beginWithAlphaRegex.IsMatch(data.CurrentView.Slice(0, 1).ToString())) { continue; } if ((number is ChineseNumber || number is ChineseIdeographNumber) && data.CurrentView.ToString().ReplaceBetween("[((]", "[))]").Length > 14) { continue; } if (number is ChineseNumber chNum && chNum.RawNumber == "两") { continue; } if (!blackNumberSuffix.IsMatch(data.CurrentView.ToString())) { yield return(new ParsedResult <BaseDecoratedNumber>( result: new UndecoratedNumber(number), dataView: data)); } continue; } data = data.CloneByDelta(m.Index + m.Length); delimiter = m.Value; yield return(new ParsedResult <BaseDecoratedNumber>( result: new DelimiterDecoratedNumber(number, number.RawNumber + delimiter, delimiter), dataView: data)); } }
private string?ConsumeContentToSpaceOrEnd(ref IDataView data) { var m = _spaceRegex.Match(data.CurrentView.ToString()); if (m.Success) { var res = data.CurrentView.Slice(0, m.Index + m.Length).ToString(); data = data.CloneByDelta(m.Index + m.Length); return(res); } return(null); }
public override IEnumerable <ParsedResult <BaseDecoratedNumber> > Consume(IDataView data) { if (data.EndOfStream) { yield break; } string left; Match m; if (!(m = leftBracketRegex.Match(data.CurrentView.ToString())).Success) { yield break; } data = data.CloneByDelta(m.Index + m.Length); left = m.Value.Trim(); foreach (var numberResult in ConsumeNumber(data)) { data = numberResult.DataView; var number = numberResult.Result; if (!(m = rightBracketRegex.Match(data.CurrentView.ToString())).Success) { continue; } data = data.CloneByDelta(m.Index + m.Length); var right = m.Value.Trim(); yield return(new ParsedResult <BaseDecoratedNumber>( result: new BracketDecoratedNumber(number, left + number.RawNumber + right, left, right), dataView: data)); } }
private NumberNode?ExtractFromDataView(IDataView data, int paragraphOrder) { var content = new StringBuilder(); var lastNode = ConsumeNumberFromDataView(ref data, paragraphOrder); if (lastNode == null) { return(null); } while (!data.EndOfStream) { // Skip Score var scoreMatch = _simpleScoreRegex.Match(data.CurrentView.ToString()); if (scoreMatch.Success) { content.Append(scoreMatch.Value); data = data.CloneByDelta(scoreMatch.Length); } var currentContent = content.ToString(); NumberNode?node = null; try { node = ConsumeNumberFromDataView(ref data, paragraphOrder); } catch (FormatException) { } if (node != null) { lastNode.Header = currentContent.Trim(); lastNode = node; content.Clear(); } else { content.Append(ConsumeContentToSpaceOrEnd(ref data)); } } lastNode.Header = content.ToString().Trim(); return(lastNode); }