RelaxNG/publidoc.rnc
author iinov
dim., 13 sept. 2020 19:53:22 +0200
changeset 482 3e61d427ccf1
parent 481 bb1c88842f0c
permissions -rw-r--r--
Ajout espace
patrick@0
     1
start = publidoc
patrick@0
     2
patrick@0
     3
publidoc = element publidoc {
iinov@476
     4
               publidoc.attributes,
iinov@476
     5
               publidoc.content
iinov@476
     6
           }
patrick@0
     7
patrick@0
     8
publidoc.attributes =
iinov@476
     9
    version.attribute
patrick@0
    10
version.attribute = attribute version { "1.0" }
patrick@0
    11
patrick@0
    12
publidoc.content =
iinov@476
    13
    document
iinov@476
    14
    | glossary
iinov@476
    15
    | topic
patrick@0
    16
patrick@0
    17
# =============================================================================
iinov@476
    18
#                                    HEAD
Patrick@310
    19
# =============================================================================
Patrick@310
    20
Patrick@310
    21
# ~~~~~~~~~~~~~~~~~~~~~~~ title, shorttitle, subtitle ~~~~~~~~~~~~~~~~~~~~~~~~~
Patrick@310
    22
Patrick@310
    23
title = element title { title.content }
Patrick@310
    24
shorttitle = element shorttitle { title.content }
Patrick@310
    25
subtitle = element subtitle { title.content }
Patrick@310
    26
Patrick@310
    27
title.content = inlines
Patrick@310
    28
Patrick@310
    29
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ identifier ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Patrick@310
    30
Patrick@310
    31
# ~~~~~~ identifier
iinov@476
    32
identifier =
iinov@476
    33
    element identifier {
iinov@476
    34
        (attribute type { "ean" }, for.attribute?, xsd:token {pattern = "\d{13}"}) |
iinov@476
    35
        (attribute type { "uri" }, for.attribute?, xsd:anyURI)
iinov@476
    36
    }
Patrick@310
    37
Patrick@310
    38
# ~~~~~~ identifier.ean
iinov@476
    39
identifier.ean =
iinov@476
    40
    element identifier {
iinov@476
    41
        attribute type { "ean" }, for.attribute?, xsd:token {pattern = "\d{13}"}
iinov@476
    42
    }
Patrick@310
    43
Patrick@310
    44
# ~~~~~~ identifier.uri
iinov@476
    45
identifier.uri =
iinov@476
    46
    element identifier { attribute type { "uri" }, for.attribute?, xsd:anyURI }
Patrick@310
    47
Patrick@310
    48
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ copyright ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Patrick@310
    49
Patrick@310
    50
copyright = element copyright { copyright.content }
Patrick@310
    51
Patrick@310
    52
copyright.content = simple.inlines
Patrick@310
    53
Patrick@310
    54
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ collection ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Patrick@310
    55
Patrick@310
    56
collection = element collection { collection.content }
Patrick@310
    57
Patrick@310
    58
collection.content = simple.inlines
Patrick@310
    59
Patrick@310
    60
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ contributors ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Patrick@310
    61
Patrick@310
    62
# ~~~~~~ contributors
Patrick@310
    63
contributors = element contributors { contributors.content }
Patrick@310
    64
Patrick@310
    65
contributors.content =
iinov@476
    66
    contributor+
Patrick@310
    67
Patrick@310
    68
# ~~~~~~ contributor
Patrick@310
    69
contributor = element contributor { contributor.content }
Patrick@310
    70
Patrick@310
    71
contributor.content =
iinov@476
    72
    identifier.uri?,
iinov@476
    73
    ((firstname?, lastname) | label),
iinov@476
    74
    address?,
iinov@476
    75
    link?,
iinov@476
    76
    role+
Patrick@310
    77
Patrick@310
    78
# ~~~~~~ firstname, secondname, lastname, label
Patrick@310
    79
firstname = element firstname { firstname.content }
Patrick@310
    80
lastname = element lastname { lastname.content }
Patrick@310
    81
label = element label { label.content }
Patrick@310
    82
Patrick@310
    83
firstname.content = simple.inlines
Patrick@310
    84
lastname.content = simple.inlines
Patrick@310
    85
label.content = simple.inlines
Patrick@310
    86
Patrick@310
    87
# ~~~~~~ address
Patrick@310
    88
address = element address { address.content }
Patrick@310
    89
Patrick@310
    90
address.content = simple.inlines
Patrick@310
    91
Patrick@310
    92
# ~~~~~~ role
Patrick@310
    93
role = element role { role.content }
Patrick@310
    94
iinov@476
    95
role.content =
iinov@476
    96
    "author" | "illustrator" | "publisher" | "packager" | "translator"
Patrick@310
    97
Patrick@310
    98
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ place ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Patrick@310
    99
Patrick@310
   100
place = element place { place.content }
Patrick@310
   101
Patrick@310
   102
place.content = simple.inlines
Patrick@310
   103
Patrick@310
   104
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ source ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Patrick@310
   105
iinov@476
   106
source =
iinov@476
   107
    element source {
iinov@476
   108
        ( (attribute type { "book" }, bibliography.entry.content) |
iinov@476
   109
          (attribute type { "file" }, source.content.file) ),
iinov@476
   110
        source.content
iinov@476
   111
    }
Patrick@310
   112
Patrick@310
   113
source.content.file =
iinov@476
   114
    identifier.uri
Patrick@310
   115
source.content =
iinov@476
   116
    annotation?
Patrick@310
   117
Patrick@310
   118
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ keyword & subject ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Patrick@310
   119
Patrick@310
   120
# ~~~~~~ keywordset
Patrick@310
   121
keywordset = element keywordset { keywordset.content }
Patrick@310
   122
Patrick@310
   123
keywordset.content = keyword+
Patrick@310
   124
Patrick@310
   125
# ~~~~~~ keyword
Patrick@310
   126
keyword = element keyword { keyword.content }
Patrick@310
   127
Patrick@310
   128
keyword.content = simple.inlines
Patrick@310
   129
Patrick@310
   130
# ~~~~~~ subjectset
Patrick@310
   131
subjectset = element subjectset { subjectset.content }
Patrick@310
   132
Patrick@310
   133
subjectset.content = subject+
Patrick@310
   134
Patrick@310
   135
# ~~~~~~ subject
Patrick@310
   136
