How to send a page including an excerpt macro using Python Rest API?
Asked by Stephen Ellwood:

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.


Answers:
author: Stephen Ellwood
body: 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 />
```


author: Pramodh M
body: Hi [@Stephen Ellwood](/t5/user/viewprofilepage/user-id/4227781)

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

comments: author: Stephen Ellwood
body: 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?


author: Pramodh M
body: Yes Correct [@Stephen Ellwood](/t5/user/viewprofilepage/user-id/4227781)


author: Stephen Ellwood
body: 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>
```


author: Luca Mingarelli
body: [@PRa](/t5/user/viewprofilepage/user-id/2319077) would you have any insight here? I am facing the same issue


author: Stephen Ellwood
body: 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.


author: Luca Mingarelli
body: Super, many thanks [@Stephen Ellwood](/t5/user/viewprofilepage/user-id/4227781) !


Tags: cloud

confluence-cloud

python

rest