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.
Online forums and learning are now in one easy-to-use experience.
By continuing, you accept the updated Community Terms of Use and acknowledge the Privacy Policy. Your public name, photo, and achievements may be publicly visible and available in search engines.
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.