public SegmentedDocument Deserialise(string input) { var segments = new List <DocumentSegment>(); string outputString = ""; int lastMatchPosition = 0; int charactersAdded = 0; var doc = new SegmentedDocument(new TextDocument()); foreach (Match match in segmentRegex.Matches(input)) { outputString += input.Substring(lastMatchPosition, match.Index - lastMatchPosition); string className = match.Groups["class"].Value.ToLower(); if (!constructorDictionary.ContainsKey(className)) { outputString += match.Value; lastMatchPosition = match.Index + match.Length; continue; } DocumentSegment segment = constructorDictionary[className](match.Index + charactersAdded, match.Groups["text"].Value); charactersAdded += segment.Text.Length - match.Length; segments.Add(segment); outputString += segment.Text; lastMatchPosition = match.Index + match.Length; } outputString += input.Substring(lastMatchPosition); doc.Load(outputString, segments); return(doc); }
public void Replace(int offset, int replacementLength, SegmentedDocument text) { int offsetRef = offset; int replacementLengthRef = replacementLength; Replace(ref offsetRef, ref replacementLengthRef, text); }
public SegmentedDocument(SegmentedDocument templateText) { textDocument = new TextDocument(""); Segments = new TextSegmentCollection <DocumentSegment>(textDocument); textDocument.Changing += onChanging; textDocument.UpdateFinished += OnUpdateEnd; Load(templateText); }
protected SegmentedDocument TransformTemplate(string prefix, Template template, string suffix) { var doc = new SegmentedDocument(new TextDocument("")); doc.Replace(0, 0, serialiser.Deserialise(prefix)); doc.Replace(doc.TextLength, 0, template.TemplateDocument); doc.Replace(doc.TextLength, 0, serialiser.Deserialise(suffix)); return(doc); }
public void InsertTemplate(int offset, Template template, out int insertionEndIndex) { var placeholder = Segments.FindSegmentsContaining(offset).Where(v => v is PlaceholderSegment).FirstOrDefault() as PlaceholderSegment; SegmentedDocument document = template.TemplateDocument; if (placeholder != null) { document = placeholder.TransformTemplate(template); } int replacmentLength = 0; Replace(ref offset, ref replacmentLength, document); insertionEndIndex = offset + document.TextLength; }
public void Replace(ref int offset, ref int replacementLength, SegmentedDocument text) { InAutomaticChange = true; var affectedSegments = new ReadOnlyCollection <DocumentSegment>(new List <DocumentSegment>()); affectedSegments = Segments.FindOverlappingSegments(offset, replacementLength); string textString = text.Text; Replace(affectedSegments, ref offset, ref replacementLength, ref textString); foreach (DocumentSegment segment in text.Segments) { DocumentSegment newsegment = segment.Clone(); newsegment.StartOffset = newsegment.StartOffset + offset; newsegment.EndOffset = newsegment.StartOffset + newsegment.Length; Segments.Add(newsegment); } InAutomaticChange = false; lastChange = null; }
protected SegmentedDocument TransformTemplate(string prefix, SegmentedDocument doc, string suffix) { doc.Replace(0, 0, serialiser.Deserialise(prefix)); doc.Replace(doc.TextLength, 0, serialiser.Deserialise(suffix)); return(doc); }
internal void Load(SegmentedDocument document) { Load(document.Text, document.Segments.Select(v => v.Clone())); }