It's not the same without you

Join the community to find out what other Atlassian users are discussing, debating and creating.

Atlassian Community Hero Image Collage

can you include all child pages automatically?

This question is in reference to Atlassian Documentation: Include Page Macro

Is it possible to use this or another macro to automatically include the content of all child pages in the parent automatically?

5 answers

Here is a user macro that I wrote for this a while back.

 

Macro Name:
include_children

Macro Title:
Include Children 

Macro Body Processing:
No macro body

Template:

## Macro Name: include_children
## Visibility: 
## Macro Title: Include Children
## Description: This will include the content from from the child pages onto the parent page that this macro is placed on.
## Categories: Confluence content
## Icon URL: 
## Documentation URL: https://bitbucket.org/fredclown/confluence-user-macros
## Macro Body Processing: No macro body

##############################
##       Template:          ##
##############################
## Developed By: Davin Studer
## Date Created: 12/4/2014
## Updated by: Milo Grika
## Added: show/hide title, link/unlink title.
## Updated by: Gregor Mirai
## Date updated: 26/1/2016
## Added: page separator, PDF split page marker options.
## Updated by: Davin Studer
## Date updated: 4/13/2018
## Added: Include Descendants checkbox
## Updated by: Davin Studer
## Date updated: 12/3/2018
## Added: Added an option to specify the parent page.

## @param ShowTitle:title=Show Title|type=boolean|desc=Deselect to remove the title of the child page.|default=true
## @param LinkTitle:title=Link Title|type=boolean|desc=Select to turn the titles of the child pages into links to those pages (Show Title must be selected).|default=false
## @param IncludeDescendants:title=Include Descendants|type=boolean|desc=Select to include descendants.|default=false
## @param PageSeparator:title=Page Separator|type=boolean|desc=Separate pages with horizontal ruler.|default=false
## @param SplitPages:title=Split Pages|type=boolean|desc=Split pages marker for PDF export will be inserted.|default=false
## @param Collapsible:title=Collapsible|type=boolean|desc=Should the included pages be collapsible?|default=false
## @param FilterLabel:title=Filter on Page Label|type=string|desc=Include only subpages with the specified label.
## @param Page:title=Page title|type=confluence-content|required=false|desc=If not specified, the current page is used.
## @param Order:title=Order|type=enum|enumValues=Nav Order,Reverse Nav Order,Alphabetical,Reverse Alphabetical,Create Date,Reverse Create Date|default=nav order|desc=In what order should the child pages be displayed? Nav Order refers to the order of the child pages in the page tree. Reverse Nav Order simply reverses that.

#set( $containerManagerClass=$content.class.forName('com.atlassian.spring.container.ContainerManager') )
#set( $getInstanceMethod=$containerManagerClass.getDeclaredMethod('getInstance',null) )
#set( $containerManager=$getInstanceMethod.invoke(null,null) )
#set( $containerContext=$containerManager.containerContext )
#set( $pageManager=$containerContext.getComponent('pageManager') )

#if( $paramPage && $paramPage != "" )
    ##########################
    ## Find the page        ##
    ##########################
    #set( $parts = $paramPage.split(":") )
    #set( $i = 0 )
    #set ( $len = 0 )
    #set( $key = "" )
    #set( $name = "" )

    ##Having trouble finding out the length/size of $parts ... brute force it
    #foreach ( $part in $parts )
        #set ( $len = $len + 1 )
    #end
    
    #if ( $len == 1 )
        #set ( $key = $content.spaceKey )
        #set ( $name = $paramPage )
    #else
        #foreach ( $part in $parts )
            #if ( $i == 0 )
              #set ( $key = $part )
              #set ( $i = $i + 1 )
           #else
              #set ( $name = $part )
           #end
        #end
    #end

    #set ( $tempcontent = "" )
    #if ( $pageManager )
        #set ( $tempcontent = $pageManager.getPage($key, $name) )
    #end
    #if ( $tempcontent && $tempcontent != "" )
        #set ( $content = $tempcontent )
    #else
        The page "$paramPage" was not found in this space.
        #set ( $content = "" )
    #end
#end

#set( $data = "" )
#childPages ( $content.id )

