Hello Alexey,
I was already using same code, but it results in partial formatting.
At some places it come out as correct formatting where as at others not.
Attached are IN and OUT doc. again for your reference. You will notice that and codes are not replaced with correct formatting.
Here is my code again, I matched it with yours, it looks right to me:
public ReplaceAction Replacing(ReplacingArgs e)
{
var fieldName = e.Match.Groups["1"].Value;
// This is a Run node that contains either the beginning or the complete match.
currentNode = e.MatchNode;
// The first (and may be the only) run can contain text before the match,
// in this case it is necessary to split the run.
if (e.MatchOffset > 0)
currentNode = SplitRun((Run)currentNode, e.MatchOffset);
// This array is used to store all nodes of the match for further removing.
ArrayList runs = new ArrayList();
// Find all runs that contain parts of the match string.
int remainingLength = e.Match.Value.Length;
while ((remainingLength > 0) &&
(currentNode != null) &&
(currentNode.GetText().Length <= remainingLength))
{
runs.Add(currentNode);
remainingLength = remainingLength - currentNode.GetText().Length;
// Select the next Run node.
// Have to loop because there could be other nodes such as BookmarkStart etc.
do
{
currentNode = currentNode.NextSibling;
}
while ((currentNode != null) && (currentNode.NodeType != NodeType.Run));
}
// Split the last run that contains the match if there is any text left.
if ((currentNode != null) && (remainingLength > 0))
{
SplitRun((Run)currentNode, remainingLength);
runs.Add(currentNode);
}
//Create Document builder and insert Merge Field
_parent._builder = new DocumentBuilder((Document)e.MatchNode.Document);
_parent._builder.MoveTo((Run)runs[runs.Count - 1]);
fieldName = fieldName.ToUpper();
if (fieldName == "PAGE/")
{
_parent._builder.InsertBreak(BreakType.PageBreak);
}
else
{
_parent._builder.InsertField(string.Format("MERGEFIELD {0}", fieldName), string.Format("«{0}»", fieldName));
}
// Now remove all runs in the sequence.
foreach (Run run in runs)
run.Remove();
// Signal to the replace engine to do nothing because we have already done all what we wanted.
return ReplaceAction.Skip;
}
Please guide if I am missing something.
Thank you!