197 lines
5.5 KiB
Plaintext
197 lines
5.5 KiB
Plaintext
|
eZ Component: Document, Design
|
|||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|||
|
|
|||
|
:Author: $Author$
|
|||
|
:Revision: $Revision$
|
|||
|
:Date: $Date$
|
|||
|
|
|||
|
Design description
|
|||
|
==================
|
|||
|
|
|||
|
ezcDocument class (abstract)
|
|||
|
----------------------------
|
|||
|
|
|||
|
This class is the base class for each implemented markup format. The extending
|
|||
|
classes are named like 'ezcDocumentHtmlDocument'.
|
|||
|
|
|||
|
The extending classes implement the required actions to load a file or string
|
|||
|
in the respective markup and return an arbitrary structure describing the
|
|||
|
document and containing all available markup information. For each document
|
|||
|
there will be at least a conversion to the DocBook__ format.
|
|||
|
|
|||
|
The document classes may implement additional interfaces for direct access to
|
|||
|
some converted format, if there are shortcut implementations available, like
|
|||
|
the following example shows::
|
|||
|
|
|||
|
<?php
|
|||
|
class ezcDocumentRstDocument extends ezcDocument implements
|
|||
|
ezcDocumentHtmlConversion
|
|||
|
{
|
|||
|
// Required by ezcDocumentHtmlConversion interface
|
|||
|
public function getAsHtml()
|
|||
|
{
|
|||
|
// Use direct conversion using `rst2html.py`
|
|||
|
}
|
|||
|
}
|
|||
|
?>
|
|||
|
|
|||
|
Beside loading a document all document classes need to implement save()
|
|||
|
method, which returns the document serialized as a string.
|
|||
|
|
|||
|
ezcDocumentWikiBase class
|
|||
|
^^^^^^^^^^^^^^^^^^^^^^^^^
|
|||
|
|
|||
|
There may be extensions, like a basic wiki syntax parser, from the document
|
|||
|
class, which implement a set of parse helper functions for some set of markup
|
|||
|
languages.
|
|||
|
|
|||
|
ezcDocumentConversion interface
|
|||
|
-------------------------------
|
|||
|
|
|||
|
Interface that defines an abstract conversion class. Real conversion classes
|
|||
|
will implement conversion of the given document from one format to another.
|
|||
|
The names of that classes follow the pattern:
|
|||
|
'ezcDocumentRstToHtmlConversion'.
|
|||
|
|
|||
|
The main method of this abstract class, convert(), takes a document of the
|
|||
|
first format and returns a document in the other format. Both objects extend
|
|||
|
the ezcDocument class::
|
|||
|
|
|||
|
<?php
|
|||
|
abstract class ezcDocumentConversion
|
|||
|
{
|
|||
|
/**
|
|||
|
* @return ezcDocument
|
|||
|
*/
|
|||
|
abstract public function convert( ezcDocument $source );
|
|||
|
}
|
|||
|
?>
|
|||
|
|
|||
|
ezcDocumentXsltConversion
|
|||
|
^^^^^^^^^^^^^^^^^^^^^^^^^
|
|||
|
|
|||
|
There are a lot of conversions which may just work on the base of an XSLT. For
|
|||
|
all those conversions an abstract ezcDocumentXsltConversion class is provided,
|
|||
|
which just takes a set of XSLT files to apply to the XML of the source
|
|||
|
document and handles the selection of a proper XSLT engine.
|
|||
|
|
|||
|
ezcDocumentManager
|
|||
|
------------------
|
|||
|
|
|||
|
The document manager knows about the document parsers to use for each format
|
|||
|
and offers a set of static convenient methods to change the used parser for a
|
|||
|
document type, or directly create a document from a string or file. The Syntax
|
|||
|
for accessing the document manager could look like::
|
|||
|
|
|||
|
<?php
|
|||
|
ezcDocumentManager::setFormat( 'rst', 'myCustomRstDocument' );
|
|||
|
$doc = ezcDocumentManager::loadFile( 'rst', '/path/to/my.rst' );
|
|||
|
?>
|
|||
|
|
|||
|
The document manager initiall knows about all internal formats and has them
|
|||
|
registered.
|
|||
|
|
|||
|
ezcDocumentConversionManager
|
|||
|
----------------------------
|
|||
|
|
|||
|
This won't be implemented in the first release.
|
|||
|
|
|||
|
While you may call the conversion directly, the conversion manager has a set
|
|||
|
of registered conversion routes and offers you direct access to the document
|
|||
|
conversions, like::
|
|||
|
|
|||
|
<?php
|
|||
|
$result = ezcDocumentConversionManager::convert(
|
|||
|
'rst', 'xhtml', '/path/to/my.rst'
|
|||
|
);
|
|||
|
?>
|
|||
|
|
|||
|
There will be an interface to overwrite default conversion routes and add or
|
|||
|
change the classes used for some conversion.
|
|||
|
|
|||
|
Multiple conversions
|
|||
|
^^^^^^^^^^^^^^^^^^^^
|
|||
|
|
|||
|
There may be multiple conversion implementations for a set of formats. A
|
|||
|
conversion from ezp4xml to HTML may not only be done by using an XSLT, but also
|
|||
|
using a simple templating enging, based on string replacements, or a
|
|||
|
ezcDocumentTemplateTieIn which uses ezcTemplate to convert between the
|
|||
|
documents.
|
|||
|
|
|||
|
ezcDocumentValidation interface
|
|||
|
-------------------------------
|
|||
|
|
|||
|
The document classes may implement the ezcDocumentValidation, which provides
|
|||
|
the method validate( $file ), which can be used to validate an input file
|
|||
|
before trying to load it.
|
|||
|
|
|||
|
The XML based formats will usually implement this by checking against a
|
|||
|
RelaxNG based document definition.
|
|||
|
|
|||
|
Algorithms
|
|||
|
==========
|
|||
|
|
|||
|
Transforming XML
|
|||
|
----------------
|
|||
|
|
|||
|
XML documents are transformed using XSLT stylesheets and XSL extension for
|
|||
|
PHP. Transformations are done with ezcDocXSLTTransformer class. Optionally
|
|||
|
the transformations may be done by the xsltrans CLI utility.
|
|||
|
|
|||
|
Examples
|
|||
|
========
|
|||
|
|
|||
|
Examples for the usage of the ezcDocument API.
|
|||
|
|
|||
|
Loading a document
|
|||
|
------------------
|
|||
|
|
|||
|
::
|
|||
|
$doc = new ezcDocumentRstDocument();
|
|||
|
$doc->loadFile( '/path/to/my.rst' );
|
|||
|
|
|||
|
Validating a set of documents
|
|||
|
-----------------------------
|
|||
|
|
|||
|
::
|
|||
|
$doc = new ezcDocumentXhtmlDocument();
|
|||
|
$result_1 = $doc->validate( '/path/to/first.htm' );
|
|||
|
$result_2 = $doc->validate( '/path/to/second.htm' );
|
|||
|
|
|||
|
foreach ( $result_1 as $error )
|
|||
|
{
|
|||
|
echo "- {$error->msg} in {$error->line} in {$error->file}.\n";
|
|||
|
}
|
|||
|
|
|||
|
Convert between documents
|
|||
|
-------------------------
|
|||
|
|
|||
|
::
|
|||
|
$doc = new ezcDocumentRstDocument();
|
|||
|
$doc->loadFile( '/path/to/my.rst' );
|
|||
|
|
|||
|
$converter = new ezcDocumentRstToHtmlConversion();
|
|||
|
$converter->option->literalTag = 'code';
|
|||
|
$html = $converter->convert( $doc );
|
|||
|
|
|||
|
// __toString() will of course be implemented, too.
|
|||
|
echo $doc->save();
|
|||
|
|
|||
|
Using the document manager
|
|||
|
--------------------------
|
|||
|
|
|||
|
::
|
|||
|
ezcDocumentManager::setFormat( 'rst', 'myCustomRstHandler' );
|
|||
|
$doc = ezcDocumentManager::loadFile( 'rst', '/path/to/my.rst' );
|
|||
|
|
|||
|
// All errors in the RST syntax should now be magically fixed.
|
|||
|
echo $doc;
|
|||
|
|
|||
|
|
|||
|
..
|
|||
|
Local Variables:
|
|||
|
mode: rst
|
|||
|
fill-column: 79
|
|||
|
End:
|
|||
|
vim: et syn=rst tw=79
|