subject = element subject { subject.content }
Patrick@310
   137
Patrick@310
   138
subject.content = simple.inlines
Patrick@310
   139
Patrick@310
   140
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ index ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Patrick@310
   141
Patrick@355
   142
# ~~~~~~ indexset
Patrick@355
   143
indexset = element indexset { indexset.content }
Patrick@355
   144
Patrick@355
   145
indexset.content = head.index+
Patrick@355
   146
Patrick@310
   147
# ~~~~~~ index
Patrick@310
   148
index = element index { index.content }
Patrick@310
   149
head.index = element index { head.index.content }
Patrick@310
   150
Patrick@310
   151
index.content =
iinov@476
   152
    (index.w, index.entry?)
iinov@476
   153
    | (index.entry, (index.w | index.entry)?)
Patrick@310
   154
head.index.content =
iinov@476
   155
    index.entry, index.entry?
Patrick@310
   156
Patrick@310
   157
# ~~~~~~ index.w
Patrick@310
   158
index.w = element w { simple.inlines }
Patrick@310
   159
Patrick@310
   160
# ~~~~~~ index.entry
Patrick@310
   161
index.entry = element entry { simple.inlines }
Patrick@310
   162
Patrick@310
   163
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ abstract ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Patrick@310
   164
Patrick@310
   165
abstract = element abstract { abstract.content }
Patrick@310
   166
Patrick@310
   167
abstract.content =
iinov@476
   168
    p+
Patrick@310
   169
Patrick@310
   170
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ cover ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Patrick@310
   171
Patrick@310
   172
cover = element cover { cover.content }
Patrick@310
   173
Patrick@310
   174
cover.content =
iinov@476
   175
    cover.image
Patrick@310
   176
Patrick@310
   177
cover.image = element image { cover.image.attributes }
Patrick@310
   178
Patrick@310
   179
cover.image.attributes =
iinov@476
   180
    media.id.attribute
Patrick@310
   181
Patrick@310
   182
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ annotation ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Patrick@310
   183
Patrick@310
   184
annotation = element annotation { annotation.content }
Patrick@310
   185
Patrick@364
   186
annotation.content =
iinov@476
   187
    inlines | p+
Patrick@310
   188
Patrick@310
   189
Patrick@310
   190
# =============================================================================
iinov@476
   191
#                                    DOCUMENT
patrick@0
   192
# =============================================================================
patrick@0
   193
iinov@476
   194
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ document.head ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
patrick@90
   195
iinov@476
   196
document.head = element head { document.head.content }
patrick@90
   197
iinov@476
   198
document.head.content =
iinov@476
   199
    (title & shorttitle? & subtitle*)?
iinov@476
   200
    & identifier*
iinov@476
   201
    & copyright*
iinov@476
   202
    & collection?
iinov@476
   203
    & contributors?
iinov@476
   204
    & date?
iinov@476
   205
    & place?
iinov@476
   206
    & (source, source?)?
iinov@476
   207
    & keywordset?
iinov@476
   208
    & subjectset?
iinov@476
   209
    & indexset?
iinov@476
   210
    & abstract?
iinov@476
   211
    & cover?
iinov@476
   212
    & annotation?
patrick@90
   213
patrick@0
   214
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ document ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
patrick@0
   215
patrick@0
   216
document = element document { document.attributes, document.content }
patrick@0
   217
patrick@0
   218
document.attributes =
iinov@476
   219
    document.id.attribute?
iinov@476
   220
    & document.type.attribute?
iinov@476
   221
    & lang.attribute?
patrick@117
   222
document.id.attribute = attribute id { xsd:NMTOKEN }
patrick@142
   223
document.type.attribute = attribute type { xsd:NCName }
patrick@66
   224
lang.attribute = attribute xml:lang { xsd:language }
patrick@0
   225
patrick@0
   226
document.content =
iinov@476
   227
    document.head?,
iinov@476
   228
    (division | document.topic | glossary)+
patrick@0
   229
patrick@0
   230
iinov@476
   231
# =============================================================================
iinov@476
   232
#                                   GLOSSARY
iinov@476
   233
# =============================================================================
Coraline@419
   234
Coraline@419
   235
glossary = element glossary { glossary.attributes, glossary.content }
Coraline@419
   236
Coraline@419
   237
glossary.attributes =
iinov@476
   238
    glossary.type.attribute?
iinov@476
   239
    & lang.attribute?
iinov@476
   240
    & langto.attribute?
Coraline@419
   241
glossary.type.attribute = attribute type { xsd:NCName }
Coraline@419
   242
langto.attribute = attribute langto { xsd:language }
Coraline@419
   243
Coraline@419
   244
glossary.content =
iinov@476
   245
    glossary.entry+
Coraline@419
   246
Coraline@419
   247
patrick@0
   248
# =============================================================================
iinov@476
   249
#                                   DIVISION
patrick@0
   250
# =============================================================================
patrick@0
   251
Patrick@310
   252
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ division.head ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Patrick@310
   253
Patrick@310
   254
division.head = element head { division.head.content }
Patrick@310
   255
Patrick@310
   256
division.head.content =
iinov@476
   257
    (title & shorttitle? & subtitle*)?
iinov@476
   258
    & indexset?
iinov@476
   259
    & abstract?
iinov@476
   260
    & annotation?
Patrick@310
   261
patrick@70
   262
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ division ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
patrick@0
   263
Patrick@232
   264
division = element division { division.attributes, division.content }
Patrick@232
   265
Patrick@232
   266
division.attributes =
iinov@476
   267
    division.type.attribute?
Patrick@232
   268
division.type.attribute = attribute type { xsd:NCName }
patrick@0
   269
patrick@0
   270
division.content =
iinov@476
   271
    division.head?,
iinov@476
   272
    front?,
iinov@476
   273
    (division | document.topic)+
patrick@0
   274
Patrick@310
   275
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ front ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
patrick@90
   276
Patrick@217
   277
front = element front { front.content }
Patrick@217
   278
Patrick@217
   279
front.content =
iinov@476
   280
    section+
Patrick@217
   281
patrick@0
   282
patrick@0
   283
# =============================================================================
iinov@476
   284
#                                 COMPONENTS
patrick@0
   285
# =============================================================================
patrick@0
   286
iinov@476
   287
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ component.head ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
patrick@90
   288
