#
# XML Document Type Definition for GNUstep Documentation Markup
# Language (gsdoc).
#
# Written by Richard Frith-Macdonald
# Based on GDML by 1997 Yoo C. Chung
# This is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either
# version 2 of the License, or (at your option) any later
# version.
#
# This document is distributed in the hope that it will be
# useful, but WITHOUT ANY WARRANTY; without even the implied
# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
# PURPOSE. See the GNU General Public License for more details.
#
# You should have received a copy of the GNU General
# Public License along with this software; if not, write to the
# Software Foundation, Inc., 31 Milk Street #960789 Boston, MA 02196 USA.
#############################################################################
# Note, the normative form of this document is the DTD.
# This Relax-NG version generated by Adrian Robert using the trang tool.
# It can be used for realtime validation and autocompletion with the
# emacs nxml-mode by James Clark. Get it from
# http://www.thaiopensource.com/download/ .
#
# Set it up with '(load "nxml-mode-20040910/rng-auto.el")' in your .emacs.
# While you're at it, put insert this as well:
# (setq auto-mode-alist (cons '("\\.gsdoc$" . nxml-mode) auto-mode-alist))
#
# Fire up a new emacs and hit 'alt-x customize-apropos rng', then add a file
# "/pathToHome/[username]/.schemas.xml" to 'Rng Schema Locating Files'.
# Then make a file in your home directory called ".schemas.xml" and put in
# it the following lines:
#
#
#
#
#
#
# (Replace GNUSTEP_SYSTEM_LIBRARY by the correct real path on your system.)
#
# Voila, whenever you edit a .gsdoc file its validity will be continuously
# checked, errors will be highlighted, and you can complete tags and
# attributes using 'ctrl-enter'. 'Ctrl-c ctrl-f' autocloses tags.
#############################################################################
# gsdoc is an XML language - Typical usage:
#
#
#
#
# ***** Character entities. *****
# General purpose characters for gsdoc.
# copyright symbol
# trademark symbol
# ellipsis (...)
# non breakable space
# ampersand
# apos
# quotation mark (")
# lesser than symbol
# greater than symbol
namespace a = "http://relaxng.org/ns/compatibility/annotations/1.0"
# ***** Entity declarations. *****
# Boolean values for attributes
boolean = "yes" | "no"
# Entity for phrase elements.
phrase =
element.var
| element.ivar
| element.em
| element.code
| element.strong
| element.file
| element.site
# Entity for cross references.
xref =
element.ref
| element.uref
| element.url
| element.email
| element.prjref
# Entity for anchors.
anchor = element.label | element.entry
# Entity for simple text level elements.
\text = text | xref | anchor | phrase | element.footnote | element.br
# Entity for list elements.
\list =
element.list
| element.enum
| element.deflist
| element.qalist
| element.dictionary
# Entity for block level elements.
block =
\text
| \list
| element.p
| element.example
| element.embed
| element.index
# Entity for definition elements and blocks.
defblock =
\text
| \list
| element.heading
| element.p
| element.example
| element.embed
| element.index
| element.class
| element.category
| element.protocol
| element.function
| element.macro
| element.type
| element.variable
| element.constant
| element.EOModel
| element.EOEntity
# ********** End entity declarations
# Used for describing something.
element.desc = element desc { attlist.desc, block* }
attlist.desc &= empty
# A footnote.
element.footnote = element footnote { attlist.footnote, \text* }
attlist.footnote &= empty
# ***** Phrase elements. *****
# The content is a metasyntactic variable or argument name.
element.var = element var { attlist.var, \text* }
attlist.var &= empty
# The content is a metasyntactic ivariable name.
element.ivar = element ivar { attlist.ivar, \text* }
attlist.ivar &= empty
# Emphasize the content.
element.em = element em { attlist.em, \text* }
attlist.em &= empty
# The content is too important that simple emphasizing isn't enough.
element.strong = element strong { attlist.strong, \text* }
attlist.strong &= empty
# The content is either a name for code (e.g. class names), or a
# relatively short code fragment.
element.code = element code { attlist.code, \text* }
attlist.code &= empty
# The content is a file name.
element.file = element file { attlist.file, text* }
attlist.file &= empty
# The content is a fully qualified domain name on the Internet.
element.site = element site { attlist.site, text* }
attlist.site &= empty
# ***** List elements. *****
# An item in a list.
element.item = element item { attlist.item, block* }
attlist.item &= empty
# An enumerated list.
element.enum = element enum { attlist.enum, element.item+ }
attlist.enum &= empty
# A ordinary, unnumbered list.
element.list = element list { attlist.list, element.item+ }
attlist.list &= empty
# A term to defined in a definition list.
element.term = element term { attlist.term, \text* }
attlist.term &= empty
# A definition list.
element.deflist =
element deflist { attlist.deflist, (element.term, element.desc)+ }
attlist.deflist &= empty
# A question for a question and answer list.
element.question = element question { attlist.question, \text* }
attlist.question &= empty
# An answer for a question and answer list.
element.answer = element answer { attlist.answer, block* }
attlist.answer &= empty
# A question and answer list.
element.qalist =
element qalist { attlist.qalist, (element.question, element.answer)+ }
attlist.qalist &= empty
# **********
# ***** Cross references. *****
# A reference.
# ID of the reference.
# TYPE of reference, if implied, a reference to a label.
# CLASS specific class for a method, may be one of the following formats -
# classname, classname(categoryname), (protocolname)
element.ref = element ref { attlist.ref, \text* }
attlist.ref &=
attribute id { text },
[ a:defaultValue = "label" ]
attribute type {
"class"
| "category"
| "protocol"
| "method"
| "ivariable"
| "function"
| "type"
| "macro"
| "variable"
| "constant"
| "label"
| "EOModel"
| "EOEntity"
| "tool"
}?,
attribute class { text }?
# An e-mail address.
element.email = element email { attlist.email, \text* }
attlist.email &= attribute address { text }?
# A URL.
element.url = element url { attlist.url, empty }
attlist.url &= attribute url { text }?
# A reference to a URL.
# The text contained appears in the output.
element.uref = element uref { attlist.uref, \text* }
attlist.uref &= attribute url { text }
# A reference to a project.
# The text contained appears in the output.
element.prjref = element prjref { attlist.prjref, \text* }
attlist.prjref &=
attribute prjname { text }?,
attribute file { text }?
# ***** Anchors. *****
# An anchor for a general reference.
# The text contained appears in the output.
# If the id attribute is omitted, the text is used in its place.
element.label = element label { attlist.label, \text* }
attlist.label &= attribute id { text }?
# An entry for the general index.
# The text that is contained appears in the index, and never in
# the text itself.
# If the id attribute is omitted, the text is used in its place.
element.entry = element entry { attlist.entry, \text* }
attlist.entry &= attribute id { text }?
# Entity for standard elements.
element.GNUstep = element GNUstep { attlist.GNUstep, empty }
attlist.GNUstep &= empty
element.OpenStep = element OpenStep { attlist.OpenStep, empty }
attlist.OpenStep &= empty
element.NotOpenStep = element NotOpenStep { attlist.NotOpenStep, empty }
attlist.NotOpenStep &= empty
element.MacOS-X = element MacOS-X { attlist.MacOS-X, empty }
attlist.MacOS-X &= empty
element.NotMacOS-X = element NotMacOS-X { attlist.NotMacOS-X, empty }
attlist.NotMacOS-X &= empty
# A standard that something is or isn't compliant with.
standard =
element.GNUstep
| element.OpenStep
| element.NotOpenStep
| element.MacOS-X
| element.NotMacOS-X
element.standards = element standards { attlist.standards, standard* }
attlist.standards &= empty
# ***** Argument elements. *****
# An argument.
element.arg = element arg { attlist.arg, text* }
attlist.arg &= attribute type { text }?
# Denotes that the rest of the arguments is a variable list,
# like in printf().
element.vararg = element vararg { attlist.vararg, empty }
attlist.vararg &= empty
# ***** Method elements. *****
# A component for a method selector.
element.sel = element sel { attlist.sel, text* }
attlist.sel &= empty
# A method. If there is no DESC, it is understood that the element
# is used to override some information from the same method in the
# superclass.
# If factory not set, instance method
element.method =
element method {
attlist.method,
((element.sel, element.arg?),
(element.sel, element.arg)*,
element.vararg?),
element.desc?,
element.standards?
}
attlist.method &=
attribute type { text }?,
[ a:defaultValue = "no" ] attribute factory { boolean }?,
[ a:defaultValue = "no" ] attribute init { boolean }?,
attribute override { "subclass" | "never" }?
# ***** Elements for definitions of classes, functions, etc. *****
# Show what header file something lives in.
element.declared = element declared { attlist.declared, text* }
attlist.declared &= empty
# A macro definition.
element.macro =
element macro {
attlist.macro,
(element.arg*, element.vararg?),
element.declared?,
element.desc?,
element.standards?
}
attlist.macro &= attribute name { text }
# A type definition.
element.type =
element type {
attlist.type, element.declared?, element.desc?, element.standards?
}
attlist.type &=
attribute name { text },
attribute type { text }
# Variable definition.
# VALUE may be set for a constant or a default value
element.variable =
element variable {
attlist.variable,
element.declared?,
element.desc?,
element.standards?
}
attlist.variable &=
attribute name { text },
attribute type { text },
attribute value { text }?
# Ivariable definition.
element.ivariable =
element ivariable {
attlist.ivariable, element.desc?, element.standards?
}
attlist.ivariable &=
attribute name { text },
attribute type { text },
[ a:defaultValue = "public" ]
attribute validity { "public" | "protected" | "private" }?
# Constant definition.
# VALUE may be set for a constant or a default value
element.constant =
element constant {
attlist.constant,
element.declared?,
element.desc?,
element.standards?
}
attlist.constant &=
attribute name { text },
attribute type { text },
attribute value { text }?,
attribute role { "except" | "defaults" | "notify" | "key" }?
# A function definition.
element.function =
element function {
attlist.function,
(element.arg*, element.vararg?),
element.declared?,
element.desc?,
element.standards?
}
attlist.function &=
attribute name { text },
attribute type { text }
# Protocol definition.
element.protocol =
element protocol {
attlist.protocol,
element.declared?,
element.conform*,
element.desc?,
element.method*,
element.standards?
}
attlist.protocol &= attribute name { text }
# Category definition.
element.category =
element category {
attlist.category,
element.declared?,
element.conform*,
element.desc?,
element.method*,
element.standards?
}
attlist.category &=
attribute name { text },
attribute class { text }
# Show a protocol a class conforms to.
element.conform = element conform { attlist.conform, text* }
attlist.conform &= empty
element.class =
element class {
attlist.class,
element.declared?,
element.conform*,
element.desc?,
element.ivariable*,
element.method*,
element.standards?
}
attlist.class &=
attribute name { text },
attribute super { text }?
# ***** Elements for definitions of EOModels, etc. *****
# a dictionary Item.
element.dictionaryItem =
element dictionaryItem { attlist.dictionaryItem, block* }
attlist.dictionaryItem &=
attribute key { text },
attribute value { text }?
# a dictionary
element.dictionary =
element dictionary { attlist.dictionary, element.dictionaryItem+ }
attlist.dictionary &= empty
element.EOConnectionDictionary =
element EOConnectionDictionary {
attlist.EOConnectionDictionary, element.dictionaryItem+
}
attlist.EOConnectionDictionary &= empty
element.EOUserDictionary =
element EOUserDictionary {
attlist.EOUserDictionary, element.dictionaryItem+
}
attlist.EOUserDictionary &= empty
# EORelationshipComponent
element.EORelationshipComponent =
element EORelationshipComponent {
attlist.EORelationshipComponent, element.EORelationshipComponent*
}
attlist.EORelationshipComponent &= attribute definition { text }
# EOJoin
element.EOJoin = element EOJoin { attlist.EOJoin, element.desc? }
attlist.EOJoin &=
attribute relationshipName { text }?,
attribute joinOperator { text },
attribute joinSemantic { text },
attribute sourceAttribute { text },
attribute destinationAttribute { text }
# EORelationship
element.EORelationship =
element EORelationship {
attlist.EORelationship,
(element.EORelationshipComponent | element.EOJoin*),
element.EOUserDictionary?,
element.desc?
}
attlist.EORelationship &=
attribute entityName { text },
attribute destinationEntityName { text },
attribute name { text },
attribute isToMany { text }?
# EOAttributeRef
element.EOAttributeRef =
element EOAttributeRef { attlist.EOAttributeRef, empty }
attlist.EOAttributeRef &= attribute name { text }
# EOPrimaryKeyAttributes
element.EOPrimaryKeyAttributes =
element EOPrimaryKeyAttributes {
attlist.EOPrimaryKeyAttributes, element.EOAttributeRef+
}
attlist.EOPrimaryKeyAttributes &= empty
# EOClassProperties
element.EOClassProperties =
element EOClassProperties {
attlist.EOClassProperties, element.EOAttributeRef+
}
attlist.EOClassProperties &= empty
# EOAttributesUsedForLocking
element.EOAttributesUsedForLocking =
element EOAttributesUsedForLocking {
attlist.EOAttributesUsedForLocking, element.EOAttributeRef+
}
attlist.EOAttributesUsedForLocking &= empty
# EOAttribute
element.EOAttribute =
element EOAttribute {
attlist.EOAttribute, element.EOUserDictionary?, element.desc?
}
attlist.EOAttribute &=
attribute columnName { text }?,
attribute definition { text }?,
attribute externalType { text }?,
attribute name { text },
attribute valueClassName { text }?,
attribute valueType { text }?,
attribute entityName { text }?,
attribute isReadOnly { text }?,
attribute isDerived { text }?,
attribute isFlattened { text }?
# EOEntity
element.EOEntity =
element EOEntity {
attlist.EOEntity,
element.EOAttribute*,
element.EOAttributesUsedForLocking?,
element.EOClassProperties?,
element.EOPrimaryKeyAttributes?,
element.EORelationship*,
element.EOUserDictionary?,
element.desc?
}
attlist.EOEntity &=
attribute name { text },
attribute externalName { text }?,
attribute className { text }?,
attribute modelName { text }?,
attribute isReadOnly { text }?
# EOModel
element.EOModel =
element EOModel {
attlist.EOModel,
element.EOConnectionDictionary?,
(element.EOEntity+ | element.list),
element.EOUserDictionary?,
element.desc?
}
attlist.EOModel &=
attribute name { text },
attribute version { text }?,
attribute adaptorName { text },
attribute adaptorClassName { text }
# ***** Elements for ordinary block level elements. *****
# A line break.
element.br = element br { attlist.br, empty }
attlist.br &= empty
# A paragraph.
element.p = element p { attlist.p, \text* }
attlist.p &= empty
# An example.
element.example = element example { attlist.example, text* }
attlist.example &= attribute caption { text }?
# An embedded object. If it is of a type that the SGML processor
# cannot handle, then use the content, which is ignored otherwise.
# refer - method of referring to object (default is file)
# src - the reference to the object
# type - Internet media type of the objec
# title - optional title describing object
element.embed = element embed { attlist.embed, block* }
attlist.embed &=
attribute refer { "file" | "url" }?,
attribute src { text },
attribute type { text }?,
attribute title { text }?
# ***** Elements for document structure such as chapters. *****
# A heading for chapters, sections, ...
element.heading = element heading { attlist.heading, \text* }
attlist.heading &= empty
# A subsubsection.
element.subsubsect =
element subsubsect { attlist.subsubsect, defblock* }
attlist.subsubsect &= attribute id { text }?
# A subsection.
element.subsect =
element subsect { attlist.subsect, (defblock | element.subsubsect)* }
attlist.subsect &= attribute id { text }?
# A section.
element.section =
element section { attlist.section, (defblock | element.subsect)* }
attlist.section &= attribute id { text }?
# A chapter.
element.chapter =
element chapter { attlist.chapter, (defblock | element.section)* }
attlist.chapter &= attribute id { text }?
# ***** Elements that make searching for things easier. *****
# Table of contents.
element.contents = element contents { attlist.contents, empty }
attlist.contents &= empty
# Index ... generates an index of the specified type of elements.
# 'scope' determines whether the index is generated for the current file
# or for the whole of the current project, or for everything the software
# can find (global) ... if the document is processed in a standalone manner,
# the scope if always file. For method or ivariable indexing, if the index
# is inside a class, protocol, or category, only indexes for that unit
# should be generated.
# 'type' determines the type of entry listed in the index. The 'title'
# type really only makes sense for a project scope index as it produces
# a list of the files in the project (by title).
element.index = element index { attlist.index, empty }
attlist.index &=
[ a:defaultValue = "label" ]
attribute type {
"class"
| "category"
| "protocol"
| "method"
| "ivariable"
| "function"
| "type"
| "macro"
| "variable"
| "constant"
| "EOModel"
| "EOEntity"
| "label"
| "title"
| "tool"
}?,
[ a:defaultValue = "file" ]
attribute scope { "file" | "project" | "global" }?,
[ a:defaultValue = "normal" ] attribute style { "normal" | "bare" }?,
attribute target { text }?
# ***** Elements that describe the document itself. *****
# Copyright of the document.
element.copy = element copy { attlist.copy, \text* }
attlist.copy &= empty
# An abstract.
element.abstract = element abstract { attlist.abstract, \text* }
attlist.abstract &= empty
# The version of the document.
element.version = element version { attlist.version, \text* }
attlist.version &= empty
# The date the document was written.
element.date = element date { attlist.date, \text* }
attlist.date &= empty
# An author.
element.author =
element author {
attlist.author, element.email?, element.url?, element.desc?
}
attlist.author &= attribute name { text }
# The title of the document.
element.title = element title { attlist.title, \text* }
attlist.title &= empty
# ***** The topmost structures for the document body. *****
# Unnumbered parts appearing in the front, such as a preface.
element.front =
element front { attlist.front, element.contents?, element.chapter* }
attlist.front &= empty
# Unnumbered parts appearing in the back, such as an afterword and/or
# indices.
element.back =
element back { attlist.back, element.chapter*, element.index* }
attlist.back &= empty
# ***** The topmost structures for the document. *****
# The head containing general information about the document.
element.head =
element head {
attlist.head,
element.title,
element.author*,
element.version?,
element.date?,
element.abstract?,
element.copy?
}
attlist.head &= empty
# The main part of the document.
element.body =
element body {
attlist.body, element.front?, element.chapter+, element.back?
}
attlist.body &= empty
# **********
# The entire document.
element.gsdoc =
element gsdoc { attlist.gsdoc, element.head, element.body }
attlist.gsdoc &=
attribute base { text }?,
attribute next { text }?,
attribute prev { text }?,
attribute up { text }?,
attribute stylesheeturl { text }?
start = element.gsdoc