From e2c919ec58d9df919b002bf25fdebc76602871bd Mon Sep 17 00:00:00 2001
From: srosse <none@none>
Date: Mon, 27 Mar 2017 10:48:48 +0200
Subject: [PATCH] OO-2610: allow no correct answers, better update of score
 label after changes, better read only mode like FIB

---
 .../HottextAssessmentItemBuilder.java         | 57 +++++++++++--------
 .../interactions/ChoiceScoreController.java   | 38 +++++++------
 .../interactions/HottextEditorController.java |  2 +-
 .../tinymce/plugins/olatqti/plugin.js         | 13 +++--
 .../tinymce/plugins/olatqti/plugin.min.js     |  2 +-
 5 files changed, 66 insertions(+), 46 deletions(-)

diff --git a/src/main/java/org/olat/ims/qti21/model/xml/interactions/HottextAssessmentItemBuilder.java b/src/main/java/org/olat/ims/qti21/model/xml/interactions/HottextAssessmentItemBuilder.java
index 78ef6766af7..e9e1c254165 100644
--- a/src/main/java/org/olat/ims/qti21/model/xml/interactions/HottextAssessmentItemBuilder.java
+++ b/src/main/java/org/olat/ims/qti21/model/xml/interactions/HottextAssessmentItemBuilder.java
@@ -52,6 +52,7 @@ import uk.ac.ed.ph.jqtiplus.node.expression.general.BaseValue;
 import uk.ac.ed.ph.jqtiplus.node.expression.general.Correct;
 import uk.ac.ed.ph.jqtiplus.node.expression.general.MapResponse;
 import uk.ac.ed.ph.jqtiplus.node.expression.general.Variable;
+import uk.ac.ed.ph.jqtiplus.node.expression.operator.IsNull;
 import uk.ac.ed.ph.jqtiplus.node.expression.operator.Match;
 import uk.ac.ed.ph.jqtiplus.node.expression.operator.Sum;
 import uk.ac.ed.ph.jqtiplus.node.item.AssessmentItem;