iinov@476
   289
# ~~~~~~ component.head
iinov@476
   290
component.head = element head { document.head.content }
patrick@90
   291
iinov@476
   292
# ~~~~~~ document.component.head
iinov@476
   293
document.component.head = element head { document.component.head.content }
iinov@476
   294
iinov@476
   295
document.component.head.content =
iinov@476
   296
    (title & shorttitle? & subtitle*)?
iinov@476
   297
    & contributors?
iinov@476
   298
    & date?
iinov@476
   299
    & place?
iinov@476
   300
    & keywordset?
iinov@476
   301
    & subjectset?
iinov@476
   302
    & indexset?
iinov@476
   303
    & abstract?
iinov@476
   304
    & annotation?
patrick@90
   305
patrick@0
   306
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ topic ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
patrick@0
   307
patrick@0
   308
topic = element topic { topic.attributes, topic.content }
iinov@476
   309
document.topic =
iinov@476
   310
    element topic { document.topic.attributes, document.topic.content }
patrick@0
   311
patrick@0
   312
topic.attributes =
iinov@476
   313
    topic.id.attribute?
iinov@476
   314
    & topic.type.attribute?
iinov@476
   315
    & lang.attribute?
iinov@476
   316
document.topic.attributes =
iinov@476
   317
    (topic.id.attribute | xmlid.attribute)?
iinov@476
   318
    & topic.type.attribute?
iinov@476
   319
    & lang.attribute?
iinov@476
   320
topic.id.attribute = attribute id { xsd:NMTOKEN }
iinov@476
   321
topic.type.attribute = attribute type { xsd:NCName }
Patrick@191
   322
xmlid.attribute = attribute xml:id { xsd:ID }
patrick@0
   323
patrick@0
   324
topic.content =
iinov@476
   325
    component.head?,
iinov@476
   326
    header?,
iinov@476
   327
    ((section+, bibliography?) | bibliography),
iinov@476
   328
    footer?
iinov@476
   329
document.topic.content =
iinov@476
   330
    document.component.head?,
iinov@476
   331
    header?,
iinov@476
   332
    ((section+, bibliography?) | bibliography),
iinov@476
   333
    footer?
patrick@0
   334
patrick@0
   335
patrick@0
   336
# =============================================================================
patrick@20
   337
#                                 SECTION LEVEL
patrick@0
   338
# =============================================================================
patrick@0
   339
Patrick@310
   340
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ section.head ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Patrick@310
   341
Patrick@310
   342
section.head = element head { section.head.content }
Patrick@310
   343
Patrick@310
   344
section.head.content =
iinov@476
   345
    (title & shorttitle? & subtitle*)?
iinov@476
   346
    & keywordset?
iinov@476
   347
    & subjectset?
iinov@476
   348
    & indexset?
iinov@476
   349
    & abstract?
iinov@476
   350
    & audio*
iinov@476
   351
    & annotation?
Patrick@310
   352
Patrick@137
   353
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ header ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Patrick@137
   354
Patrick@137
   355
header = element header { header.content }
Patrick@137
   356
Patrick@137
   357
header.content =
iinov@476
   358
    block+
Patrick@137
   359
patrick@20
   360
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ section ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
patrick@0
   361
patrick@58
   362
section = element section { section.attributes, section.content }
patrick@58
   363
patrick@58
   364
section.attributes =
iinov@476
   365
    xmlid.attribute?
iinov@476
   366
    & section.type.attribute?
iinov@476
   367
    & lang.attribute?
iinov@476
   368
    & for.attribute?
patrick@58
   369
section.type.attribute = attribute type { xsd:NCName }
patrick@166
   370
for.attribute = attribute for { xsd:NCName }
patrick@0
   371
patrick@0
   372
section.content =
iinov@476
   373
    section.head?,
iinov@476
   374
    (section+ | block+)
patrick@0
   375
Patrick@189
   376
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ bibliography ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Patrick@189
   377
Patrick@189
   378
bibliography = element bibliography { bibliography.content }
Patrick@189
   379
Patrick@189
   380
bibliography.content =
iinov@476
   381
    bibliography.entry+
Patrick@189
   382
Patrick@137
   383
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ footer ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Patrick@137
   384
Patrick@137
   385
footer = element footer { footer.content }
Patrick@137
   386
Patrick@137
   387
footer.content =
iinov@476
   388
    block+
Patrick@137
   389
Coraline@419
   390
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ glossary.entry ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Patrick@446
   391
Coraline@419
   392
# ~~~~~~ glossary.entry
iinov@476
   393
glossary.entry=
iinov@476
   394
    element entry { glossary.entry.attributes, glossary.entry.content }
Coraline@419
   395
Coraline@419
   396
glossary.entry.attributes =
iinov@476
   397
    xmlid.attribute?
Coraline@419
   398
Coraline@419
   399
glossary.entry.content =
iinov@476
   400
    mainterm,
iinov@476
   401
    alt-terms?,
iinov@476
   402
    media?,
iinov@476
   403
    meanings+,
iinov@476
   404
    seealso*
Coraline@419
   405
Coraline@419
   406
# ~~~~~~ mainterm
Coraline@419
   407
mainterm = element mainterm { mainterm.content }
Patrick@446
   408
Coraline@419
   409
mainterm.content = simple.inlines
patrick@0
   410
Coraline@425
   411
# ~~~~~~ alt-terms
Coraline@425
   412
alt-terms = element alt-terms { alt-terms.content }
Patrick@446
   413
Patrick@446
   414
alt-terms.content =
Patrick@446
   415
    alt-term+
Coraline@425
   416
Coraline@425
   417
# ~~~~~~ alt-term
Coraline@426
   418
alt-term = element alt-term { alt-term.attributes, alt-term.content }
Patrick@446
   419
Coraline@425
   420
alt-term.content = inlines
Coraline@425
   421
Patrick@446
   422
alt-term.attributes =
Patrick@446
   423
    alt-term.type.attribute?
Coraline@426
   424
alt-term.type.attribute = attribute type { xsd:NCName }
Coraline@426
   425
Patrick@446
   426
patrick@0
   427
# =============================================================================
patrick@20
   428
#                                 BLOCK LEVEL
patrick@0
   429
# =============================================================================
patrick@0
   430
Patrick@310
   431
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ block.head ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
patrick@9
   432
patrick@90
   433
