<#ftl output_format="plainText" strip_text="true">
<#--
  Licensed to the Apache Software Foundation (ASF) under one
  or more contributor license agreements.  See the NOTICE file
  distributed with this work for additional information
  regarding copyright ownership.  The ASF licenses this file
  to you under the Apache License, Version 2.0 (the
  "License"); you may not use this file except in compliance
  with the License.  You may obtain a copy of the License at
    http://www.apache.org/licenses/LICENSE-2.0
  Unless required by applicable law or agreed to in writing,
  software distributed under the License is distributed on an
  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
  KIND, either express or implied.  See the License for the
  specific language governing permissions and limitations
  under the License.
-->
<#assign dataSource = dataSources[0]>
<#assign name = dataSource.name>
<#assign workbook = tools.excel.parse(dataSource)>
<#assign date = .now?iso_utc>

<#compress>
    # ${name}
    <@writeSheets workbook/>
</#compress>
${'\n'}

<#--------------------------------------------------------------------------->
<#-- writeSheets                                                           -->
<#--------------------------------------------------------------------------->
<#macro writeSheets workbook>
    <#assign sheets = tools.excel.getSheets(workbook)>
    <#list sheets as sheet>
        <@writeSheet sheet/>
    </#list>
</#macro>

<#--------------------------------------------------------------------------->
<#-- writeSheet                                                            -->
<#--------------------------------------------------------------------------->
<#macro writeSheet sheet>
    <#assign rows = tools.excel.toTable(sheet)>
    ## ${sheet.getSheetName()}
    ${'\n'}
    <@writeRows rows/>
</#macro>

<#--------------------------------------------------------------------------->
<#-- writeRows                                                             -->
<#--------------------------------------------------------------------------->
<#macro writeRows rows>
    <#list rows as row>
        <#if row?is_first>
            <@writeHeaderRow row/>
        <#else>
            <@writeDataRow row/>
        </#if>
    </#list>
</#macro>

<#--------------------------------------------------------------------------->
<#-- writeHeaderRow                                                        -->
<#--------------------------------------------------------------------------->
<#macro writeHeaderRow headers>
    | ${headers?join(" | ", "", " |")}
    <#list headers as header>| -------- </#list>|
</#macro>

<#--------------------------------------------------------------------------->
<#-- writeDataRow                                                          -->
<#--------------------------------------------------------------------------->
<#macro writeDataRow columns>
    | ${columns?join(" | ", "", " |")}
</#macro>
