default namespace = "http://www.w3.org/2000/svg"
namespace a = "http://relaxng.org/ns/compatibility/annotations/1.0"


## 
##     SVG 1.1 Animation Module
##     file: svg-animation.rng
## 
##     This is SVG, a language for describing two-dimensional graphics in XML.
##     Copyright 2001, 2002 W3C (MIT, INRIA, Keio), All Rights Reserved.
## 
##     $Id: svg-animation.rng,v 1.1 2003/07/15 07:11:10 dean Exp $
##   

## 
##     Animation
## 
##         animate, set, animateMotion, animateColor, animateTransform, mpath
## 
##     This module declares markup to provide support for animation.
##   

## 
##     SVG.Animation.class
##   
[ xml:lang = "en" ]
grammar {
  SVG.Animation.extra.class = notAllowed
  SVG.Animation.class |=
    animate
    | set
    | animateMotion
    | animateColor
    | animateTransform
    | SVG.Animation.extra.class
  a:documentation [ "\x{a}" ~ "    SVG.Animation.attrib\x{a}" ~ "  " ]
  SVG.Animation.extra.attrib = empty
  SVG.Animation.attrib = SVG.XLink.attrib, SVG.Animation.extra.attrib
  a:documentation [
    "\x{a}" ~
    "    SVG.AnimationAttribute.attrib\x{a}" ~
    "  "
  ]
  SVG.AnimationAttribute.extra.attrib = empty
  SVG.AnimationAttribute.attrib =
    attribute attributeName { text },
    attribute attributeType { text }?,
    SVG.AnimationAttribute.extra.attrib
  a:documentation [
    "\x{a}" ~
    "    SVG.AnimationTiming.attrib\x{a}" ~
    "  "
  ]
  SVG.AnimationTiming.extra.attrib = empty
  SVG.AnimationTiming.attrib =
    attribute begin { text }?,
    attribute dur { text }?,
    attribute end { text }?,
    attribute min { text }?,
    attribute max { text }?,
    [ a:defaultValue = "always" ]
    attribute restart { "always" | "never" | "whenNotActive" }?,
    attribute repeatCount { text }?,
    attribute repeatDur { text }?,
    [ a:defaultValue = "remove" ]
    attribute fill { "remove" | "freeze" }?,
    SVG.AnimationTiming.extra.attrib
  a:documentation [
    "\x{a}" ~
    "    SVG.AnimationValue.attrib\x{a}" ~
    "  "
  ]
  SVG.AnimationValue.extra.attrib = empty
  SVG.AnimationValue.attrib =
    [ a:defaultValue = "linear" ]
    attribute calcMode { "discrete" | "linear" | "paced" | "spline" }?,
    attribute values { text }?,
    attribute keyTimes { text }?,
    attribute keySplines { text }?,
    attribute from { text }?,
    attribute to { text }?,
    attribute by { text }?,
    SVG.AnimationValue.extra.attrib
  a:documentation [
    "\x{a}" ~
    "    SVG.AnimationAddtion.attrib\x{a}" ~
    "  "
  ]
  SVG.AnimationAddtion.extra.attrib = empty
  SVG.AnimationAddtion.attrib =
    [ a:defaultValue = "replace" ]
    attribute additive { "replace" | "sum" }?,
    [ a:defaultValue = "none" ]
    attribute accumulate { "none" | "sum" }?,
    SVG.AnimationAddtion.extra.attrib
  a:documentation [
    "\x{a}" ~
    "    animate: Animate Element\x{a}" ~
    "  "
  ]
  SVG.animate.content = SVG.Description.class*
  animate = element animate { attlist.animate, SVG.animate.content }
  attlist.animate &=
    SVG.Core.attrib,
    SVG.Conditional.attrib,
    SVG.AnimationEvents.attrib,
    SVG.External.attrib,
    SVG.Animation.attrib,
    SVG.AnimationAttribute.attrib,
    SVG.AnimationTiming.attrib,
    SVG.AnimationValue.attrib,
    SVG.AnimationAddtion.attrib
  a:documentation [ "\x{a}" ~ "    set: Set Element\x{a}" ~ "  " ]
  SVG.set.content = SVG.Description.class*
  set = element set { attlist.set, SVG.set.content }
  attlist.set &=
    SVG.Core.attrib,
    SVG.Conditional.attrib,
    SVG.AnimationEvents.attrib,
    SVG.External.attrib,
    SVG.Animation.attrib,
    SVG.AnimationAttribute.attrib,
    SVG.AnimationTiming.attrib,
    attribute to { text }?
  a:documentation [
    "\x{a}" ~
    "    animateMotion: Animate Motion Element\x{a}" ~
    "  "
  ]
  SVG.animateMotion.content = SVG.Description.class*, mpath?
  animateMotion =
    element animateMotion {
      attlist.animateMotion, SVG.animateMotion.content
    }
  attlist.animateMotion &=
    SVG.Core.attrib,
    SVG.Conditional.attrib,
    SVG.AnimationEvents.attrib,
    SVG.External.attrib,
    SVG.Animation.attrib,
    SVG.AnimationTiming.attrib,
    SVG.AnimationAddtion.attrib,
    [ a:defaultValue = "paced" ]
    attribute calcMode { "discrete" | "linear" | "paced" | "spline" }?,
    attribute values { text }?,
    attribute keyTimes { text }?,
    attribute keySplines { text }?,
    attribute from { text }?,
    attribute to { text }?,
    attribute by { text }?,
    attribute path { text }?,
    attribute keyPoints { text }?,
    attribute rotate { text }?,
    attribute origin { text }?
  a:documentation [
    "\x{a}" ~
    "    animateColor: Animate Color Element\x{a}" ~
    "  "
  ]
  SVG.animateColor.content = SVG.Description.class*
  animateColor =
    element animateColor {
      attlist.animateColor, SVG.animateColor.content
    }
  attlist.animateColor &=
    SVG.Core.attrib,
    SVG.Conditional.attrib,
    SVG.AnimationEvents.attrib,
    SVG.External.attrib,
    SVG.Animation.attrib,
    SVG.AnimationAttribute.attrib,
    SVG.AnimationTiming.attrib,
    SVG.AnimationValue.attrib,
    SVG.AnimationAddtion.attrib
  a:documentation [
    "\x{a}" ~
    "    animateTransform: Animate Transform Element\x{a}" ~
    "  "
  ]
  SVG.animateTransform.content = SVG.Description.class*
  animateTransform =
    element animateTransform {
      attlist.animateTransform, SVG.animateTransform.content
    }
  attlist.animateTransform &=
    SVG.Core.attrib,
    SVG.Conditional.attrib,
    SVG.AnimationEvents.attrib,
    SVG.External.attrib,
    SVG.Animation.attrib,
    SVG.AnimationAttribute.attrib,
    SVG.AnimationTiming.attrib,
    SVG.AnimationValue.attrib,
    SVG.AnimationAddtion.attrib,
    [ a:defaultValue = "translate" ]
    attribute type {
      "translate" | "scale" | "rotate" | "skewX" | "skewY"
    }?
  a:documentation [
    "\x{a}" ~
    "    mpath: Motion Path Element\x{a}" ~
    "  "
  ]
  SVG.mpath.content = SVG.Description.class*
  mpath = element mpath { attlist.mpath, SVG.mpath.content }
  attlist.mpath &=
    SVG.Core.attrib, SVG.XLinkRequired.attrib, SVG.External.attrib
}