block.head = element head { block.head.content }
patrick@90
   434
patrick@90
   435
block.head.content =
iinov@476
   436
    (title & shorttitle? & subtitle*)?
iinov@476
   437
    & indexset?
iinov@476
   438
    & annotation?
patrick@90
   439
Patrick@310
   440
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ block ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Patrick@310
   441
Patrick@313
   442
block = (p | \list | blockquote | speech | table | table.cals | media)
Patrick@310
   443
patrick@42
   444
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ p ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
patrick@0
   445
patrick@20
   446
p = element p { p.content }
patrick@0
   447
patrick@20
   448
p.content =
iinov@476
   449
    inlines
patrick@0
   450
patrick@17
   451
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ list ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
patrick@9
   452
patrick@9
   453
# ~~~~~~ list
iinov@476
   454
\list =
iinov@476
   455
    element list {
iinov@476
   456
        block.head?,
iinov@481
   457
        ( (list.type.attribute?, item, item+) |
iinov@476
   458
          (attribute type {"glossary"}, item.glossary+) ) }
patrick@9
   459
iinov@482
   460
list.type.attribute = attribute type { "ordered" | "alpha" | "Alpha" }
iinov@481
   461
patrick@9
   462
# ~~~~~~ item
patrick@9
   463
item = element item { item.content }
patrick@9
   464
patrick@30
   465
item.content =
iinov@476
   466
    inlines
iinov@476
   467
    | block+
patrick@9
   468
Coraline@419
   469
# ~~~~~~ item.glossary
Coraline@419
   470
item.glossary = element item { item.glossary.content }
patrick@9
   471
Coraline@419
   472
item.glossary.content =
iinov@476
   473
    label,
iinov@476
   474
    block+
patrick@9
   475
patrick@44
   476
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ blockquote ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
patrick@44
   477
patrick@44
   478
# ~~~~~~ blockquote
Patrick@306
   479
blockquote = element blockquote { blockquote.attributes, blockquote.content }
patrick@44
   480
Patrick@306
   481
blockquote.attributes =
iinov@476
   482
    blockquote.type.attribute?
Patrick@306
   483
blockquote.type.attribute = attribute type { xsd:NCName }
Patrick@310
   484
patrick@44
   485
blockquote.content =
iinov@476
   486
    block.head?,
iinov@476
   487
    (p | speech | \list)+,
iinov@476
   488
    attribution?
patrick@44
   489
patrick@44
   490
# ~~~~~~ attribution
patrick@72
   491
attribution = element attribution { attribution.content }
patrick@44
   492
iinov@476
   493
attribution.content =
iinov@476
   494
    mixed {
iinov@476
   495
        sup* & number* & date* & name* & foreign* & acronym* & term* & literal*
iinov@476
   496
        & highlight* & emphasis* & mentioned* & note* & warning* }
patrick@44
   497
Patrick@313
   498
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ speech ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Patrick@313
   499
Patrick@313
   500
# ~~~~~~ speech
Patrick@313
   501
speech = element speech { speech.content }
Patrick@313
   502
Patrick@313
   503
speech.content =
iinov@476
   504
    speaker?,
iinov@476
   505
    stage?,
iinov@476
   506
    (p | blockquote)+
Patrick@313
   507
Patrick@313
   508
# ~~~~~~ speaker
Patrick@313
   509
speaker = element speaker { speaker.content }
Patrick@313
   510
Patrick@313
   511
speaker.content = inlines
Patrick@313
   512
patrick@248
   513
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ table ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
patrick@17
   514
patrick@73
   515
# ~~~~~~ table
patrick@248
   516
table = element table { table.attributes, table.content }
patrick@248
   517
patrick@248
   518
table.attributes =
iinov@476
   519
    table.type.attribute?
patrick@248
   520
table.type.attribute = attribute type { xsd:NCName }
patrick@17
   521
patrick@17
   522
table.content =
iinov@476
   523
    block.head?,
iinov@476
   524
    ((thead?, tbody+) | tr+),
iinov@476
   525
    table.caption?
patrick@17
   526
patrick@248
   527
# ~~~~~~ thead, tbody
patrick@248
   528
thead = element thead { thead.content }
patrick@248
   529
tbody = element tbody { tbody.content }
patrick@17
   530
patrick@248
   531
thead.content =
iinov@476
   532
    tr+
patrick@248
   533
tbody.content =
iinov@476
   534
    tr+
patrick@17
   535
patrick@248
   536
# ~~~~~~ tr
patrick@248
   537
tr = element tr { tr.attributes, tr.content }
patrick@248
   538
patrick@248
   539
tr.attributes =
iinov@476
   540
    align.attribute?
iinov@476
   541
    & valign.attribute?
iinov@476
   542
    & cell.type.attribute?
patrick@17
   543
align.attribute = attribute align { "left"  |  "right"  | "center" | "justify" }
patrick@22
   544
valign.attribute = attribute valign { "top" | "middle" | "bottom" }
Tiphanie@309
   545
cell.type.attribute = attribute type { xsd:NCName }
patrick@75
   546
patrick@248
   547
tr.content =
iinov@476
   548
    (td | th)+
patrick@17
   549
patrick@248
   550
# ~~~~~~ td, th
patrick@248
   551
td = element td { td.attributes, td.content }
patrick@248
   552
th = element th { td.attributes, td.content }
patrick@17
   553
patrick@248
   554
td.attributes =
iinov@476
   555
    align.attribute?
iinov@476
   556
    & valign.attribute?
iinov@476
   557
    & colspan.attribute?
iinov@476
   558
    & rowspan.attribute?
iinov@476
   559
    & cell.type.attribute?
patrick@248
   560
colspan.attribute = attribute colspan { xsd:positiveInteger }
patrick@248
   561
rowspan.attribute = attribute rowspan { xsd:positiveInteger }
patrick@17
   562
patrick@248
   563
td.content =
iinov@476
   564
    inlines
iinov@476
   565
    | (p | media)+
patrick@17
   566
patrick@109
   567
# ~~~~~~ table.caption
patrick@109
   568
table.caption = element caption { caption.content }
patrick@17
   569
patrick@17
   570
caption.content =
iinov@476
   571
    inlines
iinov@476
   572
    | (p | speech | \list | blockquote)+
patrick@17
   573
patrick@248
   574
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ table.cals ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
patrick@248
   575
