public override ErrorInfo TryParseData(IDataModel model, string name, int dataIndex, ref IFormattedRun run) { var pointerSources = model.GetUnmappedSourcesToAnchor(name); var errorInfo = ArrayRun.TryParse(model, name, Format, dataIndex, pointerSources, out var arrayRun); if (errorInfo == ErrorInfo.NoError) { run = arrayRun; } else if (Format != string.Empty) { return(new ErrorInfo($"Format {Format} was not understood.")); } return(ErrorInfo.NoError); }
public static bool TryParseTableStream(IDataModel model, int start, SortedSpan <int> sources, string fieldName, string content, IReadOnlyList <ArrayRunElementSegment> sourceSegments, out TableStreamRun tableStream) { tableStream = null; if (content.Length < 4 || content[0] != '[') { return(false); } var close = content.LastIndexOf(']'); if (close == -1) { return(false); } try { var segmentContent = content.Substring(1, close - 1); var segments = ArrayRun.ParseSegments(segmentContent, model); var endStream = ParseEndStream(model, fieldName, content.Substring(close + 1), segments, sourceSegments); if (endStream == null) { return(false); } if (segments.Count == 0) { return(false); } tableStream = new TableStreamRun(model, start, sources, content, segments, endStream); } catch (ArrayRunParseException) { return(false); } if (start < 0) { return(false); // not a valid data location, so the data can't possibly be valid } if (model.GetUnmappedSourcesToAnchor(fieldName).Count > 0) { // we're pasting this format and something else is expecting it. Don't expect the content to match yet. return(tableStream.ElementCount > 0); } // if the first 90% matches, we don't need to check the last 10% var mostElementsCount = (int)Math.Ceiling(tableStream.ElementCount * .85); return(DataMatches(model, tableStream, mostElementsCount)); }
public override ErrorInfo TryParseData(IDataModel model, string name, int dataIndex, ref IFormattedRun run) { var pointerSources = model.GetUnmappedSourcesToAnchor(name); pointerSources = new SortedSpan <int>(pointerSources.Where(source => model.ReadValue(source) == 0).ToList()); var errorInfo = ArrayRun.TryParse(model, name, Format, dataIndex, pointerSources, out var arrayRun); if (errorInfo == ErrorInfo.NoError) { run = arrayRun; } else if (Format != string.Empty) { return(new ErrorInfo($"Format {Format} was not understood: " + errorInfo.ErrorMessage)); } return(ErrorInfo.NoError); }