<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">

    <!-- Simple Types for Enumerations -->
    <xs:simpleType name="spacingType">
        <xs:restriction base="xs:string">
            <xs:enumeration value="high"/>
            <xs:enumeration value="low"/>
            <xs:enumeration value="box"/>
        </xs:restriction>
    </xs:simpleType>

    <xs:simpleType name="valignType">
        <xs:restriction base="xs:string">
            <xs:enumeration value="top"/>
            <xs:enumeration value="middle"/>
            <xs:enumeration value="bottom"/>
        </xs:restriction>
    </xs:simpleType>

    <xs:simpleType name="orientationType">
        <xs:restriction base="xs:string">
            <xs:enumeration value="vertical"/>
            <xs:enumeration value="horizontal"/>
        </xs:restriction>
    </xs:simpleType>

    <xs:simpleType name="bisectType">
        <xs:restriction base="xs:string">
            <xs:enumeration value="vertical"/>
            <xs:enumeration value="top_right"/>
            <xs:enumeration value="top_left"/>
            <xs:enumeration value="none"/>
        </xs:restriction>
    </xs:simpleType>

    <xs:simpleType name="shapeType">
        <xs:restriction base="xs:string">
            <xs:enumeration value="rectangle"/>
            <xs:enumeration value="triangle"/>
            <xs:enumeration value="diamond"/>
            <xs:enumeration value="triangleInverted"/>
        </xs:restriction>
    </xs:simpleType>

    <!-- Simple Type for <s> element content with pattern -->
    <xs:simpleType name="sContentType">
        <xs:restriction base="xs:string">
            <xs:pattern value='("[0-9]+ [0-9]+" +".*" +".*" +".*" +".*" *)?'/>
        </xs:restriction>
    </xs:simpleType>

    <!-- Element Definitions -->

    <xs:element name="album">
        <xs:complexType>
            <xs:choice maxOccurs="unbounded">
                <xs:element ref="page"/>
                <xs:element ref="title-page"/>
            </xs:choice>
        </xs:complexType>
    </xs:element>

    <xs:element name="page">
        <xs:complexType>
            <xs:choice minOccurs="0" maxOccurs="unbounded">
                <xs:element ref="set"/>
                <xs:element ref="column-set"/>
            </xs:choice>
            <xs:attribute name="title" type="xs:string" use="optional"/>
            <xs:attribute name="subtitle" type="xs:string" use="optional"/>
            <xs:attribute name="classifier" type="xs:string" use="optional"/>
            <xs:attribute name="pagenum" type="xs:string" use="optional"/>
            <xs:attribute name="skip" type="xs:string" use="optional"/>
            <xs:attribute name="border" type="xs:string" use="optional"/>
        </xs:complexType>
    </xs:element>

    <xs:element name="title-page">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="content-items"/>
            </xs:sequence>
            <xs:attribute name="title" type="xs:string" use="optional"/>
            <xs:attribute name="subtitle" type="xs:string" use="optional"/>
            <xs:attribute name="image" type="xs:string" use="optional"/>
            <xs:attribute name="skip" type="xs:string" use="optional"/>
            <xs:attribute name="description" type="xs:string" use="optional"/>
        </xs:complexType>
    </xs:element>

    <xs:element name="column-set">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="set" maxOccurs="unbounded"/>
            </xs:sequence>
            <xs:attribute name="issue" type="xs:string" use="optional"/>
            <xs:attribute name="description" type="xs:string" use="optional"/>
            <xs:attribute name="description-secondary" type="xs:string" use="optional"/>
            <xs:attribute name="skip" type="xs:string" use="optional"/>
            <xs:attribute name="use-box-centering" type="xs:boolean" use="optional"/>
            <xs:attribute name="spacing" type="spacingType" use="optional"/>
        </xs:complexType>
    </xs:element>

    <xs:element name="set">
        <xs:complexType>
            <xs:choice minOccurs="0" maxOccurs="unbounded">
                <xs:element ref="comp-set"/>
                <xs:element ref="row-set"/>
            </xs:choice>
            <xs:attribute name="issue" type="xs:string" use="optional"/>
            <xs:attribute name="description" type="xs:string" use="optional"/>
            <xs:attribute name="description-secondary" type="xs:string" use="optional"/>
            <xs:attribute name="skip" type="xs:string" use="optional"/>
            <xs:attribute name="comment" type="xs:string" use="optional"/>
        </xs:complexType>
    </xs:element>

    <xs:element name="comp-set">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="row-set" maxOccurs="unbounded"/>
            </xs:sequence>
            <xs:attribute name="skip" type="xs:string" use="optional"/>
            <xs:attribute name="description" type="xs:string" use="optional"/>
            <xs:attribute name="spacing" type="spacingType" use="optional"/>
            <xs:attribute name="vertical-offset" type="xs:string" use="optional"/>
        </xs:complexType>
    </xs:element>

    <xs:element name="row-set">
        <xs:complexType>
            <xs:choice minOccurs="0" maxOccurs="unbounded">
                <xs:element ref="s"/>
                <xs:element ref="set-tenant"/>
            </xs:choice>
            <xs:attribute name="skip" type="xs:string" use="optional"/>
            <xs:attribute name="description" type="xs:string" use="optional"/>
            <xs:attribute name="spacing-horizontal" type="xs:string" use="optional"/>
            <xs:attribute name="valign" type="valignType" use="optional"/>
            <xs:attribute name="vertical-offset" type="xs:string" use="optional"/>
        </xs:complexType>
    </xs:element>

    <xs:element name="set-tenant">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="s" maxOccurs="unbounded"/>
            </xs:sequence>
            <xs:attribute name="skip" type="xs:string" use="optional"/>
            <xs:attribute name="orientation" type="orientationType" use="optional"/>
            <xs:attribute name="border" type="xs:boolean" use="optional"/>
        </xs:complexType>
    </xs:element>

    <xs:element name="content-items">
        <xs:complexType>
            <xs:sequence minOccurs="0" maxOccurs="unbounded">
                <xs:element ref="item"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>

    <xs:element name="item" type="xs:string"/>

    <xs:element name="s">
        <xs:complexType>
            <xs:simpleContent>
                <xs:extension base="sContentType">
                    <xs:attribute name="skip" type="xs:string" use="optional"/>
                    <xs:attribute name="image" type="xs:string" use="optional"/>
                    <xs:attribute name="image-only" type="xs:boolean" use="optional"/>
                    <xs:attribute name="bisect" type="bisectType" use="optional"/>
                    <xs:attribute name="border" type="xs:boolean" use="optional"/>
                    <xs:attribute name="shape" type="shapeType" use="optional"/>
                </xs:extension>
            </xs:simpleContent>
        </xs:complexType>
    </xs:element>

</xs:schema>