<!-- Comics Markup Language -->
<!-- VERSION 0.3a           -->

<!-- Some inlines for simple text markup -->
<!ENTITY % inlines 'emphasis | strong | em | s | link'>

<!-- Comic's distributable logo (such as an ad banner).
---- * Must contain an image element with an image for the icon.
---- * May contain one URL element with a URL to which the
---- referenced image should point.
--->
<!ELEMENT icon (image | url?)>

<!-- Titular element for a node  -->
<!ELEMENT title (#CDATA)>

<!-- Textual description of a parent node -->
<!ELEMENT description (#PCDATA | %inlines;)>

<!-- An external URL. The element form (rather than attribute) is for cases
---- where there can be multiple URLs for something (rare) or where the 
---- parent element is mainly a container for a data-collection object
---- (opposed to a textual object, where the character data is the focus).
--->
<!ELEMENT url (#CDATA)>

<!-- The link element references another location. For references inside
---- the document (identified by unique id attributes) prepend a pound 
---- sign (#). Everything else will be considered a URL.
--->
<!ELEMENT link (#PCDATA)>
<!ATTLIST link     target    CDATA  #REQUIRED>

<!-- An image. -->
<!ELEMENT image EMPTY>
<!ATTLIST image    url       CDATA  #REQUIRED>

<!-- Stuff about a person involved in making the comic 
---- * Optional firstname is the given name of the person.
---- * Zero or more given middle names for the person
---- * Required surname is the family name of the person
---- * Zero or more nicknames are aliases, pseudonyms, or given nicknames
---- adopted by the person that the person wishes to be published
---- * Zero or more email addresses show how to get ahold of the person
---- * Zero or more URLs describe homepages or other sites related directly to 
---- the person
---- * One or more jobs describe in what way the person contributed to the
---- parent element
--->
<!ELEMENT person (firstname?, middlename*, surname, nickname*, email*, url*, job+)>

<!-- A name can be broken down into four parts (six, actually, including 
---- title (Mr., Mrs., Dr., etc.) and suffix (Jr., Esquire, III, etc.). The 
---- four parts recognized here are first name (firstname), middle name
---- (middlename), family name (surname), and nicknames (nickname).
---- Only one first name can be given, and suffix can be rolled into surname 
---- (of which there can also only be one). Title is considered largely 
---- irrelevant for this. Some people have multiple middle names, and of 
---- course nicknames are multiplicitous as well.
--->
<!ELEMENT firstname (#CDATA)>
<!ELEMENT middlename (#CDATA)>
<!ELEMENT surname (#CDATA)>
<!ELEMENT nickname (#CDATA)>

<!-- An email address (and only one) -->
<!ELEMENT email (#CDATA)>

<!-- Context in which a person contributed something (writer, artist, caterer, etc.) -->
<!ELEMENT job (#CDATA)>

<!--
---- * 'emphasis' - Ordinary spoken emphasis, which many comics make explicit
---- by emboldening the appropriate words.
---- * 'strong' - As above, but extra-strong emphasis, outside of normal
---- conversational tones. Many comics would use a larger font for this.
---- * 'em' - Shorthand for 'emphasis'
---- * 's' - Shorthand for 'strong'
-->
<!ELEMENT emphasis (#PCDATA)>
<!ELEMENT strong (#PCDATA)>
<!ELEMENT em (#PCDATA)>
<!ELEMENT s (#PCDATA)>

<!-- The comic is the highest tag wherein all else is contained.
---- * The title of the comic must come first
---- * Zero or more persons listed who are primary contributors to the comic
---- as a whole
---- * Zero or more icons providing logos, ad or link banners, or other 
---- image-based information pertaining to the entire comic
---- * An optional description of what the comic is (generally) about
---- * The URL of the comic's main page
---- * Zero or more of one class from among the following:
---- ** Books (physical, publiushed, or conceptual) containing collections
----    of strips
---- ** Chapters (in books or conceptual) containing strips, generally
----    corresponding to plot arcs within the strip
---- ** Individual strips
----
---- Comics also must have attributes for a date (in UTC format) that the
---- comic was last published and may have an attribute for the 
---- language in which the comic is written.
--->
<!ELEMENT comic (title, (person* | icon* | description? | url* | (book* | chapter* | strip*) ) )>

<!ATTLIST comic    published CDATA  #REQUIRED
                    xml:lang  CDATA  #IMPLIED>

<!-- A book doesn't have to be a physical, published book. It can also be a
---- conceptual collection of several chapters' worth of strips (for example,
---- in an epic comic where an adventure would be an entire book, and each
---- chapter the various trials during the course of that adventure).
---- * The book must have a title as its first element
---- * May have zero or more people who contributed in large part to this
---- particular book
---- * May have zero or more of one class of the following:
---- ** Chapters containing strips, usually corresponding to a plot arc
---- ** Pages containing strips, almost always corresponding to physical pages
---- ** Individual strips of panels
----
---- An ISBN attribute is provided in the event that a book is an actual
---- published work. Any further information about the book is out of
---- scope for this DTD, and can be gleaned by a separate consultation of,
---- for example, isbndb.com.
----
---- The language the book is published in may also be specified.
--->
<!ELEMENT book (title, ( (chapter* | page* | strip*) | person*) )>
<!ATTLIST book     isbn      CDATA  #IMPLIED
                    xml:lang  CDATA  #IMPLIED>

<!-- A chapter is a conceptual grouping of comic strips. Sometimes it 
---- corresponds to a physical group of pages in a book, or sometimes to a
---- strictly abstract group of strips.
---- * Some chapters have a title, which must be specified first
---- * Zero or more persons may be specified who contributed in large part 
---- to the entire chapter
---- * A chapter may contain zero or more elements of one class of the following:
---- ** Pages are physical entites that may contain several strips
---- ** Individual strips of panels
--->
<!ELEMENT chapter (title?, ( (page* | strip*) | person*) )>

<!-- A page is a printed piece of paper in a physical book.
---- * Zero or more strips contained on the page can be described
---- * Zero or more people who contributed to this particular page can be added
--->
<!ELEMENT page (strip* | person*)>

<!-- An instance of a comic strip 
---- * The first element may be the title of the strip
---- * The optional 'person' element can be used to list people who
---- worked on this particular strip, but aren't in the regular credits
---- * The 'url' element can point to the web page where the full strip exists 
---- * The 'image' element may provide a list of resources where the strip as 
---- a whole can be found
---- * The 'character' element may provide a list of characters who appear
---- somewhere in this strip
---- * The optional 'teaser' element can be used to provide a preview of 
---- this strip
---- * One more more panels making up the strip must be specified.
----
---- Each strip must have a unique serial number
---- Each strip may also provide a date published (in UTC 
---- format), and describe what language it's written in.
--->
<!ELEMENT strip (title?, (person* | url? | image* | character* | teaser? | panel+) )>
<!ATTLIST strip    published CDATA  #IMPLIED
                    id        ID     #REQUIRED
                    xml:lang  CDATA  #IMPLIED>

<!-- The teaser briefly describes what happens in this strip, and may
---- be useful in syndication..
---- * An optional description can be used for syndication to provide a
---- teasing description, making audiences want to go to the actual comic
---- to find out more.
---- * Zero or more panels can be used as previews of the corresponding strip
--->
<!ELEMENT teaser (description? | panel*)>

<!-- A panel within a strip. A great deal of debate has gone on about what
---- the specification of a "panel" is: if it's a box of ink (pixels) with
---- some drawings inside, if it's an entire image possibly containing
---- several of those, or if it's a concept that defies being wholly 
---- encompassed by either of those two definitions. For ComicsML purposes
---- a panel is defined as a single unit of action which is generally 
---- contained within a four-sided border (though not always). 
---- * The 'url' element points to the web page where this panel is available
---- * The 'image' element is the image in which this panel is contained
---- * An optional description provides a summary of what's going on in this panel
---- * Zero or more characters who appear in this panel
---- * Zero or more captions found within this panel may be specified
---- * Speech found within this panel may be given
---- * Zero or more sound effects occurring in the panel can be shown
---- * Any discreet actions carried out entirely within this panel may be
---- described (succinctly)
----
---- Additionally, an optional language attribute can describe what language
---- this panel is described in.
--->
<!ELEMENT panel (url? | image? | description? | character* | caption* | speech* | sfx* | action*)>
<!ATTLIST panel xml:lang CDATA #IMPLIED>

<!-- The name of a character in the comic. --> 
<!ELEMENT character (#PCDATA)>

<!-- Description of a specific action taking place in a panel. 
---- These should be short descriptions of discreet actions to help
---- determine what's going on in this specific element, not
---- descriptions of extended actions.
---- * Zero or more characters denote who is performing the action.
--->
<!ELEMENT action (character* | (#PCDATA | %inlines;) )>

<!-- Sound effects happening over the duration of the panel. 
---- * Source is the object (or character) emanating the sound effect.
--->
<!ELEMENT sfx (#CDATA)>
<!ATTLIST sfx      source    CDATA  #IMPLIED>

<!-- A misnomer born of lack of a better term: Not necessarily speech, this 
---- describes any dialogue (or monologue) shown in the comic: speech,
---- thoughts (usually in puffy bubbles with detached, circular tails), 
---- broadcasts (usually shown in spiky bubbles with lightning-liek tails),
---- or any other form of communication.
---- * One or more characters are the source of the speech
----
---- A language attribute may be specified, denoting what language the speech
---- is in.
--->
<!ELEMENT speech (character+, (#PCDATA | %inlines; | inflect | emote) )>
<!ATTLIST speech   xml:lang  CDATA  #IMPLIED>

<!-- Caption for a panel -->
<!ELEMENT caption (#PCDATA | %inlines;)>

<!-- Inflection that usually denotes emotion (or lack thereof) or vocal style. 
---- The required tone attribute can be used to specify which type of voice
---- or emotion the character is displaying, e.g. envy, cold, anger, 
---- confusion, soft, wobbly, or monotone.
--->
<!ELEMENT inflect (#PCDATA)>
<!ATTLIST inflect  tone      CDATA  #REQUIRED>

<!-- Emote is different from inflection in that it doesn't apply to any 
---- text. Rather, it's non-vocal (or non-textual) emotion classically 
---- represented in comics with nonstandard glyphs. Examples include
---- bang (!), interrobang (?!), silence (...), gasp (~*), and swear (@#!).
---- These textual descriptions (bang, interrobang, etc.) are placed in the 
---- type attribute.
--->
<!ELEMENT emote (#PCDATA)>
<!ATTLIST emote    type      CDATA  #REQUIRED>