//
// This code is part of Document Solutions for Word demos.
// Copyright (c) MESCIUS inc. All rights reserved.
//
using System;
using System.IO;
using System.Drawing;
using System.Text;
using System.Linq;
using System.Collections.Generic;
using System.Text.RegularExpressions;
using GrapeCity.Documents.Word;
using Range = GrapeCity.Documents.Word.Range;
namespace DsWordWeb.Demos
{
// NOTE: this sample is obsolete, use the RangeBase.Replace()
// extension method instead (see ReplaceTextFmt).
//
// This sample loads an existing document, finds all occurrences
// of a certain string in it, and replaces that string with another one,
// also changing the character format of the replacement string.
// This sample is similar to ReplaceText, with the addition of
// formatting change, and has the same limitation - it only finds
// occurrences of the search string that are completely within a single run.
// See ReplaceTextFmt2 for an example of using PersistentRange in the
// same scenario.
public class ReplaceTextFmtOld
{
public GcWordDocument CreateDocx()
{
// The document to replace text in:
var path = Path.Combine("Resources", "WordDocs", "JsFrameworkExcerpt.docx");
// The text to find:
const string tFind = "javascript";
// The replacement:
const string tRepl = "ArabicaScroll";
var doc = new GcWordDocument();
doc.Load(path);
var runs = doc.Body.Runs;
List<Range> runRanges = new List<Range>(runs.Count);
foreach (var run in runs)
runRanges.Add(run.GetRange());
foreach (var rr in runRanges)
{
var str = rr.Text;
var matches = Regex.Matches(str, tFind, RegexOptions.IgnoreCase);
if (matches.Count == 0)
continue;
var color = rr.ParentRun.Font.Color.RGB;
rr.Clear();
var r = rr.Runs.Last;
var pos = 0;
foreach (Match m in matches)
{
r = r.GetRange().Runs.Insert(str.Substring(pos, m.Index - pos), InsertLocation.After);
r.Font.Color.RGB = color;
r = r.GetRange().Runs.Insert(tRepl, InsertLocation.After);
r.Font.Color.RGB = Color.Red;
pos = m.Index + m.Length;
}
r = r.GetRange().Runs.Insert(str.Substring(pos), InsertLocation.After);
r.Font.Color.RGB = color;
if (!string.IsNullOrEmpty(rr.Runs.First.GetRange().Text))
throw new Exception("Unexpected");
rr.Runs.First.Delete();
}
// Not strictky necessary but a good practice:
runRanges.Clear();
// Add a note at the end of the document:
doc.Body.Sections.Last.GetRange().Paragraphs.Add(
$"DsWord replaced '{tFind}' with '{tRepl}' on {Util.TimeNow():R}.");
// Done:
return doc;
}
}
}