public void ReplaceRanges(IReadOnlyList<MatchWithReplacement> matches, DocumentModel model, Format format)
{
var modifiedRanges = new List<IRange>(matches.Select<Match, IRange>(x => model.OriginalToModifiedRange(x.Range)));
var currentExtraction = Extract(format);
var lookup = new Lookup(model.Content);
var searchResult = lookup.Search(currentExtraction, modifiedRanges);
var lengthDiff = 0;
if (searchResult.Count == 0)
{
throw new MatchesNotFoundException("Lookup returned an empty list. Maybe source document was change by user?", matches, null);
}
for (var i = searchResult.Count - 1; i >= 0; i--)
{
var match = searchResult[i];
var replacement = matches[i].Replacement;
IRange rawRange= ToRawRange(format, currentExtraction, match,false);
var rawOriginalTextLength = (!EncodeContent && format != Format.Text) ? DecodedLength(currentExtraction.Substring(match.Start, match.Length)) : match.Length;
var rawReplacement = (!EncodeContent && format != Format.Text) ? XmlEncode(replacement) : replacement;
if (rawRange.Length == 0)
{
throw new MatchesNotFoundException("", new Match[]{matches[i]}, null);
}
lengthDiff += rawReplacement.Length - rawOriginalTextLength;
ReplaceRawRange(rawRange, rawReplacement, format);
model.Update(matches[i].Range, ((format != Format.Text) ? XmlEncode(replacement) : replacement));
}
var rangeWithTag = new Range(searchResult[0].Start, searchResult[searchResult.Count - 1].End);
IRange range = ToRawRange(format, currentExtraction, rangeWithTag, false);
SelectRawRange(new Range(range.Start, range.End + lengthDiff), format);
}