Skip to content

Commit

Permalink
Added ManiaLib/Manialink/Elements/XMLFragment for directly inserting …
Browse files Browse the repository at this point in the history
…XML code
  • Loading branch information
gou1 committed Mar 11, 2014
1 parent 7ef6600 commit 1846dea
Show file tree
Hide file tree
Showing 5 changed files with 55 additions and 10 deletions.
8 changes: 7 additions & 1 deletion README.md
Expand Up @@ -72,6 +72,7 @@ use ManiaLib\Manialink\Elements\Manialink;
use ManiaLib\Manialink\Elements\Quad;
use ManiaLib\Manialink\Elements\Script;
use ManiaLib\Manialink\Elements\Timeout;
use ManiaLib\Manialink\Elements\XMLFragment;
use ManiaLib\Manialink\Layouts\Line;
use ManiaLib\Manialink\Rendering\Renderer;
use ManiaLib\Manialink\Styles\Bgs1;
Expand Down Expand Up @@ -148,6 +149,10 @@ Script::create()
->setNodeValue('main(){ log("Hello world"); } // < &')
->appendTo($ml);
XMLFragment::create()
->setNodeValue('<label text="This label is written directly in XML" />')
->appendTo($ml);
header('Content-type: application/xml; charset=utf-8');
$renderer = new Renderer();
Expand Down Expand Up @@ -182,13 +187,14 @@ This will output:
</frame>
</frame>
<script>main(){ log("Hello world"); } // &lt; &amp;</script>
<label text="This label is written directly in XML"/>
</manialink>
```

Todo
-----------------------------
* Append XML
* Driver examples
* Implement all Element classes
* Implement all layouts
* Relative position bug (?)
Expand Down
13 changes: 13 additions & 0 deletions src/ManiaLib/Manialink/Elements/XMLFragment.php
@@ -0,0 +1,13 @@
<?php

namespace ManiaLib\Manialink\Elements;

use ManiaLib\Manialink\Node;

/**
* Use this element to insert a piece of XML code via static::setNodeValue() inside a Manialink page.
*/
class XMLFragment extends Node
{

}
2 changes: 2 additions & 0 deletions src/ManiaLib/Manialink/Rendering/DriverInterface.php
Expand Up @@ -6,4 +6,6 @@ interface DriverInterface
{

function getXML(\ManiaLib\Manialink\Node $root);

function appendXML($xml);
}
21 changes: 17 additions & 4 deletions src/ManiaLib/Manialink/Rendering/Drivers/DOMDocumentDriver.php
Expand Up @@ -18,32 +18,45 @@ function __construct()
$this->document = new DOMDocument('1.0', 'UTF-8');
}

public function getXML(Node $root)
function getXML(Node $root)
{
$this->document->appendChild($this->getElement($root));
return $this->document->saveXML();
}

function appendXML($xml)
{
$fragment = $this->document->createDocumentFragment();
$fragment->appendXML($xml);
return $fragment;
}

protected function getElement(Node $node)
{
// XML fragment?
if($node instanceof \ManiaLib\Manialink\Elements\XMLFragment)
{
return $this->appendXML($node->getNodeValue());
}

// Filter
$node->executeCallbacks('prefilter');

// Create
$element = $this->document->createElement($node::XML_TAG_NAME);

// Value
if($node->getNodeValue() !== null)
{
$element->appendChild($this->document->createTextNode($node->getNodeValue()));
}

// Attributes
foreach($node->getAttributes() as $name => $value)
{
$element->setAttribute($name, $value);
}

// Children
foreach($node->getChildren() as $child)
{
Expand Down
21 changes: 16 additions & 5 deletions src/ManiaLib/Manialink/Rendering/Drivers/XMLWriterDriver.php
Expand Up @@ -20,39 +20,50 @@ function __construct()
$this->writer->startDocument('1.0', 'UTF-8');
}

public function getXML(Node $root)
function getXML(Node $root)
{
$this->getElement($root);
$this->writer->endDocument();
return $this->writer->outputMemory(true);
}

function appendXML($xml)
{
$this->writer->writeRaw($xml);
}

protected function getElement(Node $node)
{
// XML fragment?
if($node instanceof \ManiaLib\Manialink\Elements\XMLFragment)
{
return $this->appendXML($node->getNodeValue());
}

// Filter
$node->executeCallbacks('prefilter');

// Create
$this->writer->startElement($node::XML_TAG_NAME);

// Value
if($node->getNodeValue() !== null)
{
$this->writer->writeRaw(htmlspecialchars($node->getNodeValue(), ENT_NOQUOTES, 'UTF-8'));
}

// Attributes
foreach($node->getAttributes() as $name => $value)
{
$this->writer->writeAttribute($name, $value);
}

// Children
foreach($node->getChildren() as $child)
{
$this->getElement($child);
}

// End create
$this->writer->endElement();

Expand Down

0 comments on commit 1846dea

Please sign in to comment.