/** * Marshall an AssessmentItem object into a DOMElement object. * * @param QtiComponent $component An AssessmentItem object. * @return DOMElement The according DOMElement object. */ protected function marshall(QtiComponent $component) { $element = static::getDOMCradle()->createElement($component->getQtiClassName()); self::setDOMElementAttribute($element, 'identifier', $component->getIdentifier()); self::setDOMElementAttribute($element, 'title', $component->getTitle()); self::setDOMElementAttribute($element, 'timeDependent', $component->isTimeDependent()); self::setDOMElementAttribute($element, 'adaptive', $component->isAdaptive()); if ($component->hasLang() === true) { self::setDOMElementAttribute($element, 'lang', $component->getLang()); } if ($component->hasLabel() === true) { self::setDOMElementAttribute($element, 'label', $component->getLabel()); } if ($component->hasToolName() === true) { self::setDOMElementAttribute($element, 'toolName', $component->getToolName()); } if ($component->hasToolVersion() === true) { self::setDOMElementAttribute($element, 'toolVersion', $component->getToolVersion()); } foreach ($component->getResponseDeclarations() as $responseDeclaration) { $marshaller = $this->getMarshallerFactory()->createMarshaller($responseDeclaration); $element->appendChild($marshaller->marshall($responseDeclaration)); } foreach ($component->getOutcomeDeclarations() as $outcomeDeclaration) { $marshaller = $this->getMarshallerFactory()->createMarshaller($outcomeDeclaration); $element->appendChild($marshaller->marshall($outcomeDeclaration)); } foreach ($component->getTemplateDeclarations() as $templateDeclaration) { $marshaller = $this->getMarshallerFactory()->createMarshaller($templateDeclaration); $element->appendChild($marshaller->marshall($templateDeclaration)); } if ($component->hasTemplateProcessing() === true) { $marshaller = $this->getMarshallerFactory()->createMarshaller($component->getTemplateProcessing()); $element->appendChild($marshaller->marshall($component->getTemplateProcessing())); } foreach ($component->getStylesheets() as $stylesheet) { $marshaller = $this->getMarshallerFactory()->createMarshaller($stylesheet); $element->appendChild($marshaller->marshall($stylesheet)); } if ($component->hasItemBody() === true) { $itemBody = $component->getItemBody(); $marshaller = $this->getMarshallerFactory()->createMarshaller($itemBody); $element->appendChild($marshaller->marshall($itemBody)); } if ($component->hasResponseProcessing() === true) { $marshaller = $this->getMarshallerFactory()->createMarshaller($component->getResponseProcessing()); $element->appendChild($marshaller->marshall($component->getResponseProcessing())); } foreach ($component->getModalFeedbacks() as $modalFeedback) { $marshaller = $this->getMarshallerFactory()->createMarshaller($modalFeedback); $element->appendChild($marshaller->marshall($modalFeedback)); } return $element; }
/** * Create the final rendering of the rendered $component as it must be rendered by the final * implementation. * * @return mixed */ protected function createFinalRendering(QtiComponent $component) { $dom = $this->getDocument(); if (($last = $this->getLastRendering()) !== null) { $dom->appendChild($last); } // If we are rendering an item, let's try to find some Math to // for template variable mapping. if ($component instanceof AssessmentItem && count($templateDeclarations = $component->getTemplateDeclarations()) > 0) { $xpath = new DOMXPath($dom); $xpath->registerNamespace('m', 'http://www.w3.org/1998/Math/MathML'); $maths = $xpath->query('//m:math|//math'); if ($maths->length > 0) { $printedVariableRenderer = new PrintedVariableRenderer($this); foreach ($templateDeclarations as $templateDeclaration) { if ($templateDeclaration->isMathVariable() === true) { $templateIdentifier = $templateDeclaration->getIdentifier(); foreach ($maths as $math) { // Find <mi> and <ci> elements. foreach ($xpath->query(".//m:mi[text() = '{$templateIdentifier}']|.//m:ci[text() = '{$templateIdentifier}']|.//mi[text() = '{$templateIdentifier}']|.//ci[text() = '{$templateIdentifier}']", $math) as $mathElement) { $localElementName = $mathElement->localName === 'mi' ? 'mn' : 'cn'; $newMathElement = $mathElement->ownerDocument->createElement($localElementName); $printedVariable = new PrintedVariable($templateIdentifier); $printedVariableFragment = $printedVariableRenderer->render($printedVariable); if ($this->getPrintedVariablePolicy() === self::CONTEXT_STATIC) { foreach ($printedVariableFragment->childNodes as $node) { $newMathElement->appendChild($node); $mathElement->parentNode->replaceChild($newMathElement, $mathElement); } } else { if ($this->getPrintedVariablePolicy() === self::CONTEXT_AWARE) { $newMathElement->appendChild($newMathElement->ownerDocument->createTextNode($printedVariableFragment->firstChild->nodeValue)); $mathElement->parentNode->replaceChild($newMathElement, $mathElement); } else { foreach ($printedVariableFragment->firstChild->childNodes as $node) { $newMathElement->appendChild($node); $mathElement->parentNode->replaceChild($newMathElement, $mathElement); } } } } } } } } } return $dom; }