patrick@248
   576
# ~~~~~~ table.cals
patrick@248
   577
table.cals = element table { table.attributes, table.cals.content }
patrick@248
   578
patrick@248
   579
table.cals.content =
iinov@476
   580
    block.head?,
iinov@476
   581
    tgroup+,
iinov@476
   582
    table.caption?
patrick@248
   583
patrick@248
   584
# ~~~~~~ tgroup
patrick@248
   585
tgroup = element tgroup { tgroup.attributes, tgroup.content }
patrick@248
   586
patrick@248
   587
tgroup.attributes =
iinov@476
   588
    cols.attribute
patrick@248
   589
cols.attribute = attribute cols { xsd:positiveInteger }
patrick@248
   590
patrick@248
   591
tgroup.content =
iinov@476
   592
    thead.cals?,
iinov@476
   593
    tbody.cals
patrick@248
   594
patrick@248
   595
# ~~~~~~ thead, tbody
patrick@248
   596
thead.cals = element thead { thead.cals.content }
patrick@248
   597
tbody.cals = element tbody { tbody.cals.content }
patrick@248
   598
patrick@248
   599
thead.cals.content =
iinov@476
   600
    row+
patrick@248
   601
tbody.cals.content =
iinov@476
   602
    row+
patrick@248
   603
patrick@248
   604
# ~~~~~~ row
patrick@248
   605
row = element row { row.attributes, row.content }
patrick@248
   606
patrick@248
   607
row.attributes =
iinov@476
   608
    valign.attribute?
patrick@248
   609
patrick@248
   610
row.content =
iinov@476
   611
    table.cals.entry+
patrick@248
   612
patrick@248
   613
# ~~~~~~ table.cals.entry
iinov@476
   614
table.cals.entry =
iinov@476
   615
    element entry { table.cals.entry.attributes, table.cals.entry.content }
patrick@248
   616
patrick@248
   617
table.cals.entry.attributes =
iinov@476
   618
    align.attribute?
iinov@476
   619
    & valign.attribute?
patrick@248
   620
patrick@248
   621
table.cals.entry.content =
iinov@476
   622
    inlines
iinov@476
   623
    | (p | media)+
patrick@248
   624
patrick@35
   625
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ media ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
patrick@0
   626
patrick@2
   627
# ~~~~~~ media
patrick@245
   628
media = element media { media.attributes, media.content }
patrick@245
   629
patrick@245
   630
media.attributes =
iinov@476
   631
    xmlid.attribute?
iinov@476
   632
    & media.type.attribute?
patrick@245
   633
media.type.attribute = attribute type { xsd:NCName }
patrick@0
   634
patrick@0
   635
media.content =
iinov@476
   636
    block.head?,
iinov@476
   637
    (media.image | audio | video)+,
iinov@476
   638
    media.caption?,
iinov@476
   639
    link?
patrick@0
   640
patrick@2
   641
# ~~~~~~ image
Patrick@288
   642
image = element image { image.attributes }
Patrick@288
   643
media.image = element image { image.attributes, media.image.content }
patrick@0
   644
patrick@0
   645
image.attributes =
iinov@476
   646
    media.id.attribute
iinov@476
   647
    & image.type.attribute?
iinov@476
   648
    & image.zoom.attribute?
iinov@476
   649
    & alt.attribute?
patrick@17
   650
media.id.attribute = attribute id { xsd:NMTOKEN }
iinov@476
   651
image.type.attribute =
iinov@476
   652
    attribute type { "cover" | "thumbnail" | "icon" | "animation" }
Coraline@407
   653
image.zoom.attribute = attribute zoom {"true" | "false"}
Patrick@312
   654
alt.attribute = attribute alt { text }
patrick@0
   655
Patrick@288
   656
media.image.content =
iinov@476
   657
    copyright?,
iinov@476
   658
    hotspot*
patrick@0
   659
patrick@45
   660
# ~~~~~~ audio
patrick@45
   661
audio = element audio { audio.attributes }
patrick@43
   662
patrick@45
   663
audio.attributes =
iinov@476
   664
    media.id.attribute
iinov@476
   665
    & audio.type?
iinov@476
   666
audio.type =
iinov@476
   667
    attribute type { "music" | "voice" | "en" | "fr" | "background" | "smil" }
patrick@43
   668
patrick@119
   669
# ~~~~~~ video
patrick@119
   670
video = element video { video.attributes }
patrick@119
   671
patrick@119
   672
video.attributes =
iinov@476
   673
    media.id.attribute
patrick@119
   674
Coraline@433
   675
# ~~~~~~ media.caption
Coraline@433
   676
media.caption = element caption { caption.attributes, caption.content }
Coraline@433
   677
Coraline@433
   678
caption.attributes =
iinov@476
   679
    x.attribute?
iinov@476
   680
    & y.attribute?
Coraline@433
   681
patrick@122
   682
# ~~~~~~ hotspot
patrick@122
   683
hotspot = element hotspot { hotspot.attributes, hotspot.content }
patrick@122
   684
patrick@122
   685
hotspot.attributes =
iinov@476
   686
    x.attribute
iinov@476
   687
    & y.attribute
iinov@476
   688
    & w.attribute
iinov@476
   689
    & h.attribute?
iinov@476
   690
    & hotspot.display.attribute?
iinov@476
   691
    & hotspot.type.attribute?
iinov@476
   692
    & xmlid.attribute?
Patrick@173
   693
x.attribute = attribute x { xsd:token {pattern = "\d{1,2}(\.\d{1,2})?%"} }
Patrick@173
   694
y.attribute = attribute y { xsd:token {pattern = "\d{1,2}(\.\d{1,2})?%"} }
patrick@182
   695
w.attribute = attribute w { xsd:token {pattern = "\d{1,2}(\.\d{1,2})?%"} }
patrick@182
   696
h.attribute = attribute h { xsd:token {pattern = "\d{1,2}(\.\d{1,2})?%"} }
Patrick@236
   697
hotspot.display.attribute = attribute display { "normal" | "visible" | "pulse" }
Patrick@237
   698
hotspot.type.attribute = attribute type { xsd:NCName }
Patrick@310
   699
Patrick@191
   700
hotspot.content =
iinov@476
   701
    ((link | p+ | image | audio | video), (spot, scenario?)?)
iinov@476
   702
    | (spot, scenario?)
