Hello,
I need to delete all references to a macro (in this case: tracking-info) on all pages.
Is it possible with scriptrunner to run this job that would be based on a cql and delete all occurences of the macro ?
No need to keep the content inside the body of macro. Of course, it would be appreciate ;-)
Thanks for your help.
Michael
Yup! This is definitely possible with ScriptRunner.
UPDATE: A better choice might be to use the Update Macro built-in script.
You could setup a CQL Escalation Service job (or just use the "Run Now" to run it as a one-off). A query like
macro = tracking-info and type = page
should find all pages with the tracking-info macro in them.
As to doing the update, I've got an example up at of bulk-updating a table, but this should be just as possible to remove macro content.
I'm not 100% sure what the tracking-macro's storage format looks like, but many macros are wrapped in an ac:structured-macro tag with an ac:name attribute. You can find those elements in the Confluence storage format with a little massaging for the name-spaced format.Something like this in the inline script blank of a CQL Esclatation Service job should remove the macro and its contents entirely.
import com.atlassian.confluence.pages.PageManager
import com.atlassian.sal.api.component.ComponentLocator
import org.jsoup.Jsoup
def pageManager = ComponentLocator.getComponent(PageManager)
hits.each { page ->
def body = page.bodyContent.body
def parsedBody = Jsoup.parse(body)
def macroBody = parsedBody.select('ac|structured-macro').attr('ac:name', 'tracking-info')
if (!macroBody.empty) {
pageManager.saveNewVersion(page) { pageObject ->
macroBody.remove()
pageObject.setBodyAsString(parsedBody.toString())
}
}
}
Saving the macro's body should be possible, but is left as an exercise to the reader. :)
Also, we've got some work in the backlog to bulk update macros with less code: https://productsupport.adaptavist.com/browse/SRCONF-1238
Thanks Jonny for your script.
I tested it as is but it doesnt work. I have a script error when pasting it in the script inline windows. I understand the idea. So I will try to make it work.
Thanks again.,
Michael
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
Best of luck, Michael. One pitfall might be that this won't work via the script console -- I'm assuming you're putting it into the code blank for a CQL Escalation Service Job.
Another possible pitfall is that the storage format for the tracking-info macro looks different than my script assumes. You can read up more on that format at https://confluence.atlassian.com/doc/confluence-storage-format-790796544.html
If you post some sample storage format, I may be able to give you some pointers on parsing it via JSOUP.
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
As a small update, the Update Macro built-in script may be a better choice for applications like this.
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
Hi Jonny,
thanks for update.
we use a little trick to remove macro but not macrobody.
so we create a new macro "remove-macro" and in macro code section, just add "body".
Now when using macro update, we just select the macro to target and dont select parameters and the code transform as follow:
import com.atlassian.confluence.xhtml.api.MacroDefinitionBuilder
import com.atlassian.confluence.xhtml.api.MacroDefinition
macroTransform = { MacroDefinition macro ->
MacroDefinitionBuilder builder = MacroDefinition.builder("remove-macro");
builder.withMacroBody(macro.getBody()).build()
}
Now our macro is replaced by a new one with the body left inside as is.
This works for us when we no more want to renew an add-on. Of course, we would prefer to remove completely the macro and left only thew body...
and this works only for macro that have rich text body.
Michael
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.