diff --git a/src/main/java/org/olat/core/util/Formatter.java b/src/main/java/org/olat/core/util/Formatter.java index ab3e7b97f2877a30d651d983062d0ae9be80e350..97e9516a7fe4a5d54c2de1481e5a8c3bc831ba45 100644 --- a/src/main/java/org/olat/core/util/Formatter.java +++ b/src/main/java/org/olat/core/util/Formatter.java @@ -65,7 +65,10 @@ public class Formatter { private static final DateFormat formatDateTime = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); private static final DateFormat shortFormatDateFileSystem = new SimpleDateFormat("yyyyMMdd"); - private static final Map<Locale,Formatter> localToFormatterMap = new HashMap<Locale,Formatter>(); + private static final Map<Locale,Formatter> localToFormatterMap = new HashMap<>(); + + // Pattern to find math classes + private static final Pattern classMathPattern = Pattern.compile(".*class[ ]*=[ ]*(math|(['\"])([a-zA-Z0-9_\\- ]* )*math( [a-zA-Z0-9_\\- ]*)*\\2).*"); private final Locale locale; private final DateFormat shortDateFormat; @@ -651,7 +654,7 @@ public class Formatter { public static String formatLatexFormulas(String htmlFragment) { if (htmlFragment == null) return ""; // optimize, reduce jsmath calls on client - if (htmlFragment.contains("<math") || htmlFragment.contains("class='math'") || htmlFragment.contains("class=\"math\"")) { + if (htmlFragment.contains("<math") || htmlFragment.contains("class='math'") || htmlFragment.contains("class=\"math\"") || classMathPattern.matcher(htmlFragment).matches()) { // add math wrapper String domid = "mw_" + CodeHelper.getRAMUniqueID(); String elem = htmlFragment.contains("<div") || htmlFragment.contains("<p") ? "div" : "span"; diff --git a/src/main/java/org/olat/ims/qti21/ui/components/AssessmentObjectComponentRenderer.java b/src/main/java/org/olat/ims/qti21/ui/components/AssessmentObjectComponentRenderer.java index 8c1ab501f700500d440d81c0423a3e2e6bf50655..b4a38444a428ea6756e1279e762f0827b812e34a 100644 --- a/src/main/java/org/olat/ims/qti21/ui/components/AssessmentObjectComponentRenderer.java +++ b/src/main/java/org/olat/ims/qti21/ui/components/AssessmentObjectComponentRenderer.java @@ -709,9 +709,9 @@ public abstract class AssessmentObjectComponentRenderer extends DefaultComponent protected final void renderSpan(AssessmentRenderer renderer, StringOutput sb, Span span, AssessmentObjectComponent component, ResolvedAssessmentItem resolvedAssessmentItem, ItemSessionState itemSessionState, URLBuilder ubu, Translator translator) { - Attribute<?> attrClass = span.getAttributes().get("class"); + StringMultipleAttribute attrClass = span.getAttributes().getStringMultipleAttribute("class"); - if(attrClass != null && attrClass.getValue() != null && attrClass.getValue().toString().equals("[math]")) { + if (attrClass != null && attrClass.getValue() != null && attrClass.getValue().contains("math")) { String domid = "mw_" + CodeHelper.getRAMUniqueID(); sb.append("<span id=\"").append(domid).append("\">"); diff --git a/src/test/java/org/olat/core/util/FormatterTest.java b/src/test/java/org/olat/core/util/FormatterTest.java index 682e38935e981dfa509494b31bd6683f62279a49..b794f3f8ef0de4b2fa8716faaa7e8cfc181ef115 100644 --- a/src/test/java/org/olat/core/util/FormatterTest.java +++ b/src/test/java/org/olat/core/util/FormatterTest.java @@ -133,5 +133,32 @@ public class FormatterTest { Assert.assertEquals("532:23:45", Formatter.formatTimecode(1916625000l)); } + @Test + public void formatLatexFormulas() { + Assert.assertTrue(Formatter.formatLatexFormulas("<span class='math'></span>").contains("<script")); + Assert.assertTrue(Formatter.formatLatexFormulas("<span class='math inline'></span>").contains("<script")); + Assert.assertTrue(Formatter.formatLatexFormulas("<div class = \"inline math special\"></div>").contains("<script")); + Assert.assertTrue(Formatter.formatLatexFormulas("<span class = math></span>").contains("<script")); + Assert.assertFalse(Formatter.formatLatexFormulas("<span class = \"nomath\"></span>").contains("<script")); + Assert.assertFalse(Formatter.formatLatexFormulas("<span class='test' id='math'></span>").contains("<script")); + Assert.assertFalse(Formatter.formatLatexFormulas("<span class='math\"></span>").contains("<script")); + //wiki + Assert.assertTrue(Formatter.formatLatexFormulas("<DIV CLASS=\"math\"></span>").contains("<script")); + } + + /** + * This case doesn't test the result of the method but if wrong + * formatted HTML code can produce an infinite loop. + * + */ + @Test + public void formatLatexFormulas_edgeCase() { + Assert.assertFalse(Formatter.formatLatexFormulas("<span class='math\"''></span>").contains("<script")); + Assert.assertFalse(Formatter.formatLatexFormulas("<span class='math\"'\"></span>").contains("<script")); + Assert.assertFalse(Formatter.formatLatexFormulas("<span class='math></\"span>").contains("<script")); + Assert.assertFalse(Formatter.formatLatexFormulas("<span class='math></'span>").contains("<script")); + Assert.assertFalse(Formatter.formatLatexFormulas("<span class='math").contains("<script")); + Assert.assertTrue(Formatter.formatLatexFormulas("<span class=math\"").contains("<script")); + } }