From 9a2e5dfd85c02629faf6772910427e40d718ffbe Mon Sep 17 00:00:00 2001 From: srosse <none@none> Date: Tue, 19 Sep 2017 09:54:31 +0200 Subject: [PATCH] OO-3021: open a new paragraph for DIV and for QTI 2.1 trim the text buffer before P and DIV to remove special blank characters --- .../util/openxml/HTMLToOpenXMLHandler.java | 22 +++++++++++++++---- .../core/util/openxml/OpenXMLDocument.java | 2 +- .../manager/openxml/QTI21WordExport.java | 7 +++++- 3 files changed, 25 insertions(+), 6 deletions(-) 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 09efd2ee2f5..3159fe50376 100644 --- a/src/main/java/org/olat/core/util/openxml/HTMLToOpenXMLHandler.java +++ b/src/main/java/org/olat/core/util/openxml/HTMLToOpenXMLHandler.java @@ -167,6 +167,17 @@ public class HTMLToOpenXMLHandler extends DefaultHandler { return null; } + protected void trimTextBuffer() { + if(textBuffer == null) return; + + String text = textBuffer.toString().trim(); + if(text.length() == 0) { + textBuffer = null; + } else { + textBuffer = new StringBuilder(text); + } + } + protected void flushText() { if(textBuffer == null) return; @@ -403,7 +414,7 @@ public class HTMLToOpenXMLHandler extends DefaultHandler { @Override public void startElement(String uri, String localName, String qName, Attributes attributes) { String tag = localName.toLowerCase(); - if("p".equalsIgnoreCase(tag)) { + if("p".equals(tag)) { getCurrentParagraph(pNeedNewParagraph); } else if("span".equalsIgnoreCase(tag)) { flushText(); @@ -419,18 +430,18 @@ public class HTMLToOpenXMLHandler extends DefaultHandler { styleStack.add(new StyleStatus(tag, styles)); } else if("br".equals(tag)) { closeParagraph(); - } else if("em".equalsIgnoreCase(tag)) { + } else if("em".equals(tag)) { flushText(); Style[] styles = setTextPreferences(Style.italic); styleStack.add(new StyleStatus(tag, styles)); - } else if("strong".equalsIgnoreCase(tag)) { + } else if("strong".equals(tag)) { flushText(); Style[] styles = setTextPreferences(Style.bold); styleStack.add(new StyleStatus(tag, styles)); } else if("img".equals(tag)) { String path = attributes.getValue("src"); setImage(path); - } else if("table".equalsIgnoreCase(tag)) { + } else if("table".equals(tag)) { startTable(); } else if("tr".equals(tag)) { startCurrentTableRow(); @@ -456,9 +467,11 @@ public class HTMLToOpenXMLHandler extends DefaultHandler { appendParagraph(new Spacing(120, 0)); pNeedNewParagraph = false; } else { + getCurrentParagraph(pNeedNewParagraph); styleStack.add(new StyleStatus(tag, new Style[0])); } } else { + getCurrentParagraph(pNeedNewParagraph); styleStack.add(new StyleStatus(tag, new Style[0])); } } @@ -506,6 +519,7 @@ public class HTMLToOpenXMLHandler extends DefaultHandler { popStyle(tag); } else if("div".equals(tag)) { popStyle(tag); + closeParagraph(); } } 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 1bcc4bb516f..dfaabdda7ff 100644 --- a/src/main/java/org/olat/core/util/openxml/OpenXMLDocument.java +++ b/src/main/java/org/olat/core/util/openxml/OpenXMLDocument.java @@ -268,7 +268,7 @@ public class OpenXMLDocument { if(StringHelper.containsNonWhitespace(documentHeader)) { try(InputStream headerIn = OpenXMLDocument.class.getResourceAsStream("_resources/header.xml")) { - String headerTemplate = IOUtils.toString(headerIn); + String headerTemplate = IOUtils.toString(headerIn, "UTF-8"); String header = headerTemplate.replace("[oodocumentitlte]", documentHeader); String headerId = generateId(); 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 f6fa794d74d..ba5463fb300 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 @@ -471,6 +471,11 @@ public class QTI21WordExport implements MediaResource { case "simpleassociablechoice": //do nothing break; + case "div": + case "p": + trimTextBuffer(); + super.startElement(uri, localName, qName, attributes); + break; default: { if(renderElement) { super.startElement(uri, localName, qName, attributes); @@ -668,7 +673,7 @@ public class QTI21WordExport implements MediaResource { private void startMatch(MatchInteraction matchInteraction) { List<String> cssClasses = matchInteraction.getClassAttr(); - if(cssClasses.contains(QTI21Constants.CSS_MATCH_DRAG_AND_DROP)) { + if(cssClasses != null && cssClasses.contains(QTI21Constants.CSS_MATCH_DRAG_AND_DROP)) { if(hasClass(matchInteraction, QTI21Constants.CSS_MATCH_SOURCE_TOP) || hasClass(matchInteraction, QTI21Constants.CSS_MATCH_SOURCE_BOTTOM)) { startMatchDragAndDropHorizontal(matchInteraction); -- GitLab