In a Word Add-In using the JS API, how to update a text by adding/removing certain parts?
We've built an Office Add-in for Word, and would like to build the following:
- User selects one or more paragraphs.
- They click a button in our add-in.
- This will send the text to our API which returns an updated version of these paragraphs.
- It should display to the user which words have been added/removed, preferably using Tracked Changes.
Just an example:
Original text: BankA a [Specify State] banking institution, with its principal place of business located at [Address] ("Banker").
New text:
LenderC a [Specify State] lending institution, lending laws apply, with its principal place of business located at [Address] ("Lender")
E.g. "BankA" should be deleted, "LenderC" added, "lending laws apply" added, and so on.
When I just delete all paragraphs & replace it with the new text, it shows all the old text as deleted and the new text as added. That's not what we want.
So, we need to be smarter and only update the differences. I've found this library which gives me all additions and deletions: https://github.com/kpdecker/jsdiff
I plan to loop over all changes, and act accordingly. I've tried it with a basic example, but run into some issues:
- I keep track of the current character index to perform the required action (delete/add). The JS API doesn't allow character based indexes by default, so I use this workaround: https://stackoverflow.com/posts/71824284/revisions
However, that is error prone, after ~2 additions it was already one character off. - I also looked at the "search" method, but that doesn't allow me to set a start index. That is needed in case a deleted word appears more than once.
Essentially, we're looking for what the "Document Compare" function is doing. This is currently in preview so unsure when we can use this in production. Is that our best bet? It requires an external document, so I'd have to create the second document first to be able to compare it to the current document.
Perhaps I'm on the wrong track and doing this too complicated. Any thoughts or tips?