﻿<?xml version="1.0" encoding="utf-8"?>
<xs:schema id="wei7" xmlns:xs="http://www.w3.org/2001/XMLSchema">

  <xs:annotation>
    <xs:documentation>
      "wei7" format version 2.2 for the game of Wei Qi (go or igo in Japanese, baduk in Korean)
    </xs:documentation>
  </xs:annotation>

  <!--types-->

  <xs:simpleType name="ShortStringType">
    <xs:restriction base="xs:string">
      <xs:pattern value="[^\x00-\x1F]{0,128}" />
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="CoordinateType">
    <xs:restriction base="xs:int">
      <xs:pattern value="[0-9]|[1-9][0-9]" />
      <xs:minInclusive value="0" />
      <xs:maxExclusive value="19" />
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="EvalType">
    <xs:restriction base="xs:string">
      <xs:enumeration value="bad" />
      <xs:enumeration value="normal" />
      <xs:enumeration value="good" />
      <xs:enumeration value="trick" />
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="ProblemType">
    <xs:restriction base="xs:string">
      <xs:enumeration value="no" />
      <xs:enumeration value="black" />
      <xs:enumeration value="white" />
    </xs:restriction>
  </xs:simpleType>

  <xs:complexType name="PlayerInfoType">
    <xs:attribute name="domain" type="ShortStringType" />
    <xs:attribute name="id" type="ShortStringType" />
    <xs:attribute name="name" type="ShortStringType" />
    <xs:attribute name="title" type="ShortStringType" />
    <xs:attribute name="rank" type="ShortStringType" />
  </xs:complexType>

  <xs:complexType name="MoveType">
    <xs:attribute name="type">
      <xs:simpleType>
        <xs:restriction base="xs:string">
          <xs:enumeration value="normal" />
          <xs:enumeration value="pass" />
        </xs:restriction>
      </xs:simpleType>
    </xs:attribute>
    <xs:attribute name="x" type="CoordinateType" />
    <xs:attribute name="y" type="CoordinateType" />
    <xs:attribute name="splitter">
      <xs:simpleType>
        <xs:restriction base="xs:string">
          <xs:enumeration value="small" />
          <xs:enumeration value="medium" />
          <xs:enumeration value="large" />
        </xs:restriction>
      </xs:simpleType>
    </xs:attribute>
    <xs:attribute name="eval" type="EvalType" />
    <xs:attribute name="title" type="ShortStringType" />
    <xs:attribute name="comment" type="xs:string" />
    <xs:attribute name="problem" type="ProblemType" />
  </xs:complexType>

  <xs:complexType name="PositionType">
    <xs:attribute name="x" type="CoordinateType" use="required" />
    <xs:attribute name="y" type="CoordinateType" use="required" />
  </xs:complexType>

  <xs:complexType name="MarkType">
    <xs:attribute name="x" type="CoordinateType" use="required" />
    <xs:attribute name="y" type="CoordinateType" use="required" />
    <xs:attribute name="symbol" use="required">
      <xs:simpleType>
        <xs:restriction base="xs:string">
          <xs:pattern value="[A-Za-z0-9\@\#\$\%\&amp;\*\?]" />
        </xs:restriction>
      </xs:simpleType>
    </xs:attribute>
  </xs:complexType>

  <xs:complexType name="MovesType">
    <xs:sequence>
      <xs:element name="pre" minOccurs="0">
        <xs:complexType>
          <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="black" type="PositionType" />
            <xs:element name="white" type="PositionType" />
            <xs:element name="mark" type="MarkType" />
          </xs:choice>
          <xs:attribute name="eval" type="EvalType" />
          <xs:attribute name="title" type="ShortStringType" />
          <xs:attribute name="comment" type="xs:string" />
          <xs:attribute name="problem" type="ProblemType" />
        </xs:complexType>
      </xs:element>
      <xs:choice minOccurs="0" maxOccurs="unbounded">
        <xs:element name="black" type="MoveType" />
        <xs:element name="white" type="MoveType" />
        <xs:element name="mark" type="MarkType" />
        <xs:element name="moves" type="MovesType" />
      </xs:choice>
    </xs:sequence>
  </xs:complexType>

  <!--root-->

  <xs:element name="wei7">
    <xs:complexType>

      <xs:sequence>

        <xs:element name="size">
          <xs:simpleType>
            <xs:restriction base="xs:int">
              <xs:pattern value="7|9|11|13|15|17|19" />
            </xs:restriction>
          </xs:simpleType>
        </xs:element>

        <xs:element name="game" minOccurs="0">
          <xs:complexType>

            <xs:all>

              <xs:element name="rules" minOccurs="0">
                <xs:complexType>
                  <xs:attribute name="scoring">
                    <xs:simpleType>
                      <xs:restriction base="xs:string">
                        <xs:enumeration value="area" />
                        <xs:enumeration value="territory" />
                      </xs:restriction>
                    </xs:simpleType>
                  </xs:attribute>
                  <xs:attribute name="komi">
                    <xs:simpleType>
                      <xs:restriction base="xs:double">
                        <xs:pattern value="[0-9](\.5)?" />
                        <xs:minExclusive value="0" />
                        <xs:maxExclusive value="10" />
                      </xs:restriction>
                    </xs:simpleType>
                  </xs:attribute>
                  <xs:attribute name="type">
                    <xs:simpleType>
                      <xs:restriction base="xs:string">
                        <xs:enumeration value="Chinese" />
                        <xs:enumeration value="Japanese" />
                        <xs:enumeration value="Korean" />
                      </xs:restriction>
                    </xs:simpleType>
                  </xs:attribute>
                </xs:complexType>
              </xs:element>

              <xs:element name="time" type="xs:dateTime" minOccurs="0" />

              <xs:element name="black" type="PlayerInfoType" minOccurs="0" />

              <xs:element name="white" type="PlayerInfoType" minOccurs="0" />

              <xs:element name="result" minOccurs="0">
                <xs:complexType>
                  <xs:attribute name="winner" use="required">
                    <xs:simpleType>
                      <xs:restriction base="xs:string">
                        <xs:enumeration value="black" />
                        <xs:enumeration value="white" />
                        <xs:enumeration value="neither" />
                      </xs:restriction>
                    </xs:simpleType>
                  </xs:attribute>
                  <xs:attribute name="margin">
                    <xs:simpleType>
                      <xs:restriction base="xs:double">
                        <xs:pattern value="([0-9]|[1-9][0-9]|[1-9][0-9][0-9])(\.5)?" />
                        <xs:minExclusive value="0" />
                        <xs:maxExclusive value="512" />
                      </xs:restriction>
                    </xs:simpleType>
                  </xs:attribute>
                </xs:complexType>
              </xs:element>

            </xs:all>

            <xs:attribute name="domain" type="ShortStringType" />
            <xs:attribute name="id" type="ShortStringType" />
            <xs:attribute name="name" type="ShortStringType" />

          </xs:complexType>
        </xs:element>

        <xs:element name="moves" type="MovesType" />

      </xs:sequence>

      <xs:attribute name="version" use="required">
        <xs:simpleType>
          <xs:restriction base="xs:string">
            <xs:enumeration value="2.0" />
            <xs:enumeration value="2.1" />
            <xs:enumeration value="2.2" />
          </xs:restriction>
        </xs:simpleType>
      </xs:attribute>

    </xs:complexType>
  </xs:element>

</xs:schema>
