namespace local = ""
namespace inh = inherit
namespace renderer = "http://namespaces.zope.org/renderer"
namespace code = "http://namespaces.zope.org/code"
namespace startup = "http://namespaces.zope.org/startup"
namespace mail = "http://namespaces.zope.org/mail"
namespace workflow = "http://namespaces.zope.org/workflow"
namespace dav = "http://namespaces.zope.org/dav"
namespace rdb = "http://namespaces.zope.org/rdb"
namespace xmlrpc = "http://namespaces.zope.org/xmlrpc"
namespace tales = "http://namespaces.zope.org/tales"
namespace server-control = "http://namespaces.zope.org/server-control"
namespace meta = "http://namespaces.zope.org/meta"
namespace fssync = "http://namespaces.zope.org/fssync"
namespace help = "http://namespaces.zope.org/help"
namespace event = "http://namespaces.zope.org/event"
namespace gts = "http://namespaces.zope.org/gts"
namespace browser = "http://namespaces.zope.org/browser"
namespace zope = "http://namespaces.zope.org/zope"

start =
   element zope:configure
   {
      attribute i18n_domain { text }?,
      attribute package { text }?,
      configure_content
   }

sub_configure =
   element zope:configure
   {
      attribute i18n_domain { text }?,
      configure_content
   }

configure_content =
   (
      sub_configure
    | \include
    | includeOverrides
    | grant
    | principal
    | unauthenticatedPrincipal
    | role
    | serviceType
    | content
    | adapter
    | view
    | defaultView
    | utility
    | service
    | class
    | hook
    | interface
    | permission
    | securityPolicy
    | factory
    | traversalNamespace
    | vocabulary
    | browser_defaultView
    | addform
    | editform
    | page
    | pages
    | menu
    | menuItem
    | menuItems
    | browser_view
    | icon
    | skin
    | resource
    | register
    | fssync_adapter
    | registerTranslations
    | defaultLanguages
    | subscribe
    | directives
    | top_directive
    | registerShutdownHook
    | \namespace
    | xmlrpc_view
    | xmlrpc_defaultView
    | provideConnection
    | provideInterface
    | importHandler
    | exportHandler
    | queuedService
    | directService
    | sendmailMailer
    | smtpMailer
    | schemaInterface
    | registerServerType
    | registerRequestFactory
    | registerInterpreter
    | sourcetype
    | renderer
   )*

\include =
   element zope:include
   {
      attribute package { text }?,
      attribute file { text }?
   }

includeOverrides = element zope:includeOverrides { attribute file { text } }

grant =
   element zope:grant
   {
      attribute permission { text }?,
      attribute role { text }?,
      attribute principal { text }?
   }

principal =
   element zope:principal
   {
      attribute id { text },
      attribute title { text },
      attribute description { text }?,
      attribute login { text },
      attribute password { text }
   }

unauthenticatedPrincipal =
   element zope:unauthenticatedPrincipal
   {
      attribute id { text },
      attribute title { text }
   }

role =
   element zope:role
   {
      attribute id { text },
      attribute title { text },
      attribute description { text }?
   }

serviceType =
   element zope:serviceType
   {
      attribute id { text },
      attribute interface { text }
   }

content =
   element zope:content
   {
      attribute class { text },
      (
         element zope:factory
         {
            attribute permission { text }?,
            attribute id { text }?,
            attribute title { text }?,
            attribute description { text }?
         }?
       & element zope:allow
         {
            attribute interface { text }?,
            attribute attributes { text }?
         }*
       & element zope:implements { attribute interface { text } }*
       & require*
      )
   }

adapter =
   element zope:adapter
   {
      attribute for { text },
      attribute factory { text },
      attribute provides { text },
      attribute name { text }?,
      attribute permission { text }?
   }

view =
   element zope:view
   {
      attribute for { text },
      attribute name { text },
      attribute factory { text },
      attribute type { text },
      attribute permission { text }?,
      attribute allowed_interface { text }?,
      attribute allowed_attributes { text }?
   }