iinov@476
   703
    | empty
Patrick@310
   704
Patrick@191
   705
# ~~~~~~ spot
Patrick@191
   706
spot = element spot { spot.attributes, spot.content }
Patrick@191
   707
Patrick@191
   708
spot.attributes =
iinov@476
   709
    dx.attribute?
iinov@476
   710
    & dy.attribute?
iinov@476
   711
    & dw.attribute?
iinov@476
   712
    & dh.attribute?
patrick@188
   713
dx.attribute = attribute dx { xsd:token {pattern = "-?\d{1,2}(\.\d{1,2})?%"} }
patrick@188
   714
dy.attribute = attribute dy { xsd:token {pattern = "-?\d{1,2}(\.\d{1,2})?%"} }
Patrick@191
   715
dw.attribute = attribute dw { xsd:token {pattern = "-?\d{1,2}(\.\d{1,2})?%"} }
Patrick@191
   716
dh.attribute = attribute dh { xsd:token {pattern = "-?\d{1,2}(\.\d{1,2})?%"} }
Patrick@191
   717
Patrick@191
   718
spot.content =
iinov@476
   719
    ((p+ | image), audio?)
iinov@476
   720
    | audio
iinov@476
   721
    | video
Patrick@191
   722
Patrick@191
   723
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ scenario ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Patrick@191
   724
Patrick@191
   725
# ~~~~~~ scenario
Patrick@191
   726
scenario = element scenario { scenario.content }
Patrick@191
   727
Patrick@191
   728
scenario.content =
iinov@476
   729
    init*,
iinov@476
   730
    onclick*
Patrick@191
   731
Patrick@191
   732
# ~~~~~~ init
Patrick@191
   733
init = element init { init.attributes }
Patrick@191
   734
Patrick@191
   735
init.attributes =
iinov@476
   736
    init.action.attribute
iinov@476
   737
    & target.attribute?
Patrick@191
   738
init.action.attribute = attribute action { "hide" }
Patrick@191
   739
target.attribute = attribute target { "hotspot" | "spot" }
Patrick@191
   740
Patrick@191
   741
# ~~~~~~ onclick
Patrick@191
   742
onclick = element onclick { onclick.attributes }
Patrick@191
   743
Patrick@191
   744
onclick.attributes =
iinov@476
   745
    onclick.action.attribute
iinov@476
   746
    & target.attribute?
Patrick@191
   747
onclick.action.attribute = attribute action { "show" }
Patrick@191
   748
Patrick@397
   749
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ bibliography.entry ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Patrick@189
   750
Patrick@189
   751
# ~~~~~~ bibliography.entry
Patrick@189
   752
bibliography.entry = element entry { bibliography.entry.content }
Patrick@189
   753
Patrick@189
   754
bibliography.entry.content =
iinov@476
   755
    identifier.ean?
iinov@476
   756
    & title
iinov@476
   757
    & subtitle?
iinov@476
   758
    & copyright?
iinov@476
   759
    & collection?
iinov@476
   760
    & contributors?
iinov@476
   761
    & date?
iinov@476
   762
    & place?
iinov@476
   763
    & folio?
iinov@476
   764
    & pages?
Patrick@189
   765
Patrick@189
   766
# ~~~~~~ folio
Patrick@189
   767
folio = element folio { folio.content }
Patrick@189
   768
Patrick@189
   769
folio.content = xsd:positiveInteger | xsd:token {pattern = "[DLXVI]+"}
Patrick@189
   770
Patrick@189
   771
# ~~~~~~ pages
Patrick@189
   772
pages = element pages { pages.content }
Patrick@189
   773
Patrick@189
   774
pages.content = xsd:positiveInteger
Patrick@189
   775
Coraline@419
   776
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ meanings ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Coraline@419
   777
Coraline@419
   778
# ~~~~~~ meanings
Coraline@419
   779
meanings = element meanings { meanings.attributes, meanings.content }
Coraline@419
   780
Coraline@419
   781
meanings.attributes =
iinov@476
   782
    gramcode.attribute?
Coraline@419
   783
gramcode.attribute = attribute gramcode { xsd:NMTOKEN }
Coraline@419
   784
Coraline@419
   785
meanings.content =
iinov@476
   786
    meaning+
Coraline@419
   787
Coraline@419
   788
# ~~~~~~ meaning
Coraline@419
   789
meaning = element meaning { meaning.attributes, meaning.content }
Coraline@419
   790
Coraline@419
   791
meaning.attributes =
iinov@476
   792
    meaning.domain.attribute?
iinov@476
   793
    & langlevel.attribute?
Coraline@419
   794
meaning.domain.attribute = attribute domain { xsd:NMTOKEN }
Coraline@419
   795
langlevel.attribute = attribute langlevel { xsd:NMTOKEN }
Coraline@419
   796
Coraline@419
   797
meaning.content =
iinov@476
   798
    ((definition, example*, synonym*, antonym*, translation*)
Coraline@419
   799
    | (definition?, example*, synonym*, antonym*, translation+)
Coraline@419
   800
    | (definition?, example*, synonym+, antonym*, translation*)
Coraline@419
   801
    | (definition?, example*, synonym*, antonym+, translation*)),
iinov@476
   802
    dictum*
Coraline@419
   803
Coraline@419
   804
# ~~~~~~ definition
Coraline@419
   805
definition = element definition { inlines }
Coraline@419
   806
Coraline@419
   807
# ~~~~~~ synonym, antonym
Coraline@419
   808
synonym = element synonym { simple.inlines }
Coraline@419
   809
antonym = element antonym { simple.inlines }
Coraline@419
   810
Coraline@419
   811
# ~~~~~~ translation
Coraline@419
   812
translation = element translation { simple.inlines }
Coraline@419
   813
Coraline@419
   814
# ~~~~~~ dictum
Coraline@423
   815
dictum = element dictum { dictum.content }
Coraline@423
   816
dictum.content =  p+
Coraline@419
   817
Coraline@419
   818
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ seealso ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Coraline@419
   819
Coraline@419
   820
seealso = element seealso { seealso.attributes }
Coraline@419
   821
Coraline@419
   822
seealso.attributes =
iinov@476
   823
    gloss.ref.attribute
Coraline@419
   824
patrick@0
   825
patrick@0
   826
# =============================================================================
patrick@20
   827
