How to add Superscript text to the existing text

How to add Superscirpt / Subscript text with in the existing document on specific text using Aspose.words java.
Ex: I’m having text like Addition of X in the document, So i need to find the text of Addition of X in the document and on top of X, I need to add 2 as superscript.

Please help me. how to do with sample code

@csaspose You can achieve this using IReplacingCallabck. I have adopted the text highlight example for you.
Here is the code example:

Document doc = new Document(@"C:\Temp\in.docx");
FindReplaceOptions opt = new FindReplaceOptions();
opt.ReplacingCallback = new InsertSuperscriptCallabck();
doc.Range.Replace("Addition of X", "2", opt);
doc.Save(@"C:\Temp\out.docx");
private class InsertSuperscriptCallabck : IReplacingCallback
{
    public ReplaceAction Replacing(ReplacingArgs e)
    {
        // This is a Run node that contains either the beginning or the complete match.
        Node 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.
        List<Run> runs = new List<Run>();

        // 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((Run)currentNode);
            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((Run)currentNode);
        }

        // Insert a run with superscript text after the last Run in the match.
        Run lastRun = runs[runs.Count - 1];
        Run superscript = (Run)lastRun.Clone(true);
        superscript.Font.Superscript = true;
        superscript.Text = e.Replacement;
        lastRun.ParentNode.InsertAfter(superscript, lastRun);

        // Signal to the replace engine to do nothing because we have already done all what we wanted.
        return ReplaceAction.Skip;
    }

    /// <summary>
    /// Splits text of the specified run into two runs.
    /// Inserts the new run just after the specified run.
    /// </summary>
    private static Run SplitRun(Run run, int position)
    {
        Run afterRun = (Run)run.Clone(true);
        afterRun.Text = run.Text.Substring(position);

        run.Text = run.Text.Substring(0, position);
        run.ParentNode.InsertAfter(afterRun, run);

        return afterRun;
    }
}

Please Share code in Java

@csaspose Here is Java version of the code:

Document doc = new Document("C:\\Temp\\in.docx");
FindReplaceOptions opt = new FindReplaceOptions();
opt.setReplacingCallback(new InsertSuperscriptCallabck());
doc.getRange().replace("Addition of X", "2", opt);
doc.save("C:\\Temp\\out.docx");
private static class InsertSuperscriptCallabck implements IReplacingCallback
{
    public int replacing(ReplacingArgs e)
    {
        // This is a Run node that contains either the beginning or the complete match.
        Node currentNode = e.getMatchNode();

        // 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.getMatchOffset() > 0)
            currentNode = SplitRun((Run)currentNode, e.getMatchOffset());

        // This array is used to store all nodes of the match.
        java.util.ArrayList<Run> runs = new java.util.ArrayList<Run>();

        // Find all runs that contain parts of the match string.
        int remainingLength = e.getMatch().group().length();
        while (
                remainingLength > 0 &&
                        currentNode != null &&
                        currentNode.getText().length() <= remainingLength)
        {
            runs.add((Run)currentNode);
            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.getNextSibling();
            } while (currentNode != null && currentNode.getNodeType() != 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((Run)currentNode);
        }

        // Insert a run with superscript text after the last Run in the match.
        Run lastRun = runs.get(runs.size() - 1);
        Run superscript = (Run)lastRun.deepClone(true);
        superscript.getFont().setSuperscript(true);
        superscript.setText(e.getReplacement());
        lastRun.getParentNode().insertAfter(superscript, lastRun);

        // Signal to the replace engine to do nothing because we have already done all what we wanted.
        return ReplaceAction.SKIP;
    }

    /// <summary>
    /// Splits text of the specified run into two runs.
    /// Inserts the new run just after the specified run.
    /// </summary>
    private static Run SplitRun(Run run, int position)
    {
        Run afterRun = (Run)run.deepClone(true);
        afterRun.setText(run.getText().substring(position));

        run.setText(run.getText().substring(0, position));
        run.getParentNode().insertAfter(afterRun, run);

        return afterRun;
    }
}