defaultView =
   element zope:defaultView
   {
      attribute for { text },
      attribute type { text },
      attribute name { text },
      attribute permission { text },
      attribute factory { text },
      attribute allowed_attributes { text }?
   }

utility =
   element zope:utility
   {
      attribute provides { text },
      attribute permission { text }?,
      attribute factory { text }?,
      attribute component { text }?
   }

service =
   element zope:service
   {
      attribute serviceType { text },
      attribute component { text },
      attribute permission { text }?
   }

hook =
   element zope:hook
   {
      attribute module { text },
      attribute name { text },
      attribute implementation { text }
   }

interface = element zope:interface { attribute interface { text } }

class = element zope:class { attribute class { text }, require }

permission =
   element zope:permission
   {
      attribute id { text },
      attribute title { text },
      attribute description { text }?
   }

securityPolicy = element zope:securityPolicy { attribute component { text } }

require = element zope:require { require_normal | require_like_class }

traversalNamespace =
   element zope:traversalNamespace
   {
      attribute name { text },
      attribute handler { text }
   }

vocabulary =
   element zope:vocabulary
   {
      attribute name { text },
      attribute factory { text },
      attribute filter { text }?,
      attribute another { text }?
   }

require_normal =
   attribute permission { text },
   attribute attributes { text }?,
   attribute interface { text }?,
   attribute set_schema { text }?,
   attribute set_attributes { text }?

require_like_class = attribute like_class { text }

factory =
   element zope:factory { attribute component { text }, attribute id { text } }

browser_defaultView =
   element browser:defaultView
   {
      attribute name { text },
      attribute for { text }?
   }

addform =
   element browser:addform
   {
      attribute name { text },
      attribute schema { text },
      attribute permission { text },
      attribute content_factory { text },
      attribute menu { text }?,
      attribute for { text }?,
      attribute arguments { text }?,
      attribute keyword_arguments { text }?,
      attribute fields { text }?,
      attribute class { text }?,
      attribute label { text }?,
      attribute title { text }?,
      attribute set_before_add { text }?,
      attribute set_after_add { text }?,
      attribute description { text }?
   }

editform =
   element browser:editform
   {
      attribute schema { text },
      attribute name { text },
      attribute permission { text },
      attribute menu { text }?,
      attribute for { text }?,
      attribute title { text }?,
      attribute template { text }?,
      attribute label { text }?,
      attribute class { text }?,
      attribute fields { text }?
   }

menu =
   element browser:menu
   {
      attribute id { text },
      attribute title { text },
      attribute usage { text }?
   }

menuItem =
   element browser:menuItem
   {
      attribute menu { text },
      attribute for { text },
      attribute title { text },
      attribute action { text },
      attribute permission { text }?,
      attribute description { text }?,
      attribute filter { text }?
   }

menuItems =
   element browser:menuItems
   {
      attribute for { text },
      attribute menu { text },
      element browser:menuItem
      {
         attribute title { text },
         attribute action { text },
         attribute filter { text }?,
         attribute permission { text }?
      }+
   }

pages =
   element browser:pages
   {
      attribute for { text },
      attribute class { text },
      attribute permission { text },
      subpage+
   }

browser_view =
   element browser:view
   {
      attribute for { text },
      attribute name { text },
      attribute class { text },
      attribute permission { text },
      attribute menu { text }?,
      attribute allowed_attributes { text }?,
      attribute title { text }?,
      subpage*
   }

subpage =
   element browser:page
   {
      attribute name { text },
      attribute attribute { text }?,
      attribute template { text }?,
      attribute title { text }?,
      attribute menu { text }?
   }

page =
   element browser:page
   {
      attribute name { text },
      attribute for { text },
      attribute permission { text },
      attribute class { text }?,
      attribute title { text }?,
      attribute menu { text }?,
      attribute attribute { text }?,
      attribute template { text }?,
      attribute allowed_interface { text }?,
      attribute allowed_attributes { text }?,
      attribute layer { text }?
   }

icon =
   element browser:icon
   {
      attribute name { text },
      attribute for { text },
      attribute file { text }
   }

