ReplaceText.cs
//
// This code is part of GrapeCity Documents for Word samples.
// Copyright (c) GrapeCity, Inc. All rights reserved.
//
using System;
using System.IO;
using System.Drawing;
using System.Text;
using System.Text.RegularExpressions;
using GrapeCity.Documents.Word;

namespace GcWordWeb.Samples
{
    // This sample loads an existing document, finds all occurrences
    // of a certain string in it, and replaces that string with another one.
    // Note that this code only finds occurrences of the search string
    // that are completely within a single run. To find strings spanning
    // two or more runs (e.g. if different parts of the string have
    // different formatting) will require a more complex searching logic.
    // For a similar sample that also changes the formatting of the
    // replacement, see ReplaceTextFmt.
    public class ReplaceText
    {
        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);

            // Loop over all texts in the document body:
            foreach (var text in doc.Body.Texts)
            {
                if (text is Break)
                    continue;

                var str = text.Value;
                var matches = Regex.Matches(str, tFind, RegexOptions.IgnoreCase);
                if (matches.Count == 0)
                    continue;

                var sb = new StringBuilder();
                var pos = 0;
                foreach (Match m in matches)
                {
                    sb.Append(str.Substring(pos, m.Index - pos));
                    sb.Append(tRepl);
                    pos = m.Index + m.Length;
                }
                sb.Append(str.Substring(pos));
                text.Value = sb.ToString();
            }
            // Add a note at the end of the document:
            doc.Body.Sections.Last.GetRange().Paragraphs.Add(
                $"GcWord replaced '{tFind}' with '{tRepl}' on {DateTime.Now}.");

            // Done:
            return doc;
        }
    }
}