''
'' This code is part of Document Solutions for Word demos.
'' Copyright (c) MESCIUS inc. All rights reserved.
''
Imports System.Drawing
Imports System.Text
Imports System.Linq
Imports System.Collections.Generic
Imports System.Text.RegularExpressions
Imports GrapeCity.Documents.Word
'' 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 almost identical to ReplaceTextFmt
'' but uses PersistentRange instead of Range.
'' Its primary purpose Is to illustrate the differences between
'' Range And PersistentRange.
Public Class ReplaceTextFmt2
Function CreateDocx() As GcWordDocument
'' The document to replace text in:
Dim path = IO.Path.Combine("Resources", "WordDocs", "JsFrameworkExcerpt.docx")
'' The text to find
Const tFind = "javascript"
'' The replacement
Const tRepl = "ArabicaScroll"
Dim doc = New GcWordDocument()
doc.Load(path)
Dim runs = doc.Body.Runs
Dim runRanges = New List(Of PersistentRange)(runs.Count)
For Each run In runs
runRanges.Add(run.GetPersistentRange())
Next
For Each rr In runRanges
Dim str = rr.Text
Dim matches = Regex.Matches(str, tFind, RegexOptions.IgnoreCase)
If matches.Count = 0 Then
Continue For
End If
Dim color = rr.ParentRun.Font.Color.RGB
rr.Clear()
Dim pos = 0
For Each m In matches
rr.Runs.Add(str.Substring(pos, m.Index - pos)).Font.Color.RGB = color
rr.Runs.Add(tRepl).Font.Color.RGB = Color.Red
pos = m.Index + m.Length
Next
rr.Runs.Add(str.Substring(pos)).Font.Color.RGB = color
If Not String.IsNullOrEmpty(rr.Runs.First.GetRange().Text) Then
Throw New Exception("Unexpected")
End If
rr.Runs.First.Delete()
'' PersistentRange Is kept up to date when the document changes,
'' so it should be disposed when no longer needed to improve
'' performance And reduce memory consumption:
rr.Dispose()
Next
'' 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
End Function
End Class