Skip to content
Snippets Groups Projects
Commit 7216107a authored by srosse's avatar srosse
Browse files

Merge OpenOLAT default branch to OpenOLAT 13a with 5fe5edca92357a049ed696ca2690de91ddc7f640

parents caeecf17 a36119ed
No related branches found
No related tags found
No related merge requests found
......@@ -217,3 +217,4 @@ de92931b87a20ec26edb2c65e3496c471bce6481 OpenOLAT 12.3.2
a83d9c176d6c269b4ec124d7700f961e15b2a508 OpenOLAT 12.3.3
e4c7003b290148810092848bc73bcec4e61da7be OpenOLAT 12.4.0
f55676080d2436df8078a8a0f1f6fb1afbdbe58c OpenOLAT 12.4.1
0810e24414f8cbb68dd6914297d883faf9527469 OpenOLAT 12.4.2
......@@ -663,11 +663,25 @@ public class Formatter {
sb.append("<").append(elem).append(" id=\"").append(domid).append("\">");
sb.append(htmlFragment);
sb.append("</").append(elem).append(">");
sb.append("\n<script type='text/javascript'>\n/* <![CDATA[ */\n setTimeout(function() { BFormatter.formatLatexFormulas('").append(domid).append("');}, 100);\n/* ]]> */\n</script>");
sb.append(elementLatexFormattingScript(domid));
return sb.toString();
}
return htmlFragment;
}
/**
* Html code script to render the latex formulas of a given element id
* @param domid Id of the DOM node containing the elements to render.
*/
public static String elementLatexFormattingScript(String domid) {
return String.format("%n"
+ "<script type='text/javascript'>%n"
+ "/* <![CDATA[ */%n"
+ " jQuery(function() {setTimeout(function() { BFormatter.formatLatexFormulas('%s');}, 100); }); %n"
+ "/* ]]> */%n"
+ "</script>",
domid);
}
// Pattern to find URL's in text
......
......@@ -769,8 +769,6 @@ public class BusinessGroupServiceImpl implements BusinessGroupService, UserDataD
// 1) Delete all group properties
CollaborationTools ct = CollaborationToolsFactory.getInstance().getOrCreateCollaborationTools(group);
ct.deleteTools(group);// deletes everything concerning properties&collabTools
// 1.c)delete user in security groups
//removeFromRepositoryEntrySecurityGroup(group);
// 2) Delete the group areas
areaManager.deleteBGtoAreaRelations(group);
// 3) Delete the relations
......@@ -786,8 +784,6 @@ public class BusinessGroupServiceImpl implements BusinessGroupService, UserDataD
infoMessageManager.removeInfoMessagesAndSubscriptionContext(group);
// 7) the group
businessGroupDAO.delete(group);
// 8) delete the associated security groups
//TODO group
dbInstance.commit();
......
......@@ -83,6 +83,7 @@ import org.olat.core.helpers.Settings;
import org.olat.core.logging.OLog;
import org.olat.core.logging.Tracing;
import org.olat.core.util.CodeHelper;
import org.olat.core.util.Formatter;
import org.olat.core.util.StringHelper;
import org.olat.core.util.Util;
import org.olat.ims.qti21.QTI21Constants;
......@@ -97,6 +98,7 @@ import uk.ac.ed.ph.jqtiplus.attribute.Attribute;
import uk.ac.ed.ph.jqtiplus.attribute.AttributeList;
import uk.ac.ed.ph.jqtiplus.attribute.ForeignAttribute;
import uk.ac.ed.ph.jqtiplus.attribute.value.IntegerAttribute;
import uk.ac.ed.ph.jqtiplus.attribute.value.StringAttribute;
import uk.ac.ed.ph.jqtiplus.attribute.value.StringMultipleAttribute;
import uk.ac.ed.ph.jqtiplus.node.ForeignElement;
import uk.ac.ed.ph.jqtiplus.node.QtiNode;
......@@ -470,15 +472,29 @@ public abstract class AssessmentObjectComponentRenderer extends DefaultComponent
}
case RubricBlock.QTI_CLASS_NAME: break; //never rendered automatically
case Math.QTI_CLASS_NAME: {
String domid = "mw_" + CodeHelper.getRAMUniqueID();
sb.append("<div id=\"").append(domid).append("\">");
renderMath(renderer, sb, component, resolvedAssessmentItem, itemSessionState, (Math)block);
sb.append("</div>")
.append(Formatter.elementLatexFormattingScript(domid));
break;
}
case Div.QTI_CLASS_NAME:
case Div.QTI_CLASS_NAME: {
String domid = null;
if (containsClass(block, "math")) {
domid = "mw_" + CodeHelper.getRAMUniqueID();
sb.append("<div id=\"").append(domid).append("\">");
}
renderStartHtmlTag(sb, component, resolvedAssessmentItem, block, null);
((Div)block).getFlows().forEach((flow)
-> renderFlow(renderer, sb, component, resolvedAssessmentItem, itemSessionState, flow, ubu, translator));
renderEndTag(sb, block);
if (domid != null) {
sb.append("</div>")
.append(Formatter.elementLatexFormattingScript(domid));
}
break;
}
case Ul.QTI_CLASS_NAME:
renderStartHtmlTag(sb, component, resolvedAssessmentItem, block, null);
((Ul)block).getLis().forEach((li)
......@@ -672,7 +688,11 @@ public abstract class AssessmentObjectComponentRenderer extends DefaultComponent
break;
}
case Math.QTI_CLASS_NAME: {
String domid = "mw_" + CodeHelper.getRAMUniqueID();
sb.append("<span id=\"").append(domid).append("\">");
renderMath(renderer, sb, component, resolvedAssessmentItem, itemSessionState, (Math)inline);
sb.append("</span>")
.append(Formatter.elementLatexFormattingScript(domid));
break;
}
case Img.QTI_CLASS_NAME: {
......@@ -709,9 +729,7 @@ 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) {
StringMultipleAttribute attrClass = span.getAttributes().getStringMultipleAttribute("class");
if (attrClass != null && attrClass.getValue() != null && attrClass.getValue().contains("math")) {
if (containsClass(span,"math")) {
String domid = "mw_" + CodeHelper.getRAMUniqueID();
sb.append("<span id=\"").append(domid).append("\">");
......@@ -721,7 +739,7 @@ public abstract class AssessmentObjectComponentRenderer extends DefaultComponent
renderEndTag(sb, span);
sb.append("</span>")
.append("\n<script type='text/javascript'>\n/* <![CDATA[ */\n jQuery(function() {setTimeout(function() { BFormatter.formatLatexFormulas('").append(domid).append("');}, 100); }); \n/* ]]> */\n</script>");
.append(Formatter.elementLatexFormattingScript(domid));
} else {
renderStartHtmlTag(sb, component, resolvedAssessmentItem, span, null);
span.getInlines().forEach((child)
......@@ -1391,10 +1409,15 @@ public abstract class AssessmentObjectComponentRenderer extends DefaultComponent
renderer.setMathXsltDisabled(true);
try(StringOutput mathOutput = StringOutputPool.allocStringBuilder(2048)) {
mathOutput.append("<math xmlns=\"http://www.w3.org/1998/Math/MathML\">");
if (!math.getAttributes().contains("xmlns")) {
StringAttribute xmlnsAttribute = new StringAttribute(math, "xmlns", false);
xmlnsAttribute.setValue("http://www.w3.org/1998/Math/MathML");
math.getAttributes().add(xmlnsAttribute);
}
renderStartHtmlTag(mathOutput, component, resolvedAssessmentItem, math, null);
math.getContent().forEach((foreignElement)
-> renderMath(renderer, mathOutput, component, resolvedAssessmentItem, itemSessionState, foreignElement));
mathOutput.append("</math>");
renderEndTag(mathOutput, math);
String enrichedMathML = StringOutputPool.freePop(mathOutput);
renderer.setMathXsltDisabled(false);
transformMathmlAsString(sb, enrichedMathML);
......@@ -1449,7 +1472,7 @@ public abstract class AssessmentObjectComponentRenderer extends DefaultComponent
renderEndTag(out, fElement);
}
} else if(mathElement instanceof TextRun) {
out.append(((TextRun)mathElement).getTextContent());
out.append(StringEscapeUtils.escapeXml(((TextRun)mathElement).getTextContent()));
}
}
......@@ -1588,7 +1611,7 @@ public abstract class AssessmentObjectComponentRenderer extends DefaultComponent
sb.append("<span class='o_error'>ERROR MATHML</span>");
}
}
protected boolean containsClass(QtiNode element, String marker) {
AttributeList attributes = element.getAttributes();
for(int i=attributes.size(); i-->0; ) {
......
......@@ -593,6 +593,8 @@ public class AssessmentRenderFunctions {
case "class":
case "contextmenu":
case "dir":
case "display":
case "download":
case "hidden":
case "name":
case "id":
......@@ -603,6 +605,7 @@ public class AssessmentRenderFunctions {
case "style":
case "width":
case "height":
case "xmlns":
value = getDomAttributeValue(attribute);
break;
case "href":
......
......@@ -37,6 +37,7 @@ import java.util.concurrent.atomic.AtomicBoolean;
import org.olat.basesecurity.Group;
import org.olat.basesecurity.IdentityRef;
import org.olat.basesecurity.manager.GroupDAO;
import org.olat.collaboration.CollaborationTools;
import org.olat.core.commons.modules.bc.vfs.OlatRootFileImpl;
import org.olat.core.commons.persistence.DB;
import org.olat.core.gui.translator.Translator;
......@@ -60,6 +61,8 @@ import org.olat.course.run.scoring.AssessmentEvaluation;
import org.olat.course.run.scoring.ScoreEvaluation;
import org.olat.course.run.userview.UserCourseEnvironment;
import org.olat.fileresource.FileResourceManager;
import org.olat.group.BusinessGroup;
import org.olat.group.DeletableGroupData;
import org.olat.modules.assessment.AssessmentEntry;
import org.olat.modules.assessment.AssessmentService;
import org.olat.modules.assessment.Role;
......@@ -112,6 +115,8 @@ import org.olat.modules.portfolio.model.SectionImpl;
import org.olat.modules.portfolio.model.SectionKeyRef;
import org.olat.modules.portfolio.model.SynchedBinder;
import org.olat.modules.portfolio.ui.PortfolioHomeController;
import org.olat.properties.NarrowedPropertyManager;
import org.olat.properties.Property;
import org.olat.repository.RepositoryEntry;
import org.olat.repository.RepositoryEntryRef;
import org.olat.repository.RepositoryService;
......@@ -130,7 +135,7 @@ import com.thoughtworks.xstream.XStream;
*
*/
@Service
public class PortfolioServiceImpl implements PortfolioService {
public class PortfolioServiceImpl implements PortfolioService, DeletableGroupData {
private static final OLog log = Tracing.createLoggerFor(PortfolioServiceImpl.class);
......@@ -262,6 +267,24 @@ public class PortfolioServiceImpl implements PortfolioService {
return binder;
}
@Override
public boolean deleteGroupDataFor(BusinessGroup group) {
NarrowedPropertyManager npm = NarrowedPropertyManager.getInstance(group);
Property mapKeyProperty = npm.findProperty(null, null, CollaborationTools.PROP_CAT_BG_COLLABTOOLS, CollaborationTools.KEY_PORTFOLIO);
if (mapKeyProperty != null) {
Long mapKey = mapKeyProperty.getLongValue();
String version = mapKeyProperty.getStringValue();
if("2".equals(version)) {
Binder binder = binderDao.loadByKey(mapKey);
if(binder != null) {
deleteBinder(binder);
}
}
return true;
}
return false;
}
@Override
public boolean detachCourseFromBinders(RepositoryEntry entry) {
int deletedRows = binderDao.detachBinderFromRepositoryEntry(entry);
......
......@@ -152,8 +152,14 @@ public class Wiki implements WikiContainer, Serializable {
return page;
}
if (loadContent) {
VFSLeaf leaf = (VFSLeaf) pageContainer.resolve(page.getPageId() + "." + WikiManager.WIKI_FILE_SUFFIX);
page.setContent(FileUtils.load(leaf.getInputStream(), "utf-8"));
VFSItem item = pageContainer.resolve(page.getPageId() + "." + WikiManager.WIKI_FILE_SUFFIX);
if(item instanceof VFSLeaf) {
try(InputStream in = ((VFSLeaf)item).getInputStream()) {
page.setContent(FileUtils.load(in, "utf-8"));
} catch(Exception e) {
log.error("Cannot load wiki page: " + item, e);
}
}
}
return page;
}
......
......@@ -22,6 +22,7 @@ package org.olat.core.util;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.Locale;
import java.util.UUID;
import org.apache.commons.lang.StringEscapeUtils;
import org.junit.Assert;
......@@ -132,4 +133,12 @@ public class FormatterTest {
Assert.assertEquals("32:23:45", Formatter.formatTimecode(116625000l));
Assert.assertEquals("532:23:45", Formatter.formatTimecode(1916625000l));
}
@Test
public void elementLatexFormattingScript() {
String domId = UUID.randomUUID().toString();
String latextFormatterJs = Formatter.elementLatexFormattingScript(domId);
Assert.assertNotNull(latextFormatterJs);
Assert.assertTrue(latextFormatterJs.contains(domId));
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment