@@ -31,7 +31,7 @@ def setup(app):
3131 app .add_directive ("clickablearea" , ClickableArea )
3232
3333 app .add_node (ClickableAreaNode , html = (visit_ca_html , depart_ca_html ),
34- xml = (substitute_visitor , substitute_departure ))
34+ xml = (visit_ca_xml , depart_ca_xml ))
3535
3636 app .add_config_value ("clickable_div_class" , "" , "html" )
3737
@@ -46,6 +46,11 @@ def setup(app):
4646</div>
4747"""
4848
49+ XML_START = """
50+ <exercise xml:id="{divid}">
51+ <statement><p>{question}</p></statement>
52+ """
53+
4954
5055class ClickableAreaNode (nodes .General , nodes .Element , RunestoneIdNode ):
5156 pass
@@ -97,6 +102,29 @@ def depart_ca_html(self, node):
97102 self .body .remove (node ["delimiter" ])
98103
99104
105+ def visit_ca_xml (self , node ):
106+ res = XML_START .format (** node ["runestone_options" ])
107+ if node ["runestone_options" ]["feedback" ]:
108+ res += "<feedback><p>{feedback}</p></feedback>\n " .format (
109+ ** node ["runestone_options" ])
110+ res += "<areas>\n "
111+ if "iscode" in node ["runestone_options" ]:
112+ # The case where iscode is not in options makes no sense and probably does not exist in
113+ # any runestone books
114+ for row in node ["runestone_options" ]["raw_source" ]:
115+ row = row .replace ("\n " , "" )
116+ row = row .replace (":click-correct:" , "<area correct='yes'>" )
117+ row = row .replace (":click-incorrect:" , "<area>" )
118+ row = row .replace (":endclick" , "</area>" )
119+ row = "<cline>" + row + "</cline>\n "
120+ res += row
121+ self .output .append (res )
122+
123+
124+ def depart_ca_xml (self , node ):
125+ self .output .append ("</areas></exercise>" )
126+
127+
100128class ClickableArea (RunestoneIdDirective ):
101129 """
102130.. clickablearea:: identifier
@@ -159,6 +187,7 @@ def run(self):
159187 source = source .replace (":endclick:" , "</span>" )
160188 source = "<pre>" + source + "</pre>"
161189 self .options ["clickcode" ] = source
190+ self .options ["raw_source" ] = self .content
162191 else :
163192 self .options ["clickcode" ] = ""
164193 clickNode = ClickableAreaNode ()
0 commit comments