Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

Table of Contents
maxLevel3
minLevel3
typeflat
separatorpipe

Description

It is easy to provide pages with lots of dynamic content using a variety of techniques including SQL, Reporting PluginScaffolding PluginMetadata Plugin, and other plugins. Pages can always reflect the latest information (smile)! However, in some cases, it would be nice to have a snapshot of the page and its dynamic content at various points in time. This is possible with just a little bit of additional work and the run macro.

Dependencies

Run macro - used to capture the content in an attachment

Optional dependencies

In order to provide a better user experience for viewing the archived data, the following plugins can be used

  1. Composition Plugin - deck and card macros
  2. Confluence Script Plugin - groovy macro to automatically create decks/cards from the attachments
  3. HTML - used to display the captured HTML in a nice way on a Confluence page

Steps

  1. Create your main page
  2. On the main page, add the run macro surrounding the content that needs to be archived similar to the following

    No Format
    titleExample main page
    {run:exportFile=Example - Archive^example-$current_time.html|titleExport=Save page snapshot|exportVersion=replace|attachmentComment=Example-archive-$current_time|dateFormat=yyyy.MM.dd|autoRun=true|hideRun=true}
    
    
    {sql-query:datasource=testDS}
    select * from address
    {sql-query}
    
    
    {run}
  3. Create another page with the name equal to the original page suffixed by " - archive", suggest making it a child page of the main page. A simple alternative is to just use the attachments macro on this page - not as nice, but provides access to the data as straight html.

    No Format
    titleExample - archive page
    {composition-setup}{composition-setup} 
    
    {archive-deck} 
  4. Create a user macro to display the archived data in a nice way (optional). 

    No Format
    titlearchive-deck user macro
    {groovy:output=wiki}
    // Looks through all attachments for the current page and finds those that match the pattern 
    // Create a tab for each year and under the year, a tab for each matching attachment
    // Include the attachment via the html macro
    attachmentNameRegex = /(2\d\d\d)\.(\d\d)\.(\d\d)\..*htm/  // 2 group regex - name contains a date like 2012.05.04
    def attachments = attachmentManager.getAttachments(context.getEntity())
    def cardList = []
    attachments.each { attachment ->
        name = attachment.getDisplayTitle()
        def matcher = name =~ attachmentNameRegex
        if (matcher.find()) {
            cardList << [
                attachmentName: name,
                year: matcher.group(1),
                month: matcher.group(2),
                day: matcher.group(3)
            ]
        }
    }
    cardList = cardList.sort { a, b -> 
        def result = b.year.compareTo(a.year)   // sort by year first, desc order
        if (result == 0) {
            result = a.month.compareTo(b.month) // sort by month
        }
        if (result == 0) {
            result = a.day.compareTo(b.day) // sort by day
        }
        return result
    }
    def br = '\n'
    
    out << '{deck:id=by_year}'
    out << br
    def year = ''
    cardList.each { card ->
        if (card.year != year) {  // need a new year card
            if (year != '') {  // first time through
                out << '{card}'  // end previous card
                out << br
                out << '{deck}'  // end previous deck
                out << br
            }
            year = card.year 
            out << "{card:label=${year}}"
            out << br
            out << "{deck:id=year_${card.year}}"
            out << br
        }    
        out << "{card:label=${card.month}/${card.day}}"   
        out << br
        out << "{html:script=${context.getPageTitle()}^${card.attachmentName}|tidy=true} {html}"
        out << br
        out << '{card}'
        out << br
    }
    out << '{card}'
    out << br
    out << '{deck}'
    out << br
    out << '{deck}'
    out << br
    {groovy}

Results

Image ModifiedImage Modified