@@ -313,18 +314,7 @@ public class HottextAssessmentItemBuilder extends ChoiceAssessmentItemBuilder {
 		rule.setResponseIf(responseIf);
 		
 		{// match the correct answers
-			Match match = new Match(responseIf);
-			responseIf.getExpressions().add(match);
-			
-			Variable scoreVar = new Variable(match);
-			ComplexReferenceIdentifier choiceResponseIdentifier
-				= ComplexReferenceIdentifier.parseString(hottextInteraction.getResponseIdentifier().toString());
-			scoreVar.setIdentifier(choiceResponseIdentifier);
-			match.getExpressions().add(scoreVar);
-			
-			Correct correct = new Correct(match);
-			correct.setIdentifier(choiceResponseIdentifier);
-			match.getExpressions().add(correct);
+			matchCorrectAnswers(responseIf);
 		}
 	
 		{//outcome score
@@ -402,18 +392,7 @@ public class HottextAssessmentItemBuilder extends ChoiceAssessmentItemBuilder {
 		rule.setResponseIf(responseIf);
 		
 		{// match the correct answers
-			Match match = new Match(responseIf);
-			responseIf.getExpressions().add(match);
-			
-			Variable scoreVar = new Variable(match);
-			ComplexReferenceIdentifier choiceResponseIdentifier
-				= ComplexReferenceIdentifier.parseString(hottextInteraction.getResponseIdentifier().toString());
-			scoreVar.setIdentifier(choiceResponseIdentifier);
-			match.getExpressions().add(scoreVar);
-			
-			Correct correct = new Correct(match);
-			correct.setIdentifier(choiceResponseIdentifier);
-			match.getExpressions().add(correct);
+			matchCorrectAnswers(responseIf);
 		}
 	
 		{//outcome score
@@ -475,4 +454,34 @@ public class HottextAssessmentItemBuilder extends ChoiceAssessmentItemBuilder {
 			incorrectOutcomeValue.setExpression(incorrectValue);
 		}
 	}
+	
+	/**
+	 * Match the correct answer or, if there isn't not a single correct answer,
+	 * match null.
+	 * 
+	 * @param responseIf
+	 */
+	private void matchCorrectAnswers(ResponseIf responseIf) {
+		if(correctAnswers.isEmpty()) {
+			IsNull isNull = new IsNull(responseIf);
+			responseIf.getExpressions().add(isNull);
+			
+			Variable variable = new Variable(isNull);
+			variable.setIdentifier(ComplexReferenceIdentifier.parseString(responseIdentifier.toString()));
+			isNull.getExpressions().add(variable);
+		} else {
+			Match match = new Match(responseIf);
+			responseIf.getExpressions().add(match);
+			
+			Variable scoreVar = new Variable(match);
+			ComplexReferenceIdentifier choiceResponseIdentifier
+				= ComplexReferenceIdentifier.parseString(hottextInteraction.getResponseIdentifier().toString());
+			scoreVar.setIdentifier(choiceResponseIdentifier);
+			match.getExpressions().add(scoreVar);
+			
+			Correct correct = new Correct(match);
+			correct.setIdentifier(choiceResponseIdentifier);
+			match.getExpressions().add(correct);
+		}
+	}
 }
diff --git a/src/main/java/org/olat/ims/qti21/ui/editor/interactions/ChoiceScoreController.java b/src/main/java/org/olat/ims/qti21/ui/editor/interactions/ChoiceScoreController.java
index 3fe0236c741..ec557e064ed 100644
--- a/src/main/java/org/olat/ims/qti21/ui/editor/interactions/ChoiceScoreController.java
+++ b/src/main/java/org/olat/ims/qti21/ui/editor/interactions/ChoiceScoreController.java
@@ -137,6 +137,8 @@ public class ChoiceScoreController extends AssessmentItemRefEditorController imp
 				ChoiceWrapper wrapper = getChoiceWrapper(choice);
 				if(wrapper == null) {
 					wrappers.add(createChoiceWrapper(choice));
+				} else {
+					wrapper.setChoice(choice);
 				}
 			}
 			
@@ -227,27 +229,14 @@ public class ChoiceScoreController extends AssessmentItemRefEditorController imp
 	
 	public final class ChoiceWrapper {
 		
-		private final String summary;
-		private final Choice choice;
+		private String summary;
+		private Choice choice;
 		private final TextElement pointsEl;
 		
 		public ChoiceWrapper(Choice choice, TextElement pointsEl) {
-			this.choice = choice;
+			setChoice(choice);
 			this.pointsEl = pointsEl;
 			pointsEl.setUserObject(this);
-			if(choice instanceof SimpleChoice) {
-				String answer = new AssessmentHtmlBuilder().flowStaticString(((SimpleChoice)choice).getFlowStatics());
-				answer = FilterFactory.getHtmlTagAndDescapingFilter().filter(answer);
-				answer = answer.trim();
-				summary = Formatter.truncate(answer, 128);
-			} else if(choice instanceof Hottext) {
-				String answer = new AssessmentHtmlBuilder().inlineStaticString(((Hottext)choice).getInlineStatics());
-				answer = FilterFactory.getHtmlTagAndDescapingFilter().filter(answer);
-				answer = answer.trim();
-				summary = Formatter.truncate(answer, 128);
-			} else {
-				summary = "";
-			}
 		}
 		
 		public boolean isCorrect() {
@@ -265,5 +254,22 @@ public class ChoiceScoreController extends AssessmentItemRefEditorController imp
 		public Choice getChoice() {
 			return choice;
 		}
+		
+		public void setChoice(Choice choice) {
+			this.choice = choice;
+			if(choice instanceof SimpleChoice) {
+				String answer = new AssessmentHtmlBuilder().flowStaticString(((SimpleChoice)choice).getFlowStatics());
+				answer = FilterFactory.getHtmlTagAndDescapingFilter().filter(answer);
+				answer = answer.trim();
+				summary = Formatter.truncate(answer, 128);
+			} else if(choice instanceof Hottext) {
+				String answer = new AssessmentHtmlBuilder().inlineStaticString(((Hottext)choice).getInlineStatics());
+				answer = FilterFactory.getHtmlTagAndDescapingFilter().filter(answer);
+				answer = answer.trim();
+				summary = Formatter.truncate(answer, 128);
+			} else {
+				summary = "";
+			}
+		}
 	}
 }
diff --git a/src/main/java/org/olat/ims/qti21/ui/editor/interactions/HottextEditorController.java b/src/main/java/org/olat/ims/qti21/ui/editor/interactions/HottextEditorController.java
index 0876d749036..b6dbc4730c5 100644
--- a/src/main/java/org/olat/ims/qti21/ui/editor/interactions/HottextEditorController.java
+++ b/src/main/java/org/olat/ims/qti21/ui/editor/interactions/HottextEditorController.java
@@ -87,10 +87,10 @@ public class HottextEditorController extends FormBasicController {
 		textEl = uifactory.addRichTextElementForQTI21("desc", "form.imd.descr", question, 16, -1, itemContainer,
 				formLayout, ureq.getUserSession(),  getWindowControl());
 		textEl.addActionListener(FormEvent.ONCLICK);
-		textEl.setEnabled(!restrictedEdit);
 		RichTextConfiguration richTextConfig = textEl.getEditorConfiguration();
 		richTextConfig.enableQTITools(false, false, true);
 		richTextConfig.setAdditionalConfiguration(new CorrectAnswersConfiguration());
+		richTextConfig.setReadOnly(restrictedEdit);
 		
 		// Submit Button
 		FormLayoutContainer buttonsContainer = FormLayoutContainer.createButtonLayout("buttons", getTranslator());
diff --git a/src/main/webapp/static/js/tinymce4/tinymce/plugins/olatqti/plugin.js b/src/main/webapp/static/js/tinymce4/tinymce/plugins/olatqti/plugin.js
index dc6ad98cc6f..37ede60955a 100644
--- a/src/main/webapp/static/js/tinymce4/tinymce/plugins/olatqti/plugin.js
+++ b/src/main/webapp/static/js/tinymce4/tinymce/plugins/olatqti/plugin.js
@@ -14,7 +14,7 @@
 				author : 'frentix GmbH',
 				authorurl : 'http://www.frentix.com',
 				infourl : 'http://www.frentix.com',
-				version : '1.1.0'
+				version : '1.1.1'
 			};
 		},
 
