Skip to content

Files

Latest commit

Jun 22, 2024
22869ae · Jun 22, 2024

History

History
106 lines (82 loc) · 3.61 KB

QRMarkupXML.md

File metadata and controls

106 lines (82 loc) · 3.61 KB

QRMarkupXML

Class QRMarkupXML: eXtensible Markup Language (XML) output

Example

See: XML example

Set the options:

$options = new QROptions;

$options->outputInterface  = QRMarkupXML::class;
$options->outputBase64     = false;
// if set to false, the light modules won't be included in the output
$options->drawLightModules = false;

// assign an XSLT stylesheet
$options->xmlStylesheet    = './qrcode.style.xsl';

$options->moduleValues     = [
	QRMatrix::M_FINDER_DARK    => '#A71111', // dark (true)
	QRMatrix::M_FINDER_DOT     => '#A71111', // finder dot, dark (true)
	QRMatrix::M_FINDER         => '#FFBFBF', // light (false)
	QRMatrix::M_ALIGNMENT_DARK => '#A70364',
	QRMatrix::M_ALIGNMENT      => '#FFC9C9',
	QRMatrix::M_VERSION_DARK   => '#650098',
	QRMatrix::M_VERSION        => '#E0B8FF',
];

The XSLT stylesheet qrcode.style.xsl:

<?xml version="1.0" encoding="UTF-8"?>
<!-- XSLT style for the XML output example -->
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
	<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
	<xsl:template match="/">
		<!-- SVG header -->
		<svg xmlns="http://www.w3.org/2000/svg"
		     version="1.0"
		     viewBox="0 0 {qrcode/matrix/@width} {qrcode/matrix/@height}"
		     preserveAspectRatio="xMidYMid"
		>
			<!--
				path for a single module
				we could define a path for each layer and use the @layer attribute for selection,
				but that would exaggerate this example
			-->
			<symbol id="module" width="1" height="1">
				<circle cx="0.5" cy="0.5" r="0.4" />
			</symbol>
			<!-- loop over the rows -->
			<xsl:for-each select="qrcode/matrix/row">
				<!-- set a variable for $y (vertical) -->
				<xsl:variable name="y" select="@y"/>
				<xsl:for-each select="module">
					<!-- set a variable for $x (horizontal) -->
					<xsl:variable name="x" select="@x"/>
					<!-- draw only dark modules -->
					<xsl:if test="@dark='true'">
						<!-- position the module and set its fill color -->
						<use href="#module" class="{@layer}" x="{$x}" y="{$y}" fill="{@value}"/>
					</xsl:if>
				</xsl:for-each>
			</xsl:for-each>
		</svg>
	</xsl:template>
</xsl:stylesheet>

Render the output:

$data = 'https://www.youtube.com/watch?v=dQw4w9WgXcQ';
$out  = (new QRCode($options))->render($data); // -> XML, rendered as SVG

header('Content-type: application/xml');

echo $out;

The associated XML schema can be found over at GitHub: qrcode.schema.xsd

Additional methods

method return description
(protected) createMatrix() DOMElement creates the matrix element
(protected) row(int $y, array $row) DOMElement|null creates a DOM element for a matrix row
(protected) module(int $x, int $y, int $M_TYPE) DOMElement|null creates a DOM element for a single module

Options that affect this class

property type
$drawLightModules bool
$outputBase64 bool
xmlStylesheet string