Can you nest user macros in Confluence and edit $body in the nested implementation?

I'm building up documentation that shows examples of an SDK in multiple languages. Each language gets a tab. So we end up with a template that looks like this:

<tabs>

   <tab>

     <language>

     <code>

   </tab>

</tabs>

 

...with a repeat on the "tab" section obviously, for each language we support. The issue is that I need to have editable content (that's extensive - a single-line textbox is not enough) in each <code> area. So multiple rich-content areas. I'd love to have my macro spit out (for example) a panel for each language or something.

 

Here's my template as it exists right now. This technically works, but you'd have to edit your code in a single-line text field - obviously not usable.

 

## Macro title: Code Tabs
## @param csharp:title=C#|type=string|desc=C#
## @param java:title=Java|type=string|desc=Java
<ac:structured-macro ac:name="sp-tabs">
<ac:rich-text-body>
<ac:structured-macro ac:name="sp-tab">
<ac:parameter ac:name="title">C#</ac:parameter>
<ac:rich-text-body>
<ac:structured-macro ac:name="code">
<ac:parameter ac:name="language">c#</ac:parameter>
<ac:plain-text-body><![CDATA[ $!paramcsharp ]]></ac:pain-text-body>
</ac:structured-macro>
</ac:rich-text-body>
</ac:structured-macro>
<ac:structured-macro ac:name="sp-tab">
<ac:parameter ac:name="title">Java</ac:parameter>
<ac:rich-text-body>
<ac:structured-macro ac:name="code">
<ac:parameter ac:name="language">java</ac:parameter>
<ac:plain-text-body><![CDATA[ $!paramjava ]]></ac:pain-text-body>
</ac:structured-macro>
</ac:rich-text-body>
</ac:structured-macro>

</ac:rich-text-body>
</ac:structured-macro>

Is there a way I can just let that <code> macro render as a sub-editor in my macro somehow?

1 answer

0 votes

I don't think so. $body (in place of, e.g., $!paramcsharp) is what you want to give you an editing block (in page edit view), but you need three blocks. I am not aware of any editing block capability inside the macro browser/IF.

BUT, if you create your own markdown, you could have an editing block on the page, and have all three code blocks in a single editing block, THEN parse them into each of your parameters. That is how I would do it. For example

!CSHARP

<some code>

!JAVA

<some code>

!VTL

<some code>

Of course, you would need to create a man page to explain how to properly enter the source in the body.

Not a bad plan. I'd need to have a way to force the $body to be plain text though, or it'll end up giving me pre-parsed html content, will it not?

Suggest an answer

Log in or Sign up to answer
Community showcase
Published Nov 29, 2018 in New to Confluence

How to use Confluence Cloud for stakeholder management

Most of us don’t need much convincing that stakeholder management is important. It just makes sense that keeping everyone in-the-know on projects and assigning clearly defined roles is key to having ...

1,133 views 2 6
Read article

Atlassian User Groups

Connect with like-minded Atlassian users at free events near you!

Find a group

Connect with like-minded Atlassian users at free events near you!

Find my local user group

Unfortunately there are no AUG chapters near you at the moment.

Start an AUG

You're one step closer to meeting fellow Atlassian users at your local meet up. Learn more about AUGs

Groups near you