#macro ( childPages $pageid )
    ## Find the array of (sorted) child pages.
    #if( $paramOrder == "Nav Order" || $paramOrder == "Reverse Nav Order" )
        #set( $children =  $pageManager.getPage($pageid).getSortedChildren() )
    #elseif( $paramOrder == "Alphabetical" || $paramOrder == "Reverse Alphabetical" )
        #set( $array =  $pageManager.getPage($pageid).getChildren() )
        ###############################################################
        ## Could not find a method to get them in Alphabetical order ##
        ## Must sort them myself ... Bubble sort                     ##
        ###############################################################
        #set( $size = $array.size() )
        #foreach( $junk in $array )
            #set( $count = -1 )
            #foreach( $line in $array )
                #set( $count = $count + 1 )
                #if( $velocityCount < $size )
                    #if( $line.getTitle().compareToIgnoreCase($array.get($velocityCount).getTitle()) > 0 )
                        #set( $tmp = $array.get($velocityCount) )
                        #set( $junk = $array.set($velocityCount, $line) )
                        #set( $junk = $array.set($count, $tmp) )
                    #end
                #end
            #end
        #end
        #set( $children = $array )
    #elseif( $paramOrder == "Create Date" || $paramOrder == "Reverse Create Date" )
        #set( $children =  $pageManager.getPage($pageid).getChildren() )
    #end
    
    ## Prepare children data. 
    #foreach( $child in $children )
        ## Create the map of labels for the page.
        #set( $labelsMap = {} )
        #foreach( $label in $child.getLabels() )
            #set( $dummy = $labelsMap.put($label.toString(), 1) )
        #end
    
        ## Include all pages (when no filter label is specified) or pages with a specific label.
        #if( !$paramFilterLabel || $paramFilterLabel && $labelsMap.containsKey($paramFilterLabel) )
            #set( $include = "" )
            #if ( $paramCollapsible == true )
                #set( $include = $include + '<ac:structured-macro ac:name="expand">' )
                #set( $include = $include + '<ac:parameter ac:name="title">' + $child.getTitle() + '</ac:parameter>' )
                #set( $include = $include + '<ac:rich-text-body>' )
                #set( $include = $include + '<p>' )
            #end
            #set( $include = $include + '<div class="included-child-page">' )
    
            ## Show title and links.
            #if( $paramShowTitle == true )
                #if( $paramLinkTitle == true )
                    #set( $include = $include + '<h1 class="included-child-page-title"><a href="' + $child.getUrlPath() + '">' + $child.getTitle() + '</a></h1>' )
                #else
                    #set( $include = $include + '<h1 class="included-child-page-title">' + $child.getTitle() + '</h1>' )
                #end
            #end
    
            ## Include sub page.
            #set( $include = $include + '<div class="included-child-page-body">' )
                #set( $include = $include + '<ac:structured-macro ac:name="include">' )
                    #set( $include = $include + '<ac:parameter ac:name="">' )
                        #set( $include = $include + '<ac:link>' )
                            #set( $include = $include + '<ri:page ri:content-title="' + $child.getTitle() + '" ri:space-key="' + $content.spaceKey + '"/>' )
                        #set( $include = $include + '</ac:link>' )
                    #set( $include = $include + '</ac:parameter>' )
                #set( $include = $include + '</ac:structured-macro>' )
            #set( $include = $include + '</div>' )
            #set( $include = $include + '</div>' )

            #if ( $paramCollapsible == true )
                #set( $include = $include + '</p>' )
                #set( $include = $include + '</ac:rich-text-body>' )
                #set( $include = $include + '</ac:structured-macro>' )
            #end
    
            ## Define sorting order.
            #set( $inOrder = false )
            #if( $paramOrder == "Nav Order" || $paramOrder == "Alphabetical" || $paramOrder == "Create Date" )
                #set( $inOrder = true )
            #end
    
            ## Include page separator or include page split marker used for PDF exports.
            #if( $paramPageSeparator == true )
                #set( $include = $include + '<hr/><br/>' )
            #end
            #if( $paramSplitPages == true )
                #set( $include = $include + '<div style="page-break-before:always;"></div>' )
            #end

            ## Add page content in order or in reverse order.
            #if( $inOrder == true )
                #set( $data = $data + $include )
            #else
                #set( $data = $include + $data)
            #end
        #end
        
        #if($paramIncludeDescendants == true)
            #childPages( $child.id )
        #end
    #end
