gl-website-deployer/admin/phpMyAdmin/libraries/classes/Plugins/Schema/Dia/Dia.php
2024-11-23 20:45:29 +01:00

188 lines
5.7 KiB
PHP

<?php
/**
* Classes to create relation schema in Dia format.
*/
declare(strict_types=1);
namespace PhpMyAdmin\Plugins\Schema\Dia;
use PhpMyAdmin\Core;
use PhpMyAdmin\ResponseRenderer;
use XMLWriter;
use function ob_end_clean;
use function ob_get_clean;
use function strlen;
/**
* This Class inherits the XMLwriter class and
* helps in developing structure of DIA Schema Export
*
* @see https://www.php.net/manual/en/book.xmlwriter.php
*/
class Dia extends XMLWriter
{
/**
* Upon instantiation This starts writing the Dia XML document
*
* @see XMLWriter::openMemory()
* @see XMLWriter::setIndent()
* @see XMLWriter::startDocument()
*/
public function __construct()
{
$this->openMemory();
/*
* Set indenting using three spaces,
* so output is formatted
*/
$this->setIndent(true);
$this->setIndentString(' ');
/*
* Create the XML document
*/
$this->startDocument('1.0', 'UTF-8');
}
/**
* Starts Dia Document
*
* dia document starts by first initializing dia:diagram tag
* then dia:diagramdata contains all the attributes that needed
* to define the document, then finally a Layer starts which
* holds all the objects.
*
* @see XMLWriter::startElement()
* @see XMLWriter::writeAttribute()
* @see XMLWriter::writeRaw()
*
* @param string $paper the size of the paper/document
* @param float $topMargin top margin of the paper/document in cm
* @param float $bottomMargin bottom margin of the paper/document in cm
* @param float $leftMargin left margin of the paper/document in cm
* @param float $rightMargin right margin of the paper/document in cm
* @param string $orientation orientation of the document, portrait or landscape
*/
public function startDiaDoc(
$paper,
$topMargin,
$bottomMargin,
$leftMargin,
$rightMargin,
$orientation
): void {
$isPortrait = 'false';
if ($orientation === 'P') {
$isPortrait = 'true';
}
$this->startElement('dia:diagram');
$this->writeAttribute('xmlns:dia', 'http://www.lysator.liu.se/~alla/dia/');
$this->startElement('dia:diagramdata');
$this->writeRaw(
'<dia:attribute name="background">
<dia:color val="#ffffff"/>
</dia:attribute>
<dia:attribute name="pagebreak">
<dia:color val="#000099"/>
</dia:attribute>
<dia:attribute name="paper">
<dia:composite type="paper">
<dia:attribute name="name">
<dia:string>#' . $paper . '#</dia:string>
</dia:attribute>
<dia:attribute name="tmargin">
<dia:real val="' . $topMargin . '"/>
</dia:attribute>
<dia:attribute name="bmargin">
<dia:real val="' . $bottomMargin . '"/>
</dia:attribute>
<dia:attribute name="lmargin">
<dia:real val="' . $leftMargin . '"/>
</dia:attribute>
<dia:attribute name="rmargin">
<dia:real val="' . $rightMargin . '"/>
</dia:attribute>
<dia:attribute name="is_portrait">
<dia:boolean val="' . $isPortrait . '"/>
</dia:attribute>
<dia:attribute name="scaling">
<dia:real val="1"/>
</dia:attribute>
<dia:attribute name="fitto">
<dia:boolean val="false"/>
</dia:attribute>
</dia:composite>
</dia:attribute>
<dia:attribute name="grid">
<dia:composite type="grid">
<dia:attribute name="width_x">
<dia:real val="1"/>
</dia:attribute>
<dia:attribute name="width_y">
<dia:real val="1"/>
</dia:attribute>
<dia:attribute name="visible_x">
<dia:int val="1"/>
</dia:attribute>
<dia:attribute name="visible_y">
<dia:int val="1"/>
</dia:attribute>
<dia:composite type="color"/>
</dia:composite>
</dia:attribute>
<dia:attribute name="color">
<dia:color val="#d8e5e5"/>
</dia:attribute>
<dia:attribute name="guides">
<dia:composite type="guides">
<dia:attribute name="hguides"/>
<dia:attribute name="vguides"/>
</dia:composite>
</dia:attribute>'
);
$this->endElement();
$this->startElement('dia:layer');
$this->writeAttribute('name', 'Background');
$this->writeAttribute('visible', 'true');
$this->writeAttribute('active', 'true');
}
/**
* Ends Dia Document
*
* @see XMLWriter::endElement()
* @see XMLWriter::endDocument()
*/
public function endDiaDoc(): void
{
$this->endElement();
$this->endDocument();
}
/**
* Output Dia Document for download
*
* @see XMLWriter::flush()
*
* @param string $fileName name of the dia document
*/
public function showOutput($fileName): void
{
if (ob_get_clean()) {
ob_end_clean();
}
$output = $this->flush();
ResponseRenderer::getInstance()->disable();
Core::downloadHeader(
$fileName,
'application/x-dia-diagram',
strlen($output)
);
print $output;
}
}