Sorry, not yet written. Perhaps the interface definition of Markup_dtd expresses the same:
(**********************************************************************)
(* *)
(* Markup_dtd: *)
(* Object model of document type declarations *)
(* *)
(**********************************************************************)
(* ======================================================================
* OVERVIEW
*
* class dtd ............... represents the whole DTD, including element
* declarations, entity declarations, notation
* declarations, and processing instructions
* class dtd_element ....... represents an element declaration consisting
* of a content model and an attribute list
* declaration
* class dtd_notation ...... represents a notation declaration
* class proc_instruction .. represents a processing instruction
* ======================================================================
*
*)
class dtd :
(* Creation:
* new dtd
* creates a new, empty DTD object without any declaration, without a root
* element, without an ID.
*)
Markup_types.collect_warnings ->
object
method root : string option
(* get the name of the root element if present *)
method set_root : string -> unit
(* set the name of the root element. This method can be invoked
* only once
*)
method id : Markup_types.dtd_id option
(* get the identifier for this DTD *)
method set_id : Markup_types.dtd_id -> unit
(* set the identifier. This method can be invoked only once *)
method allow_arbitrary : unit
(* After this method has been invoked, the object changes its behaviour:
* - elements and notations that have not been added may be used in an
* arbitrary way; the methods "element" and "notation" indicate this
* by raising Undeclared instead of Validation_error.
*)
method disallow_arbitrary : unit
method arbitrary_allowed : bool
(* Returns whether arbitrary contents are allowed or not. *)
method add_element : dtd_element -> unit
(* add the given element declaration to this DTD. Raises Not_found
* if there is already an element declaration with the same name.
*)
method add_gen_entity : Markup_entity.entity -> unit
(* add the given entity as general entity to this DTD (general entities
* are those represented by &name;). If there is already a declaration
* with the same name, the second definition is ignored; as exception from
* this rule, entities with names "lt", "gt", "amp", "quot", and "apos"
* may only be redeclared with a definition that is equivalent to the
* standard definition; otherwise a Validation_error is raised.
*)
method add_par_entity : Markup_entity.entity -> unit
(* add the given entity as parameter entity to this DTD (parameter
* entities are those represented by %name;). If there is already a
* declaration with the same name, the second definition is ignored.
*)
method add_notation : dtd_notation -> unit
(* add the given notation to this DTD. If there is already a declaration
* with the same name, a Validation_error is raised.
*)
method add_pinstr : proc_instruction -> unit
(* add the given processing instruction to this DTD. *)
method element : string -> dtd_element
(* looks up the element declaration with the given name. Raises
* Validation_error if the element cannot be found. (If "allow_arbitrary"
* has been invoked before, Unrestricted is raised instead.)
*)
method element_names : string list
(* returns the list of the names of all element declarations. *)
method gen_entity : string -> Markup_entity.entity
(* looks up the general entity with the given name. Raises
* Validation_error if the entity cannot be found.
*)
method par_entity : string -> Markup_entity.entity
(* looks up the parameter entity with the given name. Raises
* Validation_error if the entity cannot be found.
*)
method notation : string -> dtd_notation
(* looks up the notation declaration with the given name. Raises
* Validation_error if the notation cannot be found. (If "allow_arbitrary"
* has been invoked before, Unrestricted is raised instead.)
*)
method notation_names : string list
(* Returns the list of the names of all added notations *)
method pinstr : string -> proc_instruction list
(* looks up all processing instructions with the given target.
* The "target" is the identifier following "<?".
* Note: It is not possible to find out the exact position of the
* processing instruction.
*)
method pinstr_names : string list
(* Returns the list of the names (targets) of all added pinstrs *)
method validate : unit
(* ensures that the DTD is valid. This method is optimized such that
* actual validation is only performed if DTD has changed.
* If the DTD is invalid, mostly a Validation_error is raised,
* but other exceptions are possible, too.
*)
method write_compact_as_latin1 : Markup_types.output_stream -> bool -> unit
(* write_compact_as_latin1 os doctype:
* Writes the DTD as Latin 1 string to 'os'. If 'doctype', a
* DTD like <!DOCTYPE root [ ... ]> is written. If 'not doctype',
* only the declarations are written (the material within the
* square brackets).
*)
(*----------------------------------------*)
method invalidate : unit
(* INTERNAL METHOD *)
method warner : Markup_types.collect_warnings
(* INTERNAL METHOD *)
end
(* ---------------------------------------------------------------------- *)
and dtd_element : dtd -> string ->
(* Creation:
* new dtd_element a_dtd a_name
* creates a new dtd_element object for a_dtd with a_name
*)
object
method name : string
(* returns the name of the declared element *)
method content_model : Markup_types.content_model_type
(* get the content model of this element declaration, or Unspecified *)
method set_content_model : Markup_types.content_model_type -> unit
(* set the content model. Once the content model is not Unspecified,
* it cannot be set to a different value again.
*)
method allow_arbitrary : unit
(* After this method has been invoked, the object changes its behaviour:
* - attributes that have not been added may be used in an
* arbitrary way; the method "attribute" indicates this
* by raising Undeclared instead of Validation_error.
*)
method disallow_arbitrary : unit
method arbitrary_allowed : bool
(* Returns whether arbitrary attributes are allowed or not. *)
method attribute : string ->
Markup_types.att_type * Markup_types.att_default
(* get the type and default value of a declared attribute, or raise
* Validation_error if the attribute does not exist.
* If 'arbitrary_allowed', the exception Undeclared is raised instead
* of Validation_error.
*)
method attribute_names : string list
(* get the list of all declared attributes *)
method names_of_required_attributes : string list
(* get the list of all attributes that are specified as required
* attributes
*)
method add_attribute : string ->
Markup_types.att_type ->
Markup_types.att_default ->
unit
(* add an attribute declaration for an attribute with the given name,
* type, and default value. If there is more than one declaration for
* an attribute name, the first declaration counts; the other declarations
* are ignored.
*)
method validate : unit
(* checks whether this element declaration (i.e. the content model and
* all attribute declarations) is valid for the associated DTD.
* Raises mostly Validation_error if the validation fails.
*)
method write_compact_as_latin1 : Markup_types.output_stream -> unit
(* write_compact_as_latin1 os:
* Writes the <!ELEMENT ... > declaration to 'os' as Latin 1 string.
*)
end
(* ---------------------------------------------------------------------- *)
and dtd_notation : string -> Markup_types.ext_id ->
(* Creation:
* new dtd_notation a_name an_external_ID
* creates a new dtd_notation object with the given name and the given
* external ID.
*)
object
method name : string
method ext_id : Markup_types.ext_id
method write_compact_as_latin1 : Markup_types.output_stream -> unit
(* write_compact_as_latin1 os:
* Writes the <!NOTATION ... > declaration to 'os' as Latin 1 string.
*)
end
(* ---------------------------------------------------------------------- *)
and proc_instruction : string -> string ->
(* Creation:
* new proc_instruction a_target a_value
* creates a new proc_instruction object with the given target string and
* the given value string.
* Note: A processing instruction is written as <?target value?>.
*)
object
method target : string
method value : string
method write_compact_as_latin1 : Markup_types.output_stream -> unit
(* write_compact_as_latin1 os:
* Writes the <?...?> PI to 'os' as Latin 1 string.
*)
end
;;