#                                 INLINE LEVEL
patrick@0
   828
# =============================================================================
patrick@0
   829
patrick@0
   830
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ inlines ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
patrick@0
   831
iinov@476
   832
simple.inlines =
iinov@476
   833
    mixed {
iinov@476
   834
        sup* & sub*
iinov@476
   835
        & var*
iinov@476
   836
        & number*
iinov@476
   837
        & acronym*
iinov@476
   838
        & warning*
iinov@476
   839
    }
Patrick@288
   840
iinov@476
   841
inlines =
iinov@476
   842
    mixed {
iinov@476
   843
        sup* & sub*
iinov@476
   844
        & var*
iinov@476
   845
        & number*
iinov@476
   846
        & acronym*
iinov@476
   847
        & warning*
Patrick@293
   848
iinov@476
   849
        & highlight*
iinov@476
   850
        & emphasis*
iinov@476
   851
        & mentioned*
iinov@476
   852
        & literal*
iinov@476
   853
        & term*
iinov@476
   854
        & example*
iinov@476
   855
        & stage*
iinov@476
   856
        & name*
iinov@476
   857
        & foreign*
iinov@476
   858
        & date*
iinov@476
   859
        & math*
iinov@476
   860
        & quote*
iinov@476
   861
        & initial*
iinov@476
   862
        & note*
iinov@476
   863
        & link*
iinov@476
   864
        & anchor*
iinov@476
   865
        & index*
iinov@476
   866
        & gloss*
iinov@476
   867
        & image*
iinov@476
   868
        & audio*
iinov@476
   869
        & smil*
Patrick@446
   870
iinov@476
   871
        & nowrap*
iinov@476
   872
    }
patrick@0
   873
patrick@42
   874
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ sub, sup, var ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
patrick@0
   875
patrick@252
   876
sup = element sup { mixed { var* & warning* } }
patrick@0
   877
patrick@252
   878
sub = element sub { mixed { var* & warning* } }
patrick@42
   879
Patrick@225
   880
var = element var { mixed { warning* } }
patrick@42
   881
patrick@90
   882
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ number ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
patrick@90
   883
iinov@476
   884
number =
iinov@476
   885
    element number {
iinov@476
   886
        ( attribute type {"roman"}, number.attributes, number.roman.content ) |
iinov@476
   887
        ( number.attributes, number.content)
iinov@476
   888
    }
patrick@90
   889
patrick@90
   890
number.attributes =
iinov@476
   891
    number.value.attribute?
patrick@90
   892
number.value.attribute = attribute value { xsd:integer | xsd:decimal }
patrick@90
   893
Patrick@212
   894
number.content = mixed { sup* & warning* }
patrick@246
   895
number.roman.content = xsd:token {pattern = "[MCLXVI]+"}
patrick@90
   896
Patrick@350
   897
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ acronym ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Patrick@350
   898
Patrick@350
   899
acronym = element acronym { acronym.content }
Patrick@350
   900
Patrick@350
   901
acronym.content = mixed { sup* & warning* }
Patrick@350
   902
Patrick@350
   903
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ highlight ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Patrick@350
   904
Patrick@350
   905
highlight = element highlight { highlight.content }
Patrick@350
   906
Patrick@350
   907
highlight.content = inlines
Patrick@350
   908
Patrick@350
   909
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ emphasis ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Patrick@350
   910
Patrick@350
   911
emphasis = element emphasis { emphasis.content }
Patrick@350
   912
Patrick@350
   913
emphasis.content = inlines
Patrick@350
   914
Patrick@350
   915
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mentioned ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Patrick@350
   916
Patrick@350
   917
mentioned = element mentioned { mentioned.content }
Patrick@350
   918
Patrick@350
   919
mentioned.content = inlines
Patrick@350
   920
Patrick@350
   921
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ literal ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Patrick@350
   922
Patrick@350
   923
literal = element literal { literal.content }
Patrick@350
   924
Patrick@350
   925
literal.content = inlines
Patrick@350
   926
Patrick@350
   927
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ term ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Patrick@350
   928
Patrick@350
   929
term = element term { term.content }
Patrick@350
   930
Patrick@350
   931
term.content = mixed { sup* & warning* }
Patrick@350
   932
Coraline@419
   933
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ example ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Coraline@419
   934
Coraline@419
   935
example = element example { example.content }
Patrick@446
   936
Coraline@419
   937
example.content = inlines
Coraline@419
   938
Patrick@350
   939
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ stage ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Patrick@350
   940
Patrick@350
   941
stage = element stage { stage.content }
Patrick@350
   942
Patrick@350
   943
stage.content = inlines
Patrick@350
   944
Patrick@350
   945
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ name ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Patrick@350
   946
Patrick@350
   947
name = element name { name.attributes, name.content }
Patrick@350
   948
Patrick@350
   949
name.attributes =
iinov@476
   950
    name.of.attribute?
iinov@476
   951
name.of.attribute =
iinov@476
   952
    attribute of {
iinov@476
   953
        "person" | "company" | "book" | "newspaper" | "party" | "movie"
iinov@476
   954
        | "painting" }
Patrick@350
   955
Patrick@350
   956
name.content = mixed { sup* & number* & acronym* & warning* }
Patrick@350
   957
Patrick@350
   958
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ foreign ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Patrick@350
   959
Patrick@350
   960
foreign = element foreign { foreign.attributes, foreign.content }
Patrick@350
   961
Patrick@350
   962
foreign.attributes =
iinov@476
   963
    lang.attribute?
Patrick@350
   964
Patrick@350
   965
foreign.content = inlines
Patrick@350
   966
Patrick@350
   967
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ date ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Patrick@350
   968
Patrick@350
   969
date = element date { date.attributes, date.content }
Patrick@350
   970
Patrick@350
   971
date.attributes =
iinov@476
   972
    date.value.attribute
iinov@476
   973
    & date.of.attribute?
Patrick@350
   974
date.value.attribute = attribute value { xsd:date | xsd:gYearMonth | xsd:gYear }
Patrick@350
   975
date.of.attribute = attribute of { "birth" | "death" }
Patrick@350
   976
Patrick@350
   977
date.content = mixed { sup* & number* & warning* }
Patrick@350
   978
patrick@42
   979
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ math ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
patrick@42
   980
Patrick@274
   981
# ~~~~~~ math
Patrick@274
   982