skin =
   element browser:skin { attribute name { text }, attribute layers { text } }

resource =
   element browser:resource
   {
      attribute name { text },
      attribute file { text },
      attribute layer { text }?
   }

register =
   element help:register
   {
      attribute id { text },
      attribute title { text },
      attribute doc_path { text },
      attribute for { text }?,
      attribute view { text }?,
      attribute parent { text }?
   }

fssync_adapter =
   element fssync:adapter
   {
      attribute factory { text },
      attribute class { text }?
   }

registerTranslations =
   element gts:registerTranslations { attribute directory { text } }

defaultLanguages =
   element gts:defaultLanguages { attribute languages { text } }

subscribe =
   element event:subscribe
   {
      attribute subscriber { text },
      attribute event_types { text }
   }

top_directive =
   element meta:directive
   {
      attribute namespace { text },
      attribute name { text },
      attribute schema { text },
      attribute handler { text }
   }

directives =
   element meta:directives
   {
      attribute namespace { text },
      ( directive | complexDirective )+
   }

directive =
   element meta:directive
   {
      attribute name { text },
      attribute schema { text },
      attribute handler { text }
   }

complexDirective =
   element meta:complexDirective
   {
      attribute name { text },
      attribute schema { text },
      attribute handler { text },
      subdirective*
   }

subdirective =
   element meta:subdirective
   {
      attribute name { text },
      attribute schema { text }
   }

registerShutdownHook =
   element server-control:registerShutdownHook
   {
      attribute name { text },
      attribute priority { text },
      attribute call { text }
   }

\namespace =
   element tales:namespace
   {
      attribute prefix { text },
      attribute interface { text }
   }

xmlrpc_view =
   element xmlrpc:view
   {
      attribute name { text },
      attribute for { text },
      attribute class { text }?,
      attribute permission { text }?,
      attribute allowed_interface { text }?,
      attribute allowed_attributes { text }?,
      attribute factory { text }?
   }

xmlrpc_defaultView =
   element xmlrpc:defaultView
   {
      attribute name { text },
      attribute for { text }
   }

provideConnection =
   element rdb:provideConnection
   {
      attribute name { text },
      attribute component { text },
      attribute dsn { text }
   }

provideInterface =
   element dav:provideInterface
   {
      attribute for { text },
      attribute interface { text }
   }

importHandler =
   element workflow:importHandler
   {
      attribute interface { text },
      attribute factory { text }
   }

exportHandler =
   element workflow:exportHandler
   {
      attribute interface { text },
      attribute factory { text }
   }

queuedService =
   element mail:queuedService
   {
      attribute name { text },
      attribute queuePath { text },
      attribute mailer { text },
      attribute permission { text }
   }

directService =
   element mail:directService
   {
      attribute name { text },
      attribute mailer { text },
      attribute permission { text }
   }

sendmailMailer =
   element mail:sendmailMailer
   {
      attribute id { text },
      attribute command { text }?
   }

smtpMailer =
   element mail:smtpMailer
   {
      attribute id { text },
      attribute hostname { text },
      attribute port { text }?,
      attribute username { text }?,
      attribute password { text }?
   }

schemaInterface = element xml:schemaInterface { attribute uri { text } }

registerServerType =
   element startup:registerServerType
   {
      attribute name { text },
      attribute factory { text },
      attribute requestFactory { text },
      attribute logFactory { text },
      attribute defaultPort { text },
      attribute defaultVerbose { text }
   }

registerRequestFactory =
   element startup:registerRequestFactory
   {
      attribute name { text },
      attribute publication { text }?,
      attribute factory { text }?,
      attribute request { text }?
   }

registerInterpreter =
   element code:registerInterpreter
   {
      attribute type { text },
      attribute component { text }
   }

sourcetype =
   element renderer:sourcetype
   {
      attribute title { text },
      attribute interface { text },
      attribute class { text }
   }

renderer =
   element renderer:renderer
   {
      attribute sourceType { text },
      attribute for { text },
      attribute factory { text }
   }
