RelaxNG/publiquiz.rnc
changeset 438 f4ab39840020
parent 437 ad751158803d
child 441 2b94d6c7fe0c
--- a/RelaxNG/publiquiz.rnc	jeu. oct. 13 16:26:59 2016 +0200
+++ b/RelaxNG/publiquiz.rnc	mar. oct. 25 16:09:21 2016 +0200
@@ -116,6 +116,7 @@
  | matching
  | sort
  | categories
+ | wordsearch
  | production
 
 # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ choices ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -245,6 +246,7 @@
 matching.attributes =
    success.attribute?
  & multiple.attribute?
+ & noshuffle.attribute?
  & orientation.attribute?
 
 matching.content =
@@ -304,6 +306,33 @@
    category.head,
    category.item*
 
+# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ wordsearch ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+wordsearch = element wordsearch {wordsearch.attributes, wordsearch.content }
+
+wordsearch.attributes =
+   strict.attribute ?
+ & wordlist.attribute ?
+
+wordlist.attribute = attribute wordlist { "hidden" | "right" | "left" }
+
+wordsearch.content =
+   words
+ & grid
+
+# ~~~~~~ words
+words = element words {words.content}
+words.content = words.item+
+
+# ~~~~~~ grid
+grid = element grid {grid.content}
+grid.content = line+
+
+line = element line {line.content}
+line.content = cell+
+
+cell = element cell {cell.content}
+cell.content = xsd:token {pattern = "."}
+   
 # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ production ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 production = element production { production.content }
@@ -668,6 +697,22 @@
    inlines
  | (p, help?, answer?)
 
+# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ words.item ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+words.item = element item {words.item.content, words.item.attributes }
+  
+words.item.content = inlines
+
+words.item.attributes =
+   startx
+ & starty
+ & endx
+ & endy
+
+startx = attribute startx {xsd:token {pattern = "[a-zA-Z]+"}}
+starty = attribute starty {xsd:token {pattern = "\d+"}}
+endx = attribute endx {xsd:token {pattern = "[a-zA-Z]+"}}
+endy = attribute endy {xsd:token {pattern = "\d+"}}
+
 
 # =============================================================================
 #                                 INLINE LEVEL