diff --git a/src/main/java/org/olat/core/util/openxml/HTMLToOpenXMLHandler.java b/src/main/java/org/olat/core/util/openxml/HTMLToOpenXMLHandler.java index 0357b84f2858849f3264b5d07a2597ff1ef07362..996f4014226bbcf5415030f38b6f4448084e953a 100644 --- a/src/main/java/org/olat/core/util/openxml/HTMLToOpenXMLHandler.java +++ b/src/main/java/org/olat/core/util/openxml/HTMLToOpenXMLHandler.java @@ -116,11 +116,7 @@ public class HTMLToOpenXMLHandler extends DefaultHandler { flushText(); addContent(currentParagraph); } - - Indent indent = getCurrentIndent(); - Border leftBorder = getCurrentLeftBorder(); - PredefinedStyle predefinedStyle = getCurrentPredefinedStyle(); - currentParagraph = factory.createParagraphEl(indent, leftBorder, startSpacing, predefinedStyle); + currentParagraph = createParagraphWithCurrentStyling(startSpacing); startSpacing = null;//consumed } return currentParagraph; @@ -132,11 +128,15 @@ public class HTMLToOpenXMLHandler extends DefaultHandler { flushText(); addContent(currentParagraph); } + currentParagraph = createParagraphWithCurrentStyling(spacing); + return currentParagraph; + } + + private Element createParagraphWithCurrentStyling(Spacing spacing) { Indent indent = getCurrentIndent(); Border leftBorder = getCurrentLeftBorder(); PredefinedStyle predefinedStyle = getCurrentPredefinedStyle(); - currentParagraph = factory.createParagraphEl(indent, leftBorder, spacing, predefinedStyle); - return currentParagraph; + return factory.createParagraphEl(indent, leftBorder, spacing, predefinedStyle); } protected Element getCurrentListParagraph(boolean create) { @@ -185,18 +185,15 @@ public class HTMLToOpenXMLHandler extends DefaultHandler { } } + protected boolean hasTextToFlush() { + return textBuffer != null && textBuffer.length() > 0; + } + protected void flushText() { if(textBuffer == null) return; if(latex) { - //begin a new paragraph - if(currentParagraph != null) { - currentParagraph = addContent(currentParagraph); - } - List<Node> nodes = factory.convertLaTeX(textBuffer.toString()); - for(Node node:nodes) { - addContent(node); - } + flushLaTeX(); } else { Element currentRun = getCurrentRun(); String text = textBuffer.toString().replace("\n", "").replace("\r", ""); @@ -212,6 +209,21 @@ public class HTMLToOpenXMLHandler extends DefaultHandler { textBuffer = null; } + private void flushLaTeX() { + Element paragraphEl; + if(currentParagraph == null) { + paragraphEl = currentParagraph = createParagraphWithCurrentStyling(startSpacing); + startSpacing = null; + } else { + paragraphEl = currentParagraph; + } + + List<Node> nodes = factory.convertLaTeX(textBuffer.toString(), false); + for(Node node:nodes) { + paragraphEl.appendChild(node); + } + } + /** * Get or create a run on the current paragraph * @return @@ -219,10 +231,7 @@ public class HTMLToOpenXMLHandler extends DefaultHandler { protected Element getCurrentRun() { Element paragraphEl; if(currentParagraph == null) { - Indent indent = getCurrentIndent(); - Border leftBorder = getCurrentLeftBorder(); - PredefinedStyle predefinedStyle = getCurrentPredefinedStyle(); - paragraphEl = currentParagraph = factory.createParagraphEl(indent, leftBorder, startSpacing, predefinedStyle); + paragraphEl = currentParagraph = createParagraphWithCurrentStyling(startSpacing); startSpacing = null; } else { paragraphEl = currentParagraph; diff --git a/src/main/java/org/olat/core/util/openxml/OpenXMLDocument.java b/src/main/java/org/olat/core/util/openxml/OpenXMLDocument.java index 6ba0feaf97dda6ee47f0458cf0b79b5ea6a086f7..04f580c3577f1185e9f90e5e0de131d3510ae1e9 100644 --- a/src/main/java/org/olat/core/util/openxml/OpenXMLDocument.java +++ b/src/main/java/org/olat/core/util/openxml/OpenXMLDocument.java @@ -1015,7 +1015,7 @@ public class OpenXMLDocument { return createParagraphEl(null, Collections.singletonList(runEl)); } - public List<Node> convertLaTeX(String latex) { + public List<Node> convertLaTeX(String latex, boolean paragraph) { List<Node> mathEls = new ArrayList<>(); try { // place the latex marker if needed @@ -1048,11 +1048,8 @@ public class OpenXMLDocument { NodeList bodyList = doc.getElementsByTagName("w:body"); if(bodyList.getLength() == 1) { - Node body = bodyList.item(0); - for(Node node=body.getFirstChild(); node!=null; node=node.getNextSibling()) { - Node importedNode = document.importNode(node, true); - mathEls.add(importedNode); - } + List<Node> mathNodes = collectMathParagraph(bodyList.item(0), paragraph); + mathEls.addAll(mathNodes); } } entry = zip.getNextEntry(); @@ -1063,6 +1060,34 @@ public class OpenXMLDocument { return mathEls; } + private List<Node> collectMathParagraph(Node parent, boolean paragraph) { + List<Node> mathEls = new ArrayList<>(); + if(paragraph) { + for(Node node=parent.getFirstChild(); node!=null; node=node.getNextSibling()) { + String nodeName = node.getNodeName(); + if("w:p".equalsIgnoreCase(nodeName)) { + Node importedNode = document.importNode(node, true); + mathEls.add(importedNode); + } + } + } else { + NodeList mathList = ((Element)parent).getElementsByTagName("m:oMath"); + for(int i=0; i<mathList.getLength(); i++) { + Node importedNode = document.importNode(mathList.item(i), true); + mathEls.add(importedNode); + } + } + + if(mathEls.isEmpty()) { + for(Node node=parent.getFirstChild(); node!=null; node=node.getNextSibling()) { + Node importedNode = document.importNode(node, true); + mathEls.add(importedNode); + } + } + + return mathEls; + } + public void appendImage(File file) { Element imgEl = createImageEl(file); if(imgEl != null) { diff --git a/src/main/java/org/olat/ims/qti21/manager/openxml/QTI21WordExport.java b/src/main/java/org/olat/ims/qti21/manager/openxml/QTI21WordExport.java index 3e296e0754b9c7d8932415d65fb7c0768c72fdeb..2e18f6b833ac63c58643150686f257f875984bbf 100644 --- a/src/main/java/org/olat/ims/qti21/manager/openxml/QTI21WordExport.java +++ b/src/main/java/org/olat/ims/qti21/manager/openxml/QTI21WordExport.java @@ -537,6 +537,11 @@ public class QTI21WordExport implements MediaResource { } private void endSimpleChoice() { + if(hasTextToFlush()) { + flushText(); + currentParagraph = addContent(currentParagraph); + } + Element checkboxCell = factory.createTableCell(null, 369, Unit.pct); Node checkboxNode = getCurrentTable().addCellEl(checkboxCell, 1); diff --git a/src/main/java/org/olat/ims/qti21/ui/editor/AssessmentItemEditorController.java b/src/main/java/org/olat/ims/qti21/ui/editor/AssessmentItemEditorController.java index f53b3c033f962edefef66d0a60ab69301f09fcf5..0caa8e16d0d33305c2b6999da33769ba7428954b 100644 --- a/src/main/java/org/olat/ims/qti21/ui/editor/AssessmentItemEditorController.java +++ b/src/main/java/org/olat/ims/qti21/ui/editor/AssessmentItemEditorController.java @@ -213,9 +213,11 @@ public class AssessmentItemEditorController extends BasicController implements A tabbedPane.addTab(translate("form.pool"), poolEditor); } - metadataCtrl = new MetadataController(ureq, getWindowControl(), metadataBuilder, readOnly); - listenTo(metadataCtrl); - tabbedPane.addTab(translate("form.metadata"), metadataCtrl); + if(metadataBuilder != null) { + metadataCtrl = new MetadataController(ureq, getWindowControl(), metadataBuilder, readOnly); + listenTo(metadataCtrl); + tabbedPane.addTab(translate("form.metadata"), metadataCtrl); + } } putInitialPanel(mainVC);