# Text Module

# This file is based upon the work of James Clark "Modularization of XHTML in RELAX NG"
# (see http://www.thaiopensource.com/relaxng/xhtml/ and
# the accompanying jing-copying.html file)
# All changes are marked with relevant comments.
# The following license refers just to those changes.

# Copyright (c) 2005 Petr Nalevka
# Copyright (c) 2007-2008 Mozilla Foundation
# All rights reserved.
# 
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# 1. Redistributions of source code must retain the above copyright
#    notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
#    notice, this list of conditions and the following disclaimer in the
#    documentation and/or other materials provided with the distribution.
# 3. The name of the author may not be used to endorse or promote products
#    derived from this software without specific prior written permission.
# 
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

default namespace = "http://www.w3.org/1999/xhtml"
namespace sch = "http://www.ascc.net/xml/schematron"

sch:ns [ prefix = "html" uri = "http://www.w3.org/1999/xhtml" ]
br = element br { br.attlist, empty }
br.attlist = Core.attrib
span = element span { span.attlist, Inline.model }
span.attlist = Common.attrib
abbr = element abbr { abbr.attlist, Inline.model }
abbr.attlist = Common.attrib
acronym = element acronym { acronym.attlist, Inline.model }
acronym.attlist = Common.attrib
cite = element cite { cite.attlist, Inline.model }
cite.attlist = Common.attrib
code = element code { code.attlist, Inline.model }
code.attlist = Common.attrib
dfn = element dfn { dfn.attlist, Inline.model }
dfn.attlist = Common.attrib
em = element em { em.attlist, Inline.model }
em.attlist = Common.attrib
kbd = element kbd { kbd.attlist, Inline.model }
kbd.attlist = Common.attrib
q = element q { q.attlist, Inline.model }
q.attlist =
    Common.attrib,
    attribute cite { uri.datatype }?
samp = element samp { samp.attlist, Inline.model }
samp.attlist = Common.attrib
strong = element strong { strong.attlist, Inline.model }
strong.attlist = Common.attrib
var = element var { var.attlist, Inline.model }
var.attlist = Common.attrib
\div = element div { div.attlist, Flow.model }
div.attlist = Common.attrib
p = element p { p.attlist, Inline.model }
p.attlist = Common.attrib
address = element address { address.attlist, Inline.model }
address.attlist = Common.attrib
blockquote = element blockquote { blockquote.attlist, Block.model }
blockquote.attlist =
    Common.attrib,
    attribute cite { uri.datatype }?
pre =
    element pre {
        pre.attlist
        # bugfix - pre uses %Inline excludingimg and object in strict
        
        # modified - bugfix - content is Inline.model but excluding "img and object"
        
        >> sch:pattern [
               name = "pre.content"
               "\x{a}" ~
               "        "
               sch:rule [
                   context = "html:pre"
                   "\x{a}" ~
                   "            "
                   sch:report [
                       test = "html:img or html:object"
                       "\x{a}" ~
                       "                 pre element cannot contain img and object elements.\x{a}" ~
                       "            "
                   ]
                   "\x{a}" ~
                   "        "
               ]
               "\x{a}" ~
               "    "
           ],
        Inline.model
    }
pre.attlist =
    Common.attrib
#    , attribute xml:space { string "preserve" }? # zapped -- hsivonen
h1 = element h1 { Heading.attrib, Heading.content }
h2 = element h2 { Heading.attrib, Heading.content }
h3 = element h3 { Heading.attrib, Heading.content }
h4 = element h4 { Heading.attrib, Heading.content }
h5 = element h5 { Heading.attrib, Heading.content }
h6 = element h6 { Heading.attrib, Heading.content }
Heading.attrib = Common.attrib
Heading.content = Inline.model
Heading.class = h1 | h2 | h3 | h4 | h5 | h6
Block.class = address | blockquote | \div | p | pre | Heading.class
Inline.class =
    abbr
    | acronym
    | br
    | cite
    | code
    | dfn
    | em
    | kbd
    | q
    | samp
    | span
    | strong
    | var
Inline.model = (text | Inline.class)*
# This is redefined by the legacy module to include inlines.
Block.mix = Block.class
Block.model = Block.mix+
Flow.model = (text | Inline.class | Block.class)*
