Table of Contents | ||||||||
---|---|---|---|---|---|---|---|---|
|
Description
It is easy to provide pages with lots of dynamic content using a variety of techniques including SQL, Reporting Plugin, Scaffolding Plugin, Metadata Plugin, and other plugins. Pages can always reflect the latest information ! 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
- Composition Plugin - deck and card macros
- Confluence Script Plugin - groovy macro to automatically create decks/cards from the attachments
- HTML - used to display the captured HTML in a nice way on a Confluence page
Steps
- Create your main page
On the main page, add the run macro surrounding the content that needs to be archived similar to the following
No Format title Example 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}
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 title Example - archive page {composition-setup}{composition-setup} {archive-deck}
Create a user macro to display the archived data in a nice way (optional).
No Format title archive-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