#end

$data
 
<style type="text/css">
    .included-child-page {
        margin-bottom: 30px;
        overflow: hidden;
    }
</style>

 

Thanks for sharing, Davin.

I'm not seeing any child page content (I'm starting by testing all in the same space, ultimately I need to Include from a separate space).

  • I wrapped the content of each desired child pages in a Confluence Excerpt macro
  • On the target page, I added a standard Confluence Include macro, pointing to the parent page.
  • Directly under the Include macro, I added your <include Children macro.

The first macro renders the content of the parent page, but nothing appears below.

Can you give some pointers?

Appreciated,

DJ

Davin_Studer Community Leader Jan 09, 2019

I updated the macro last month to add an option to specify the parent page. I updated the code above just now. Probably the reason you are not seeing anything is because it is currently pulling the children of the current page. If your page has no children you won't see anything. Anyway, with the new code above you can specify the parent page (it does not have to be the page the macro is on).

Like Marcus_Netz likes this

Great Macro, thanks. Any suggestions for making this work with Scroll versioning? With multiple versions of my site, the code pulls in multiple copies of the same exact content (for each version).... Trying to find a way around this....

Jeff_Tillett Community Leader Nov 25, 2019

Excellent macro! One of my teammates pointed out that inline comments don't show up when viewing the included pages. Do you think there is a way to add that in?

Davin_Studer Community Leader Nov 27, 2019

Thanks. Glad it helps. Basically, the user macro just dynamically adds in the built-in page include macro for each of the sub pages. That macro does not pull in the inline comments. So, unfortunately it not possible.

@Davin_Studer 
I need do some changes on it.

I know I can test it adding it to user macros list.

But is there any script console or any IDE which I can test it?

Davin_Studer Community Leader Feb 03, 2020

Not sure what exactly you mean by that. There is an app in the market place called Enhanced User Macro Editor that enhances the macro editor to give you things such as syntax highlighting, line numbers, asynchronous save, and user macro history. To be up front I wrote the app. It doesn't give you anything like a preview functionality or anything like that ... yet. : )

If you are wanting to try the user macro out without others being able to see it you can select who can see the user macro in the macro browser when you create it. Or better yet if you have a non-production Confluence instance you could create it there and test it out before putting it into your production system.

Like Jamil_Rahimov likes this

There is a commercial add-on (projectdoc - biased alert! I'm one of the authors  :smile:) that allows to transclude fragments of a document query result set. In the documentation there is an example on how to transclude child documents. The macro takes care of heading level adjustments and allows to filter on the transcluded sections.

The downside is that you need to define sections in the child documents (or any document you want to transclude), since only content of sections is transcluded. This is very similar to the Excerpt Macro provided by Atlassian.

Hi Nate,

You can use the Children Display macro.  It is located in the macro browser.

 

Regards,

Kay

I believe they want the content of the pages. Not just the links to the pages.

1. No, you can not.

2. There might be some free or non-free add-ons or macros, but in a corporate Jira it is an impossible mission to achieve, that sys admins would install them.

And please let me know, if a new release would bring the feature.

Davin_Studer Community Leader Sep 05, 2017

The above user macro works well.

0 votes

@Davin_StuderHi! thank you for the macro.

I want to ask, is it possible to modify it to add an ability to specify the parent page? For example, if i want to place the macro to one page but render children from another parent page.

Davin_Studer Community Leader Mar 16, 2020

That parameter is already in the user macro. It is the "Page title" parameter.

Like Alexander_Poryvkin likes this

Suggest an answer

Log in or Sign up to answer
TAGS
Community showcase
Posted in Confluence

How is your team having fun and bonding, remotely, utilizing Confluence?

Thanks everyone for answering last week’s question. The winner of the random drawing from those who commented is: @LarryBrock I’ll contact you separately with your prize details. This wee...

283 views 9 7
Join discussion

Community Events

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

Find an event

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

Unfortunately there are no Community Events near you at the moment.

Host an event

You're one step closer to meeting fellow Atlassian users at your local event. Learn more about Community Events

Events near you