math = element math { math.attributes, math.content }
patrick@42
   983
patrick@42
   984
math.attributes =
iinov@476
   985
    xmlid.attribute?
iinov@476
   986
    & math.display.attribute?
iinov@476
   987
    & math.type.attribute?
iinov@476
   988
math.display.attribute =
iinov@476
   989
    attribute display { "wide" | "numbered" | "box"  | "numbered-box" }
Patrick@435
   990
math.type.attribute = attribute type { xsd:NCName }
patrick@42
   991
Patrick@274
   992
math.content =
iinov@476
   993
    mixed { sup* & sub* & var* & warning* }
iinov@476
   994
    | (preambule?, latex)
Patrick@274
   995
Patrick@274
   996
# ~~~~~~ latex
Patrick@274
   997
latex = element latex { latex.attributes, latex.content }
Patrick@274
   998
Patrick@274
   999
latex.attributes =
iinov@476
  1000
    plain.attritute?
Patrick@274
  1001
plain.attritute = attribute plain { xsd:boolean }
Patrick@274
  1002
Patrick@274
  1003
latex.content = text
patrick@0
  1004
iinov@460
  1005
# ~~~~~~ preambule
iinov@460
  1006
preambule = element preambule { preambule.content }
iinov@460
  1007
iinov@460
  1008
preambule.content =
iinov@460
  1009
    newcommand+
iinov@460
  1010
iinov@460
  1011
# ~~~~~~ newcommand
iinov@460
  1012
newcommand = element newcommand { newcommand.attributes, newcommand.content }
iinov@460
  1013
iinov@460
  1014
newcommand.attributes =
iinov@460
  1015
    newcommand.name.attribute
iinov@460
  1016
newcommand.name.attribute = attribute name { xsd:NMTOKEN }
iinov@460
  1017
iinov@460
  1018
newcommand.content = text
iinov@460
  1019
patrick@36
  1020
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ quote ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
patrick@5
  1021
patrick@5
  1022
quote = element quote { quote.content }
patrick@5
  1023
patrick@131
  1024
quote.content =
iinov@476
  1025
    (phrase, attribution) | inlines
patrick@131
  1026
patrick@131
  1027
phrase = element phrase { phrase.content }
patrick@131
  1028
patrick@131
  1029
phrase.content = inlines
patrick@5
  1030
Patrick@351
  1031
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ initial ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
patrick@105
  1032
Patrick@351
  1033
initial = element initial { initial.content }
patrick@105
  1034
Patrick@351
  1035
initial.content =
iinov@476
  1036
    initial.c,
iinov@476
  1037
    initial.w?
patrick@105
  1038
Patrick@351
  1039
initial.c = element c { text }
Patrick@351
  1040
initial.w = element w { inlines }
Patrick@205
  1041
Patrick@288
  1042
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ note ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Patrick@288
  1043
Patrick@288
  1044
note = element note { note.attributes, note.content }
Patrick@288
  1045
Patrick@288
  1046
note.attributes =
iinov@476
  1047
    note.label.attribute?
Patrick@288
  1048
note.label.attribute = attribute label { text }
Patrick@288
  1049
Patrick@288
  1050
note.content =
iinov@476
  1051
    (note.w?, block+)
iinov@476
  1052
    | inlines
Patrick@288
  1053
Patrick@288
  1054
note.w = element w { inlines }
Patrick@288
  1055
Patrick@288
  1056
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ link ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Patrick@288
  1057
Patrick@288
  1058
link = element link { link.attributes, link.content }
Patrick@288
  1059
Patrick@288
  1060
link.attributes =
iinov@476
  1061
    (uri.attribute | idref.attribute)
Patrick@288
  1062
uri.attribute = attribute uri { xsd:anyURI }
Patrick@288
  1063
idref.attribute = attribute idref { xsd:IDREF }
Patrick@288
  1064
Patrick@288
  1065
link.content = simple.inlines
Patrick@288
  1066
Patrick@288
  1067
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ anchor ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Patrick@288
  1068
Patrick@288
  1069
anchor = element anchor { anchor.attributes, anchor.content }
Patrick@288
  1070
Patrick@288
  1071
anchor.attributes =
iinov@476
  1072
    anchor.id.attribute
Patrick@288
  1073
anchor.id.attribute = attribute xml:id { xsd:ID }
Patrick@288
  1074
Patrick@288
  1075
anchor.content = simple.inlines
Patrick@288
  1076
Coraline@419
  1077
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ gloss ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Coraline@419
  1078
Coraline@419
  1079
gloss = element gloss { gloss.attributes, gloss.content }
Coraline@419
  1080
Coraline@419
  1081
gloss.attributes =
iinov@476
  1082
    gloss.ref.attribute
Coraline@419
  1083
gloss.ref.attribute = attribute ref { xsd:NCName }
Coraline@419
  1084
Coraline@419
  1085
gloss.content = simple.inlines
Coraline@419
  1086
Patrick@351
  1087
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ smil ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Patrick@351
  1088
Patrick@351
  1089
smil = element smil { smil.attributes, smil.content }
Patrick@351
  1090
Patrick@351
  1091
smil.attributes =
iinov@476
  1092
    audio.attribute?
iinov@476
  1093
    & begin.attribute?
iinov@476
  1094
    & end.attribute?
Patrick@351
  1095
audio.attribute = attribute audio { xsd:anyURI }
Patrick@351
  1096
begin.attribute = attribute begin { xsd:decimal }
Patrick@351
  1097
end.attribute = attribute end { xsd:decimal }
Patrick@351
  1098
Patrick@351
  1099
smil.content = inlines
Patrick@351
  1100
Coraline@436
  1101
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ nowrap ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Coraline@436
  1102
Coraline@436
  1103
nowrap = element nowrap { nowrap.content }
Coraline@436
  1104
Coraline@436
  1105
nowrap.content = inlines
Coraline@436
  1106
Patrick@205
  1107
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ warning ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Patrick@205
  1108
Patrick@285
  1109
warning = element warning { warning.attributes, warning.content }
Patrick@285
  1110
Patrick@285
  1111
warning.attributes =
iinov@476
  1112
    warning.type.attribute?
Patrick@285
  1113
warning.type.attribute = attribute type { xsd:NCName }
Patrick@205
  1114
Patrick@231
  1115
warning.content = inlines