diff --git a/src/main/java/org/olat/core/commons/fullWebApp/_content/fullwebapplayout.html b/src/main/java/org/olat/core/commons/fullWebApp/_content/fullwebapplayout.html index 3abf9afe4e0d151701c12864f98019eb084d6dbe..97a8b1147707d18d13aec237e2903020f2f09072 100644 --- a/src/main/java/org/olat/core/commons/fullWebApp/_content/fullwebapplayout.html +++ b/src/main/java/org/olat/core/commons/fullWebApp/_content/fullwebapplayout.html @@ -49,6 +49,8 @@ function o_start(){ } /* ]]> */ </script> +## <script src='http://localhost/cdnjax/MathJax.js?config=MML_HTMLorMML'></script> +<script src='//cdn.mathjax.org/mathjax/2.1-latest/MathJax.js?config=MML_HTMLorMML'></script> <script type="text/javascript" src='$r.staticLink("js/jsMath/easy/load.js")'></script> ## jQuery libraries <!--[if lt IE 9]> diff --git a/src/main/java/org/olat/ims/qti21/manager/QTI21ServiceImpl.java b/src/main/java/org/olat/ims/qti21/manager/QTI21ServiceImpl.java index 49a2c08a89b54bcf7103ff38199c7f047c3b7074..e79ec405ebd25a66c6ecde85e160c34f2c9815f2 100644 --- a/src/main/java/org/olat/ims/qti21/manager/QTI21ServiceImpl.java +++ b/src/main/java/org/olat/ims/qti21/manager/QTI21ServiceImpl.java @@ -314,7 +314,6 @@ public class QTI21ServiceImpl implements QTI21Service { Document stateDocument = TestSessionStateXmlMarshaller.marshal(testSessionState); File sessionFile = getTestSessionStateFile(candidateEvent); storeStateDocument(stateDocument, sessionFile); - System.out.println("Store state: " + sessionFile); } private File getTestSessionStateFile(CandidateEvent candidateEvent) { diff --git a/src/main/java/org/olat/ims/qti21/restapi/MathWebService.java b/src/main/java/org/olat/ims/qti21/restapi/MathWebService.java new file mode 100644 index 0000000000000000000000000000000000000000..667ec82039349f24989a03dcf005251a20405135 --- /dev/null +++ b/src/main/java/org/olat/ims/qti21/restapi/MathWebService.java @@ -0,0 +1,38 @@ +package org.olat.ims.qti21.restapi; + +import java.util.Date; +import java.util.Map; + +import javax.ws.rs.FormParam; +import javax.ws.rs.POST; +import javax.ws.rs.Path; +import javax.ws.rs.Produces; +import javax.ws.rs.core.CacheControl; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; + +import uk.ac.ed.ph.jqtiplus.xmlutils.xslt.SimpleXsltStylesheetCache; +import uk.ac.ed.ph.jqtiplus.xmlutils.xslt.XsltStylesheetCache; +import uk.ac.ed.ph.qtiworks.mathassess.XsltStylesheetCacheAdapter; +import uk.ac.ed.ph.qtiworks.mathassess.glue.AsciiMathHelper; + +@Path("math") +public class MathWebService { + + private static final CacheControl cc = new CacheControl(); + static { + cc.setMaxAge(-1); + } + + @POST + @Path("verifyAsciiMath") + @Produces({MediaType.APPLICATION_JSON}) + public Response verifyAsciiMath(@FormParam("input") String asciiMathInput) { + + XsltStylesheetCache stylesheetCache = new SimpleXsltStylesheetCache(); + AsciiMathHelper asciiMathHelper = new AsciiMathHelper(new XsltStylesheetCacheAdapter(stylesheetCache)); + Map<String, String> upConvertedAsciiMathInput = asciiMathHelper.upConvertAsciiMathInput(asciiMathInput); + return Response.ok(upConvertedAsciiMathInput).lastModified(new Date()).cacheControl(cc).build(); + } + +} diff --git a/src/main/java/org/olat/ims/qti21/ui/components/AbstractAssessmentComponent.java b/src/main/java/org/olat/ims/qti21/ui/components/AbstractAssessmentComponent.java index d0ea7c293be01e2f8ecfb6745e59b5e716620aa2..0c61fbc53ef8aa4b6453303b9877757da94be0a5 100644 --- a/src/main/java/org/olat/ims/qti21/ui/components/AbstractAssessmentComponent.java +++ b/src/main/java/org/olat/ims/qti21/ui/components/AbstractAssessmentComponent.java @@ -80,6 +80,9 @@ public abstract class AbstractAssessmentComponent extends AbstractComponent { JSAndCSSAdder jsa = vr.getJsAndCSSAdder(); jsa.addRequiredStaticJsFile("assessment/rendering/javascript/QtiWorksRendering.js"); + jsa.addRequiredStaticJsFile("assessment/rendering/javascript/AsciiMathInputController.js"); + jsa.addRequiredStaticJsFile("assessment/rendering/javascript/UpConversionAjaxController.js"); + jsa.addRequiredStaticJsFile("js/jquery/maphilight/jquery.maphilight.js"); jsa.addRequiredStaticJsFile("js/jquery/ui/jquery-ui-1.11.4.custom.dnd.min.js"); } diff --git a/src/main/java/org/olat/ims/qti21/ui/components/AssessmentItemComponentRenderer.java b/src/main/java/org/olat/ims/qti21/ui/components/AssessmentItemComponentRenderer.java index 7aa2c08635cff367eec9879a619ed454d18cea21..1b18d4cb7fe0a8ef896b2d7b64e58c51d6d1abca 100644 --- a/src/main/java/org/olat/ims/qti21/ui/components/AssessmentItemComponentRenderer.java +++ b/src/main/java/org/olat/ims/qti21/ui/components/AssessmentItemComponentRenderer.java @@ -35,6 +35,7 @@ import org.olat.core.gui.render.StringOutput; import org.olat.core.gui.render.URLBuilder; import org.olat.core.gui.translator.Translator; import org.olat.core.logging.OLATRuntimeException; +import org.olat.core.util.WebappHelper; import org.olat.ims.qti21.UserTestSession; import org.olat.ims.qti21.model.CandidateItemEventType; import org.olat.ims.qti21.model.jpa.CandidateEvent; @@ -71,6 +72,17 @@ public class AssessmentItemComponentRenderer extends DefaultComponentRenderer { ItemSessionController itemSessionController = cmp.getItemSessionController(); AssessmentItemFormItem item = cmp.getQtiItem(); + String restapi = WebappHelper.getServletContextPath() + "/restapi/math/verifyAsciiMath"; + + sb.append("<script>/n") + .append("jQuery(function() {\n") + .append(" console.log('Load','").append(restapi).append("');") + .append(" UpConversionAjaxController.setUpConversionServiceUrl('/").append(restapi).append("');\n") + .append(" UpConversionAjaxController.setDelay(300);\n") + .append("});") + .append("</script>/n"); + + //if(itemSessionController.getItemSessionState().isEnded()) { // sb.append("<h1>The End <small>say the renderer</small></h1>"); //} else { diff --git a/src/main/java/org/olat/ims/qti21/ui/components/AssessmentTestComponentRenderer.java b/src/main/java/org/olat/ims/qti21/ui/components/AssessmentTestComponentRenderer.java index 0ede59aa9c452ea41b48d8a11684685b01b3581d..032c5eef87281bfa016613b25d2aa9f7df466403 100644 --- a/src/main/java/org/olat/ims/qti21/ui/components/AssessmentTestComponentRenderer.java +++ b/src/main/java/org/olat/ims/qti21/ui/components/AssessmentTestComponentRenderer.java @@ -34,7 +34,9 @@ import org.olat.core.gui.render.Renderer; import org.olat.core.gui.render.StringOutput; import org.olat.core.gui.render.URLBuilder; import org.olat.core.gui.translator.Translator; +import org.olat.core.helpers.Settings; import org.olat.core.logging.OLATRuntimeException; +import org.olat.core.util.WebappHelper; import org.olat.ims.qti21.UserTestSession; import org.olat.ims.qti21.model.CandidateTestEventType; import org.olat.ims.qti21.model.jpa.CandidateEvent; @@ -73,6 +75,16 @@ public class AssessmentTestComponentRenderer extends DefaultComponentRenderer { TestSessionController testSessionController = cmp.getTestSessionController(); AssessmentTestFormItem item = cmp.getQtiItem(); + /* + String restapi = "/olat/restapi/math/verifyAsciiMath"; + sb.append("<script>/n") + //.append("jQuery(function() {\n") + .append(" UpConversionAjaxController.setUpConversionServiceUrl('").append(restapi).append("');\n") + .append(" UpConversionAjaxController.setDelay(300);\n") + //.append("});") + .append("</script>/n"); + */ + if(testSessionController.getTestSessionState().isEnded()) { sb.append("<h1>The End <small>say the renderer</small></h1>"); } else { diff --git a/src/main/java/org/olat/ims/qti21/ui/rendering/AssessmentRenderer.java b/src/main/java/org/olat/ims/qti21/ui/rendering/AssessmentRenderer.java index 971dad59d3bbd237e6c1c593a6d0670e5ec373df..178d22d8ff0ea8824207eb1ef04301d01525e820 100644 --- a/src/main/java/org/olat/ims/qti21/ui/rendering/AssessmentRenderer.java +++ b/src/main/java/org/olat/ims/qti21/ui/rendering/AssessmentRenderer.java @@ -470,6 +470,7 @@ public class AssessmentRenderer { xsltParameters.put("qtiWorksVersion", "1.0-SNAPSH0T-OO"); xsltParameters.put("webappContextPath", ""); xsltParameters.put("fullWebappContextPath", Settings.createServerURI()); + xsltParameters.put("olatWebappContextPath", Settings.getServerContextPathURI()); StringOutput target = new StringOutput(); StaticMediaDispatcher.renderStaticURI(target, "", true); xsltParameters.put("staticContextPath", target.toString()); diff --git a/src/main/java/org/olat/restapi/_spring/restApiContext.xml b/src/main/java/org/olat/restapi/_spring/restApiContext.xml index fa592e8c355579702484c020d79a19621574825c..8682e7d9118e814fb3c8f611ac9b1124c7e5b0c1 100644 --- a/src/main/java/org/olat/restapi/_spring/restApiContext.xml +++ b/src/main/java/org/olat/restapi/_spring/restApiContext.xml @@ -46,6 +46,7 @@ <value>org.olat.course.nodes.bc.BCWebService</value> <value>org.olat.course.assessment.restapi.EfficiencyStatementWebService</value> <value>org.olat.course.certificate.restapi.CertificationWebService</value> + <value>org.olat.ims.qti21.restapi.MathWebService</value> <value>org.olat.modules.wiki.restapi.WikisWebService</value> <value>org.olat.modules.fo.restapi.ForumImportWebService</value> <value>org.olat.modules.fo.restapi.ForumCourseNodeWebService</value> diff --git a/src/main/resources/rendering-xslt/interactions/mathEntryInteraction.xsl b/src/main/resources/rendering-xslt/interactions/mathEntryInteraction.xsl index 7a0cba93eaee68975b131e00fa9a73bccca2faa9..42d95c864c0181d95acfc452ffe30afe15282e98 100644 --- a/src/main/resources/rendering-xslt/interactions/mathEntryInteraction.xsl +++ b/src/main/resources/rendering-xslt/interactions/mathEntryInteraction.xsl @@ -38,6 +38,9 @@ </div> </div> <script type="text/javascript"> + UpConversionAjaxController.setUpConversionServiceUrl('<xsl:value-of select="$olatWebappContextPath"/>/restapi/math/verifyAsciiMath'); + UpConversionAjaxController.setDelay(300); + QtiWorksRendering.registerReadyCallback(function() { var inputControlId = 'qtiworks_id_mathEntryInput_<xsl:value-of select="@responseIdentifier"/>'; var messageContainerId = 'qtiworks_id_mathEntryMessages_<xsl:value-of select="@responseIdentifier"/>'; diff --git a/src/main/resources/rendering-xslt/qti-common.xsl b/src/main/resources/rendering-xslt/qti-common.xsl index 852cb11956d8adf2cbd10fc4226d54a332e133b5..499df081fb7e4e78136a802bcde02cb356a03cb2 100644 --- a/src/main/resources/rendering-xslt/qti-common.xsl +++ b/src/main/resources/rendering-xslt/qti-common.xsl @@ -22,6 +22,7 @@ rendering. <xsl:param name="webappContextPath" as="xs:string" required="yes"/> <xsl:param name="staticContextPath" as="xs:string" required="yes"/> <xsl:param name="fullWebappContextPath" as="xs:string" required="yes"/> + <xsl:param name="olatWebappContextPath" as="xs:string" required="yes"/> <!-- QTIWorks version number --> <xsl:param name="qtiWorksVersion" as="xs:string" required="yes"/> diff --git a/src/main/resources/rendering-xslt/test-item.xsl b/src/main/resources/rendering-xslt/test-item.xsl index 2b4d12a71e762fb0646d29227a69cc61165881c7..f49df12d29fdc58dd326bd4c2972bda3832b419d 100644 --- a/src/main/resources/rendering-xslt/test-item.xsl +++ b/src/main/resources/rendering-xslt/test-item.xsl @@ -96,7 +96,7 @@ NB: This is used both while being presented, and during review. <script src="{$webappContextPath}/rendering/javascript/UpConversionAjaxController.js?v={$qtiWorksVersion}"/> <script src="{$webappContextPath}/rendering/javascript/AsciiMathInputController.js?v={$qtiWorksVersion}"/> <script> - UpConversionAjaxController.setUpConversionServiceUrl('<xsl:value-of select="$webappContextPath"/>/candidate/verifyAsciiMath'); + UpConversionAjaxController.setUpConversionServiceUrl('<xsl:value-of select="$webappContextPath"/>restapi/math/verifyAsciiMath'); UpConversionAjaxController.setDelay(300); </script> </xsl:if>