private YamlFoldStart CreateElementFoldStart(TextDocument document, YamlReader reader) { var yamlFoldStart = new YamlFoldStart { StartLine = reader.LineNumber, StartOffset = document.GetOffset(reader.LineNumber, 1), Name = reader.Key }; return(yamlFoldStart); }
/// <summary> /// Create <see cref="T:ICSharpCode.AvalonEdit.Folding.NewFolding" />s for the specified document. /// </summary> public IEnumerable <NewFolding> CreateNewFoldings(TextDocument document, YamlReader reader, out int firstErrorOffset) { Stack <YamlFoldStart> yamlFoldStarts = new Stack <YamlFoldStart>(); List <NewFolding> foldMarkers = new List <NewFolding>(); try { while (reader.ReadLine()) { if (reader.Indent == 0 && !reader.IsEmptyLine) { if (yamlFoldStarts.Count > 0) { var foldStart = yamlFoldStarts.Pop(); if (foldStart.StartLine < reader.LineNumber - 1) { CreateElementFold(document, foldMarkers, reader, foldStart); } } var elementFoldStart = CreateElementFoldStart(document, reader); yamlFoldStarts.Push(elementFoldStart); continue; } } while (yamlFoldStarts.Count > 0) { var foldStart = yamlFoldStarts.Pop(); if (foldStart.StartLine < reader.LineNumber) { CreateElementFold(document, foldMarkers, reader, foldStart); } } firstErrorOffset = -1; } catch (XmlException ex) { firstErrorOffset = ex.LineNumber <1 || ex.LineNumber> document.LineCount ? 0 : document.GetOffset(ex.LineNumber, ex.LinePosition); } foldMarkers.Sort((Comparison <NewFolding>)((a, b) => a.StartOffset.CompareTo(b.StartOffset))); return((IEnumerable <NewFolding>)foldMarkers); }
private static void CreateElementFold(TextDocument document, List <NewFolding> foldMarkers, YamlReader reader, YamlFoldStart foldStart) { if (reader.IsLastLine) { foldStart.EndOffset = reader.LineOffset + reader.LineLength; } else { foldStart.EndOffset = reader.LineOffset - 2; } foldMarkers.Add((NewFolding)foldStart); }