How to send a page including an excerpt macro using Python Rest API?

Stephen Ellwood February 9, 2022

I want to add multiple excerpts to a page that I am generating in Python and writing via the REST API.  I am beginning to feel that this is another feature that has been removed from Confluence when the V2 editor was introduced.

I am writhing the following:

h2. ADC_OFFSET_I_REG

h3. Register Overview

{excerpt:hidden=false|name=ADC_OFFSET_I_REG|atlassian-macro-output-type=BLOCK}
|Title                              |address|description                                                 |reset|
|ADC_OFFSET_I_REG|0x116| |0x00|
h3. Bitfield Descriptions

*Description of settings in register ADC_OFFSET_I_REG*
||*Setting*                             ||*Bits*  ||*Mode*         ||*Description*                                                       ||*Reset*     ||
|ADC_OFFSET_I|7-0|RW|Programmable ADC offset|0x00|
{excerpt}

The excerpt macro is being stripped from the page (or at least the V2 editor is not displaying it.

I hope that this can be done since the alternative is to create 300+ pages containing individual tables? Any help would be appreciated.

2 answers

1 accepted

1 vote
Answer accepted
Stephen Ellwood February 10, 2022

Through trial an error I managed to find the solution to my problem so I thought i would share it for the rest of the community.

To read the page in structured format I used the following API call:

temp = wws.get_page_by_id(2106916966, expand="body.storage")
print(temp['body']['storage']['value'])

To turn the above page into the correct format I used the following content (excerpt code highlighted in bold:

<ac:structured-macro ac:name="excerpt" ac:schema-version="1" data-layout="default"><ac:parameter ac:name="name">ADC_OFFSET_I_REG</ac:parameter><ac:rich-text-body>
<h2>ADC_OFFSET_I_REG</h2>
<h3>Register Overview</h3>
<table data-layout="default">
<colgroup>
<col style="width: 180.0px;" />
<col style="width: 100.0px;" />
<col style="width: 300.0px;" />
<col style="width: 120.0px;" />
</colgroup>
<tbody><tr><th><p>Title</p></th>
<th><p>address</p></th>
<th><p>description</p></th>
<th><p>reset</p></th></tr>
<tr><td><p>ADC_OFFSET_I_REG</p></td>
<td><p>0x116</p></td>
<td><p>Offset value for I register</p></td>
<td><p>0x00</p></td></tr></tbody>
</table>
<p><strong>Description of settings in register ADC_OFFSET_I_REG</strong></p>
<table data-layout="default">
<colgroup>
<col style="width: 147.0px;" />
<col style="width: 48.0px;" />
<col style="width: 108.0px;" />
<col style="width: 363.0px;" />
<col style="width: 60.0px;" />
</colgroup>
<tbody>
<tr><th><p><strong>Setting</strong></p></th>
<th><p><strong>Bits</strong></p></th>
<th><p><strong>Mode</strong></p></th>
<th><p><strong>Description</strong></p></th>
<th><p><strong>Reset</strong></p></th></tr><tr><td><p>ADC_OFFSET_I</p></td>
<td><p>7-0</p></td>
<td><p>RW</p></td>
<td><p>Programmable ADC offset</p></td>
<td><p>0x00</p></td>
</tr>
</tbody></table>
</ac:rich-text-body></ac:structured-macro><p />
0 votes
Pramodh M
Community Leader
Community Leader
Community Leaders are connectors, ambassadors, and mentors. On the online community, they serve as thought leaders, product experts, and moderators.
February 10, 2022

Hi @Stephen Ellwood 

Please use the below answer 

https://community.atlassian.com/t5/Confluence-questions/Jira-Chart-macro-not-working-if-inserted-via-API/qaq-p/1935976

Use the Python wrapper below for reference 

https://atlassian-python-api.readthedocs.io/confluence.html

Let me know if you have any queries

Thanks,
Pramodh

Stephen Ellwood February 10, 2022

So is it correct that you can only add the macro in storage format, not in Wiki format. I will have to recode everything to output storage format and try it again. How do I get the body of the page in storage format so I can see how to encode it?

Pramodh M
Community Leader
Community Leader
Community Leaders are connectors, ambassadors, and mentors. On the online community, they serve as thought leaders, product experts, and moderators.
February 10, 2022

Yes Correct @Stephen Ellwood 

Stephen Ellwood February 10, 2022

Got it.  Unfortunately I do not have enough information to get the page output in storage <xml?> format.  What I get looks more like <html>:

<h2 id="ExcerptTestPage-ADC_OFFSET_I_REG">ADC_OFFSET_I_REG</h2>
<h3 id="ExcerptTestPage-RegisterOverview">Register Overview</h3>
<span class="conf-macro output-inline" data-hasbody="true" data-macro-name="excerpt" data-macro-id="9075f925-e326-477a-b974-a16e7263568f" data-layout="default" data-local-id="31287b1e-4b75-473a-800f-59b1a4069f75">
blah blah<p></p>
<p>blah di bla</p>
<div class="table-wrap">
<table data-layout="default" data-local-id="098aa3c8-5254-4bcb-bfc7-29d25d093801" class="confluenceTable">
<colgroup>
<col style="width: 170.0px;"/>
<col style="width: 170.0px;"/>
<col style="width: 170.0px;"/>
<col style="width: 170.0px;"/>
</colgroup>
<tbody>
<tr>
<td class="confluenceTd"><p>Title </p></td>
<td class="confluenceTd"><p>address</p></td>
<td class="confluenceTd"><p>description </p></td>
<td class="confluenceTd">
<p>reset</p></td>
</tr>
<tr>
<td class="confluenceTd"><p>ADC_OFFSET_I_REG</p></td>
<td class="confluenceTd"><p>0x116</p></td>
<td class="confluenceTd"><p> </p></td>
<td class="confluenceTd"><p>0x00</p></td>
</tr>
</tbody>
</table>
</div>
<h3 id="ExcerptTestPage-BitfieldDescriptions">Bitfield Descriptions</h3>
<p><strong>Description of settings in register ADC_OFFSET_I_REG</strong>
</p>
<div class="table-wrap">
<table data-layout="default" data-local-id="eb74d975-024a-437d-9625-db702bb35bd1" class="confluenceTable">
<colgroup>
<col style="width: 136.0px;"/>
<col style="width: 136.0px;"/>
<col style="width: 136.0px;"/>
<col style="width: 136.0px;"/>
<col style="width: 136.0px;"/>
</colgroup>
<tbody>
<tr>
<th class="confluenceTh"><p><strong>Setting</strong> </p>
</th>
<th class="confluenceTh"><p><strong>Bits</strong> </p></th>
<th class="confluenceTh"><p><strong>Mode</strong> </p></th>
<th class="confluenceTh"><p><strong>Description</strong> </p></th>
<th class="confluenceTh"><p><strong>Reset</strong> </p>
</th>
</tr>
<tr>
<td class="confluenceTd"><p>ADC_OFFSET_I</p></td>
<td class="confluenceTd"><p>7-0</p></td>
<td class="confluenceTd"><p>RW</p></td>
<td class="confluenceTd"><p>Programmable ADC offset</p></td>
<td class="confluenceTd"><p>0x00</p></td>
</tr>
</tbody>
</table>
</div>
<div class="table-wrap">
<table data-layout="default" data-local-id="37ff912a-4aea-4fd2-a047-4c16dbc7ec57" class="confluenceTable">
<colgroup>
<col style="width: 136.0px;"/>
<col style="width: 136.0px;"/>
<col style="width: 136.0px;"/>
<col style="width: 136.0px;"/>
<col style="width: 136.0px;"/>
</colgroup>
<tbody>
<tr>
<th class="confluenceTh"><p><strong>Setting</strong> </p></th>
<th class="confluenceTh"><p><strong>Bits</strong> </p></th>
<th class="confluenceTh"><p><strong>Mode</strong> </p></th>
<th class="confluenceTh"><p><strong>Description</strong> </p>
</th><th class="confluenceTh"><p><strong>Reset</strong> </p>
</th>
</tr>
<tr>
<td class="confluenceTd"><p>ADC_OFFSET_I</p></td>
<td class="confluenceTd"><p>7-0</p></td>
<td class="confluenceTd"><p>RW</p></td>
<td class="confluenceTd"><p>Programmable ADC offset</p></td>
<td class="confluenceTd">
<p>0x00</p></td>
</tr>
</tbody>
</table>
</div>
<p />
</span>
Like Luca Mingarelli likes this
Luca Mingarelli August 26, 2023

@PRa would you have any insight here? I am facing the same issue

Stephen Ellwood August 28, 2023

Hi Luca,

I did solve this. I had to recode all of my creation scripts to generate Confluence storage format which is a strange proprietary format.  I then created 2 functions to start and end the excerpt.

def start_excerpt(self, name):
"""Start an excerpt on a Confluence page

End Excerpt using the end_excerpt method
"""
assert not self.excerpt_active, "Cannot nest Excerpts"
self.excerpt_active = True
self.wr('<ac:structured-macro ac:name="excerpt" ac:schema-version="1" data-layout="default">')
self.wr('<ac:parameter ac:name="name">' + name + '</ac:parameter>')
self.wr('<ac:rich-text-body>')


def end_excerpt(self):
"""Finish the prviously started excerpt
"""
assert self.excerpt_active, "No active Excerpt to close"
self.wr("</ac:rich-text-body></ac:structured-macro>")
self.excerpt_active = False

where self.wr simply writes to a text file opened elsewhere in the class. 

Like Luca Mingarelli likes this
Luca Mingarelli August 31, 2023

Super, many thanks @Stephen Ellwood !

Suggest an answer

Log in or Sign up to answer
TAGS
AUG Leaders

Atlassian Community Events