@@ -237,10 +237,12 @@
 					"contenteditable": "false"
 				});
 
-	            var inputHolder = new tinymce.html.Node('input', 1);
+				var readonly = ed.getParam("readonly");
+	            var editable = readonly == "1" ? "false" : "true";
 	            
+	            var inputHolder = new tinymce.html.Node('input', 1);
 	            inputHolder.attr({
-	            	"contenteditable": "true",
+	            	"contenteditable": editable,
 	            	"name" : "hottext",
 	            	"value": identifier,
 	            	"type" : "checkbox"
@@ -248,10 +250,13 @@
 	            if(correct) {
 	            	inputHolder.attr({ "checked": "checked" });
 	            }
+	            if(editable == "false") {
+	            	inputHolder.attr({ "disabled": "disabled" });
+	            }
 	            placeholder.append(inputHolder);
 
 	            var contentholder = new tinymce.html.Node('span', 1);
-	            contentholder.attr({ "contenteditable": "true" });
+	            contentholder.attr({ "contenteditable": editable });
 	            var textNode = new tinymce.html.Node('#text', 3);
 	            textNode.raw = true;
 	            textNode.value = content;
diff --git a/src/main/webapp/static/js/tinymce4/tinymce/plugins/olatqti/plugin.min.js b/src/main/webapp/static/js/tinymce4/tinymce/plugins/olatqti/plugin.min.js
index 1c07622ab6d..4cd157c23f5 100644
--- a/src/main/webapp/static/js/tinymce4/tinymce/plugins/olatqti/plugin.min.js
+++ b/src/main/webapp/static/js/tinymce4/tinymce/plugins/olatqti/plugin.min.js
@@ -1 +1 @@
-(function(){tinymce.create("org.olat.ims.qti21.ui.editor",{getInfo:function(){return{longname:"OpenOLATQTI",author:"frentix GmbH",authorurl:"http://www.frentix.com",infourl:"http://www.frentix.com",version:"1.1.0"}},createControl:function(b,a){return null},init:function(e,d){var c=e.$,s=e.selection;var t,q;var g;var k,l;function o(){if(t){return t}var u=o_getMainWin();if(u){t=jQuery(document).ooTranslator().getTranslator(u.o_info.locale,"org.olat.ims.qti21.ui.editor")}else{t={translate:function(v){return v}}}return t}function b(){if(q){return q}var u=o_getMainWin();if(u){q=jQuery(document).ooTranslator().getTranslator(u.o_info.locale,"org.olat.core")}else{q={translate:function(v){return v}}}return q}function i(u){h(u,"string")}function n(u){h(u,"float")}function h(x,A){var v=false;var y=null;var C;if(typeof k!="undefined"){C=jQuery(k).attr("data-qti-response-identifier")}else{var u=1;y=e.selection.getContent({format:"text"});tinymce.each(e.dom.select("img[data-qti]"),function(E){var D=jQuery(E).attr("data-qti-response-identifier");if(D.lastIndexOf("RESPONSE_",0)==0){var F=parseInt(D.substring(9,D.length));if(F>u){u=F}}});var C="RESPONSE_"+(u+1);var z=f(C,"textentryinteraction",A);var w=new tinymce.html.Serializer().serialize(z);e.insertContent(w);v=true}var B=e.getParam("ffxhrevent");o_ffXHREvent(B.formNam,B.dispIdField,B.dispId,B.eventIdField,2,false,false,false,"cmd","gapentry","responseIdentifier",C,"newEntry",v,"selectedText",y,"gapType",A)}function m(){function u(){return Math.floor((1+Math.random())*65536).toString(16).substring(1)}return u()+u()+u()+u()+u()+u()+u()}function a(y){var C;if(typeof l!="undefined"){C=jQuery(l).data("data-identifier")}else{var u=1;var v=e.selection.getContent({format:"text"});var B=false;if(v==null||v.length==0){v="text";B=true}var z="ht"+m();var A=r(z,v,false,"hottext");var w=new tinymce.html.Serializer().serialize(A);e.insertContent(w);if(B){var x=e.dom.select("span[data-qti-identifier="+z+"] span[contenteditable=true]");e.selection.select(x[0],true)}jQuery("span.hottext[data-qti-identifier='"+z+"'] input",e.getBody()).each(function(D,E){p(E)})}}function p(u){jQuery(u).click(function(){var v=e.getParam("ffxhrevent");var w=jQuery(u).parent("span.hottext").data("qti-identifier");o_ffXHRNFEvent(v.formNam,v.dispIdField,v.dispId,v.eventIdField,2,"cmd","hottext","identifier",w,"correct",u.checked);e.setDirty(true)})}e.addButton("olatqtifibtext",{title:o().translate("new.fib"),icon:"gaptext",stateSelector:["img[data-qti-gap-type=string]","span[data-qti-gap-type=string]"],onclick:i});e.addButton("olatqtifibnumerical",{title:o().translate("new.fib")+" Numerical",icon:"gapnumerical",stateSelector:["img[data-qti-gap-type=float]","span[data-qti-gap-type=float]"],onclick:n});e.addButton("olatqtihottext",{title:o().translate("new.hottext"),icon:"hottext",stateSelector:["span[data-qti=hottext]"],onclick:a});e.addButton("editgap",{title:"edit",icon:"edit",onclick:h});e.addMenuItem("olatqtifibtext",{text:o().translate("new.fib"),icon:"gapnumerical",stateSelector:["img[data-qti-gap-type=string]","span[data-qti-gap-type=string]"],onclick:n});e.addMenuItem("olatqtifibnumerical",{text:o().translate("new.fib.numerical")+" Numerical",icon:"gaptext",stateSelector:["img[data-qti-gap-type=float]","span[data-qti-gap-type=float]"],onclick:i});e.addMenuItem("olatqtihottext",{text:o().translate("new.hottext"),icon:"hottext",stateSelector:["span[data-qti=hottext]"],onclick:a});e.on("NodeChange",function(u){if(k&&k.id!=u.element.src){k=undefined}if(l&&l.id!=u.element.src){l=undefined}if(e.dom.is(u.element,"img[data-qti]")){k=u.element}else{if(jQuery(u.element).parent("span.hottext").size()>0){l=u.element}}});function f(w,v,u){var x=new tinymce.html.Node("img",1);x.attr({width:"32",height:"16",src:tinymce.Env.transparentSrc,"data-qti":v,"data-qti-response-identifier":w,"data-qti-gap-type":u,"data-mce-placeholder":"","data-mce-resize":"false","data-textentryinteraction":"empty","class":"mce-shim "+v});return x}function r(x,y,w,u){var A=new tinymce.html.Node("span",1);A.attr({"data-qti":u,"data-qti-identifier":x,"class":u,contenteditable:"false"});var B=new tinymce.html.Node("input",1);B.attr({contenteditable:"true",name:"hottext",value:x,type:"checkbox"});if(w){B.attr({checked:"checked"})}A.append(B);var v=new tinymce.html.Node("span",1);v.attr({contenteditable:"true"});var z=new tinymce.html.Node("#text",3);z.raw=true;z.value=y;v.append(z);A.append(v);return A}function j(v){var u="";var x=new tinymce.dom.TreeWalker(v);var w;while((w=x.next())){if(w.type==3){if(u.length>0){u+=" "}u+=w.value}else{if(w.nodeType==3){if(u.length>0){u+=" "}u+=w.nodeValue}}}return u}e.on("init",function(){if(e.settings.content_css!==false){e.dom.loadCSS(d+"/css/content.css")}jQuery("img.textentryinteraction",e.getBody()).each(function(u,v){var w=v;jQuery(w).click(function(){var y=e.getParam("ffxhrevent");var x=jQuery(w).attr("data-qti-response-identifier");o_ffXHREvent(y.formNam,y.dispIdField,y.dispId,y.eventIdField,2,false,false,false,"cmd","gapentry","responseIdentifier",x)})});jQuery("span.hottext input",e.getBody()).each(function(u,v){p(v)})});e.on("preInit",function(){e.parser.addNodeFilter("textentryinteraction,hottext",function(u){var x=u.length,v,C,y;while(x--){v=u[x];if(v.name=="textentryinteraction"){var E=v.attr("responseidentifier");var D=v.attr("openolattype");if(typeof D==="undefined"){D="string"}var C=f(E,"textentryinteraction",D);v.replace(C)}else{if(v.name=="hottext"){var B=v.attr("identifier");var w=e.getParam("correctHottexts");var A=jQuery.inArray(B,w)>=0;var z=j(v);var C=r(B,z,A,"hottext","hottext");v.replace(C)}}}})});e.on("PreProcess",function(u){tinymce.each(e.dom.select("img[data-qti=textentryinteraction]"),function(w){var v=jQuery(w).attr("data-qti-response-identifier");var x=e.dom.create("textEntryInteraction",{responseIdentifier:v});e.dom.replace(x,w,false)});tinymce.each(e.dom.select("span[data-qti=hottext]"),function(w){var v=jQuery(w).data("qti-identifier");var x=e.dom.create("hottext",{identifier:v});var y=jQuery('span[contenteditable="true"]',w).html();x.textContent=y;e.dom.replace(x,w,false)})})}});tinymce.PluginManager.add("olatqti",org.olat.ims.qti21.ui.editor)})();
\ No newline at end of file
+(function(){tinymce.create("org.olat.ims.qti21.ui.editor",{getInfo:function(){return{longname:"OpenOLATQTI",author:"frentix GmbH",authorurl:"http://www.frentix.com",infourl:"http://www.frentix.com",version:"1.1.1"}},createControl:function(b,a){return null},init:function(e,d){var c=e.$,s=e.selection;var t,q;var g;var k,l;function o(){if(t){return t}var u=o_getMainWin();if(u){t=jQuery(document).ooTranslator().getTranslator(u.o_info.locale,"org.olat.ims.qti21.ui.editor")}else{t={translate:function(v){return v}}}return t}function b(){if(q){return q}var u=o_getMainWin();if(u){q=jQuery(document).ooTranslator().getTranslator(u.o_info.locale,"org.olat.core")}else{q={translate:function(v){return v}}}return q}function i(u){h(u,"string")}function n(u){h(u,"float")}function h(x,A){var v=false;var y=null;var C;if(typeof k!="undefined"){C=jQuery(k).attr("data-qti-response-identifier")}else{var u=1;y=e.selection.getContent({format:"text"});tinymce.each(e.dom.select("img[data-qti]"),function(E){var D=jQuery(E).attr("data-qti-response-identifier");if(D.lastIndexOf("RESPONSE_",0)==0){var F=parseInt(D.substring(9,D.length));if(F>u){u=F}}});var C="RESPONSE_"+(u+1);var z=f(C,"textentryinteraction",A);var w=new tinymce.html.Serializer().serialize(z);e.insertContent(w);v=true}var B=e.getParam("ffxhrevent");o_ffXHREvent(B.formNam,B.dispIdField,B.dispId,B.eventIdField,2,false,false,false,"cmd","gapentry","responseIdentifier",C,"newEntry",v,"selectedText",y,"gapType",A)}function m(){function u(){return Math.floor((1+Math.random())*65536).toString(16).substring(1)}return u()+u()+u()+u()+u()+u()+u()}function a(y){var C;if(typeof l!="undefined"){C=jQuery(l).data("data-identifier")}else{var u=1;var v=e.selection.getContent({format:"text"});var B=false;if(v==null||v.length==0){v="text";B=true}var z="ht"+m();var A=r(z,v,false,"hottext");var w=new tinymce.html.Serializer().serialize(A);e.insertContent(w);if(B){var x=e.dom.select("span[data-qti-identifier="+z+"] span[contenteditable=true]");e.selection.select(x[0],true)}jQuery("span.hottext[data-qti-identifier='"+z+"'] input",e.getBody()).each(function(D,E){p(E)})}}function p(u){jQuery(u).click(function(){var v=e.getParam("ffxhrevent");var w=jQuery(u).parent("span.hottext").data("qti-identifier");o_ffXHRNFEvent(v.formNam,v.dispIdField,v.dispId,v.eventIdField,2,"cmd","hottext","identifier",w,"correct",u.checked);e.setDirty(true)})}e.addButton("olatqtifibtext",{title:o().translate("new.fib"),icon:"gaptext",stateSelector:["img[data-qti-gap-type=string]","span[data-qti-gap-type=string]"],onclick:i});e.addButton("olatqtifibnumerical",{title:o().translate("new.fib")+" Numerical",icon:"gapnumerical",stateSelector:["img[data-qti-gap-type=float]","span[data-qti-gap-type=float]"],onclick:n});e.addButton("olatqtihottext",{title:o().translate("new.hottext"),icon:"hottext",stateSelector:["span[data-qti=hottext]"],onclick:a});e.addButton("editgap",{title:"edit",icon:"edit",onclick:h});e.addMenuItem("olatqtifibtext",{text:o().translate("new.fib"),icon:"gapnumerical",stateSelector:["img[data-qti-gap-type=string]","span[data-qti-gap-type=string]"],onclick:n});e.addMenuItem("olatqtifibnumerical",{text:o().translate("new.fib.numerical")+" Numerical",icon:"gaptext",stateSelector:["img[data-qti-gap-type=float]","span[data-qti-gap-type=float]"],onclick:i});e.addMenuItem("olatqtihottext",{text:o().translate("new.hottext"),icon:"hottext",stateSelector:["span[data-qti=hottext]"],onclick:a});e.on("NodeChange",function(u){if(k&&k.id!=u.element.src){k=undefined}if(l&&l.id!=u.element.src){l=undefined}if(e.dom.is(u.element,"img[data-qti]")){k=u.element}else{if(jQuery(u.element).parent("span.hottext").size()>0){l=u.element}}});function f(w,v,u){var x=new tinymce.html.Node("img",1);x.attr({width:"32",height:"16",src:tinymce.Env.transparentSrc,"data-qti":v,"data-qti-response-identifier":w,"data-qti-gap-type":u,"data-mce-placeholder":"","data-mce-resize":"false","data-textentryinteraction":"empty","class":"mce-shim "+v});return x}function r(y,x,z,C){var B=new tinymce.html.Node("span",1);B.attr({"data-qti":C,"data-qti-identifier":y,"class":C,contenteditable:"false"});var w=e.getParam("readonly");var u=w=="1"?"false":"true";var D=new tinymce.html.Node("input",1);D.attr({contenteditable:u,name:"hottext",value:y,type:"checkbox"});if(z){D.attr({checked:"checked"})}if(u=="false"){D.attr({disabled:"disabled"})}B.append(D);var A=new tinymce.html.Node("span",1);A.attr({contenteditable:u});var v=new tinymce.html.Node("#text",3);v.raw=true;v.value=x;A.append(v);B.append(A);return B}function j(v){var u="";var x=new tinymce.dom.TreeWalker(v);var w;while((w=x.next())){if(w.type==3){if(u.length>0){u+=" "}u+=w.value}else{if(w.nodeType==3){if(u.length>0){u+=" "}u+=w.nodeValue}}}return u}e.on("init",function(){if(e.settings.content_css!==false){e.dom.loadCSS(d+"/css/content.css")}jQuery("img.textentryinteraction",e.getBody()).each(function(u,v){var w=v;jQuery(w).click(function(){var y=e.getParam("ffxhrevent");var x=jQuery(w).attr("data-qti-response-identifier");o_ffXHREvent(y.formNam,y.dispIdField,y.dispId,y.eventIdField,2,false,false,false,"cmd","gapentry","responseIdentifier",x)})});jQuery("span.hottext input",e.getBody()).each(function(u,v){p(v)})});e.on("preInit",function(){e.parser.addNodeFilter("textentryinteraction,hottext",function(u){var x=u.length,v,C,y;while(x--){v=u[x];if(v.name=="textentryinteraction"){var E=v.attr("responseidentifier");var D=v.attr("openolattype");if(typeof D==="undefined"){D="string"}var C=f(E,"textentryinteraction",D);v.replace(C)}else{if(v.name=="hottext"){var B=v.attr("identifier");var w=e.getParam("correctHottexts");var A=jQuery.inArray(B,w)>=0;var z=j(v);var C=r(B,z,A,"hottext","hottext");v.replace(C)}}}})});e.on("PreProcess",function(u){tinymce.each(e.dom.select("img[data-qti=textentryinteraction]"),function(w){var v=jQuery(w).attr("data-qti-response-identifier");var x=e.dom.create("textEntryInteraction",{responseIdentifier:v});e.dom.replace(x,w,false)});tinymce.each(e.dom.select("span[data-qti=hottext]"),function(w){var v=jQuery(w).data("qti-identifier");var x=e.dom.create("hottext",{identifier:v});var y=jQuery('span[contenteditable="true"]',w).html();x.textContent=y;e.dom.replace(x,w,false)})})}});tinymce.PluginManager.add("olatqti",org.olat.ims.qti21.ui.editor)})();
\ No newline at end of file
-- 
GitLab