# author    : Hans Hagen, PRAGMA-ADE, Hasselt NL
# copyright : PRAGMA ADE / ConTeXt Development Team
# license   : see context related readme files
# comment   : companion to context.mkiv

# todo: check all content (not yet ok but a bit boring job)
# todo: add attributes
# todo: we need more | and less ,
#
# validate with "rnv -c export-example.rng"

namespace m = "http://www.w3.org/1998/Math/MathML"

start = e_document

# Because users can typeset anything the content is somewhat
# unpredictable so this is just an indication of what to expect.

c_everything =
    text
  | c_inline
  | e_verbatimblock
  | e_lines
  | e_itemgroup
  | e_table
  | e_tabulate
  | e_register
  | e_list
  | e_section
  | e_float
  | e_formula
  | e_combination

c_inline =
    text
  | e_ignore
  | e_metadata
  | e_construct
  | e_highlight
  | e_verbatim
  | e_description
  | e_descriptionsymbol
  | e_sorting
  | e_synonym
  | e_image
  | e_mpgraphic
  | e_math
  | e_sub
  | e_sup
  | e_subsup
  | e_link
  | e_margintext
  | e_margintextblock

# We pass some relevant information via attributes. The detail attribute
# is common and provides information about the class or environment used.

a_detail = attribute detail {
    text
}

# The document element is the root of all.

e_document = element document {
    c_everything *
}

e_ignore = element ignore {
    c_everything *
}

e_metadata = element metadata {
    element metavariable {
        attribute name { text } ?
      , text
    } *
}

e_section = element section {
    a_detail ?
  | (
        element sectiontitle {
            c_inline *
        }
      , element sectionnumber {
            c_inline *
        } *
      , element sectioncontent {
            c_everything *
        }
    )
}

e_paragraph = element paragraph {
    c_inline *
}

e_p = element p {
    c_inline *
}

e_break = element break {
    empty
}

e_construct = element construct {
    c_everything*
}

e_highlight = element highlight {
    c_inline*
}

e_itemgroup = element itemgroup {
    element item {
        element itemtag {
            c_inline *
        }
    } ,
    element itemcontent {
        c_everything *
    }
}

e_combination = element combination {
    element combinationpair {
        element combinationcontent {
            inline*
        } ,
        element combinationcaption {
            inline*
        }
    }
}

e_description = element description {
    element descriptiontag     {
        c_inline*
    } ,
    element descriptioncontent {
        c_inline*
    } ,
    element descriptionsymbol  {
        c_inline*
    }
}

e_descriptionsymbol = element descriptionsymbol {
    c_inline*
}

e_verbatimblock = element verbatimblock {
    element verbatimlines {
        element verbatimline {
            text
        } *
    } *
}

e_verbatim = element verbatim {
    text
}

e_lines = element lines {
    element line {
        text
    } *
}

e_synonym = element synonym {
    text
}

e_sorting = element sorting {
    text
}

e_register = element register {
    element registersection {
        element registertag {
            text
        } ?
        ,
        element registerentries {
            (
                element registerentry {
                    text
                } |
                element registersee  {
                    text
                }
            ),
            (
                element registerpages {
                    element registerpage {
                        text
                    } *
                } |
                element registerpage {
                    text
                } |
                element registerpagerange {
                    element registerpage {
                        text
                    } ,
                    element registerpage {
                        text
                    }
                }
            )
        } ?
    } *
}

e_table = element table {
    element tablerow {
        element tablecell {
            c_inline *
        } *
    } *
}

e_tabulate = element tabulate {
    element tabulaterow {
        element tabulatecell {
            c_inline *
        } *
    } *
}

e_list = element list {
    element listitem {
        element listtag {
            text
        } ? ,
        element listcontent {
            text
        } ? ,
        element listdata {
            text
        } ? ,
        element listpage {
            text
        } ?
    }
}

e_delimitedblock = element delimitedblock {
    c_everything*
}

e_delimited = element delimited {
    c_inline
}

e_subsentence = element subsentence {
    c_inline
}

e_float = element float {
    element floatcaption {
        element floatlabel {
            text
        } ,
        element floatnumber {
            text
        } ,
        element floattext {
            c_inline
        }
    } ,
    element floatcontent {
        c_inline
    }
}

e_image = element image {
    empty
}

e_mpgraphic = element mpgraphic {
    empty
}

e_formula = element formula {
    element subformula {
        element formulacontent {
            e_math*
        }
    } ,
    element formulaset {
        element formulacontent {
            e_math*
        }
    } ,
    element formulacaption {
        element formulalabel {
            text
        } ,
        element formulanumber {
            text
        }
    } ,
    element formulacontent {
        e_math*
    }
}

e_link = element link {
    c_inline
}

e_margintextblock = element margintextblock {
    c_inline
}

e_margintext = element margintext {
    c_inline
}

e_quantity = element quantity {
    element unit {
        text
    } ,
    element number {
        text
    }
}

e_unit = element unit {
    text |
    e_math
}

e_sub = element sub {
    c_inline
}

e_sup = element sup {
    c_inline
}

e_subsup = element subsup {
    c_inline,
    c_inline
}

# There are enough mathml dtd's out there so this is just a
# simplified placeholder.

e_math_basics =
    element m:mn | m:mi | m:mo | m:ms | m:merror | m:mtext {
        text
    } |
    element m:mrow | m:msub | m:msup | m:msqrt | m:mfenced | m:maction {
        e_math_basics *
    } |
    element m:msubsup | m:munder | m:mover | m:mfrac | m:mroot {
        e_math_basics,
        e_math_basics
    } |
    element m:munderover {
        e_math_basics,
        e_math_basics,
        e_math_basics
    } |
    element m:mtable {
        element m:mtr {
            element m:mtd {
                e_math_basics *
            } *
        } *
    }

e_math = element m:math {
    e_math_basics *
}
