blob: d138c6ebdb288ac19a248c055bddcfe3aa32718f [file] [log] [blame]
-----
Doxia Developers Centre
-----
Vincent Siveton
------
2008-03-02
------
~~ Licensed to the Apache Software Foundation (ASF) under one
~~ or more contributor license agreements. See the NOTICE file
~~ distributed with this work for additional information
~~ regarding copyright ownership. The ASF licenses this file
~~ to you under the Apache License, Version 2.0 (the
~~ "License"); you may not use this file except in compliance
~~ with the License. You may obtain a copy of the License at
~~
~~ http://www.apache.org/licenses/LICENSE-2.0
~~
~~ Unless required by applicable law or agreed to in writing,
~~ software distributed under the License is distributed on an
~~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
~~ KIND, either express or implied. See the License for the
~~ specific language governing permissions and limitations
~~ under the License.
~~ NOTE: For help with the syntax of this file, see:
~~ http://maven.apache.org/doxia/references/apt-format.html
Using the Doxia Sink API
%{toc|section=1|fromDepth=2|toDepth=2}
* {Transforming documents}
Doxia can be used to transform an arbitrary input document to any supported output format.
The following snippet shows how to use a Doxia <Parser> to transform an apt file to html:
+----
File userDir = new File( System.getProperty ( "user.dir" ) );
File inputFile = new File( userDir, "test.apt" );
File outputFile = new File( userDir, "test.html" );
SinkFactory sinkFactory = (SinkFactory) lookup( SinkFactory.ROLE, "html" ); // Plexus lookup
Sink sink = sinkFactory.createSink( outputFile.getParentFile(), outputFile.getName() ) );
Parser parser = (AptParser) lookup( Parser.ROLE, "apt" ); // Plexus lookup
Reader reader = ReaderFactory.newReader( inputFile, "UTF-8" );
parser.parse( reader, sink );
+----
It is recommended that you use {{{http://plexus.codehaus.org/}Plexus}} to look up the parser. In principle
you could instantiate the parser directly ( <<<Parser parser = new AptParser();>>> )
but then some special features like macros will not be available.
You could also use the {{{http://maven.apache.org/doxia/doxia-tools/doxia-converter/index.html}Doxia Converter Tool}}
to parse a given file/dir to another file/dir.
* {Generating documents}
The snippet below gives a simple example of how
to generate a document using the Doxia Sink API.
+----
/**
* Generate a simple document and emit it
* into the specified sink. The sink is flushed but not closed.
*
* @param sink The sink to receive the events.
*/
public static void generate( Sink sink )
{
sink.head();
sink.title();
sink.text( "Title" );
sink.title_();
sink.author();
sink.text( "Author" );
sink.author_();
sink.date();
sink.text( "Date" );
sink.date_();
sink.head_();
sink.body();
sink.paragraph();
sink.text( "A paragraph of text." );
sink.paragraph_();
sink.section1();
sink.sectionTitle1();
sink.text( "Section title" );
sink.sectionTitle1_();
sink.paragraph();
sink.text( "Paragraph in section." );
sink.paragraph_();
sink.section1_();
sink.body_();
sink.flush();
}
+----
A more complete example that also shows the 'canonical' order of events to use when generating
a document, can be found in the Doxia
{{{./doxia/doxia-core/xref-test/org/apache/maven/doxia/sink/SinkTestDocument.html}SinkTestDocument}}
class.
* {Passing attributes to Sink events}
With Doxia 1.1 a number of methods have been added to the Sink API that
allow to pass a set of attributes to many sink events. A typical use case would be:
+----
SinkEventAttributeSet atts = new SinkEventAttributeSet();
atts.addAttribute( SinkEventAttributes.ALIGN, "center" );
sink.paragraph( atts );
+----
What kind of attributes are supported depends on the event and the sink
implementation. The sink API specifies a list of suggested attribute
names that sinks are expected to recognize, and parsers are expected to use
preferably when emitting events.
* {Avoid sink.rawText!}
In <<Doxia 1.0>> it was a common practice to use sink.rawText() to generate elements that
were not supported by the Sink API. For example, the following snippet could be used
to generate a styled HTML \<div\> block:
+----
sink.RawText( "<div style=\"cool\">" );
sink.text( "A text with a cool style." );
sink.rawText( "</div>" );
+----
This has a major drawback however: it only works if the receiving Sink is a HTML Sink.
In other words, the above method will not work for target documents in any other format than HTML
(think of the FO Sink to generate a pdf, or a LaTeX sink,...).
In <<Doxia 1.1>> a new method unknown() was added to the Sink API that can be used to emit
an arbitrary event without making special assumptions about the receiving Sink.
Depending on the parameters, a Sink may decide whether or not to process the event,
emit it as raw text, as a comment, log it, etc.
The correct way to generate the above \<div\> block is now:
+----
SinkEventAttributeSet atts = new SinkEventAttributeSet();
atts.addAttribute( SinkEventAttributes.STYLE, "cool" );
sink.unknown( "div", new Object[]{new Integer( HtmlMarkup.TAG_TYPE_START )}, atts );
sink.text( "A text with a cool style." );
sink.unknown( "div", new Object[]{new Integer( HtmlMarkup.TAG_TYPE_END )}, null );
+----
Read the javadocs of the unknown() method in the
{{{./doxia/doxia-sink-api/apidocs/org/apache/maven/doxia/sink/Sink.html}Sink}} interface and the
{{{./doxia/doxia-core/apidocs/org/apache/maven/doxia/sink/XhtmlBaseSink.html}XhtmlbaseSink}}
for information on the method parameters.
Note that an arbitrary sink may be expected to ignore the unknown event completely!
<<In general, the rawText method should be avoided alltogether when emitting events into an arbitrary Sink.>>
* {How to inject javascript code into HTML}
Related to the above, here is the correct way of injecting a javascript snippet into a Sink:
+----
// the javascript code is emitted within a commented CDATA section
// so we have to start with a newline and comment the CDATA closing in the end
// note that the sink will replace the newline by the system EOL
String javascriptCode = "\n function javascriptFunction() {...} \n //";
SinkEventAttributeSet atts = new SinkEventAttributeSet();
atts.addAttribute( SinkEventAttributes.TYPE, "text/javascript" );
sink.unknown( "script", new Object[]{new Integer( HtmlMarkup.TAG_TYPE_START )}, atts );
sink.unknown( "cdata", new Object[]{new Integer( HtmlMarkup.CDATA_TYPE ), javascriptCode }, null );
sink.unknown( "script", new Object[]{new Integer( HtmlMarkup.TAG_TYPE_END )}, null );
+----
* {References}
* {{{../modules/index.html}Doxia Modules Guide}}
* {{{../macros/index.html}Doxia Macros Guide}}
* {{{../doxia/apidocs/index.html}Doxia API Reference}}
* {{{../doxia-sitetools/apidocs/index.html}Doxia Sitetools API Reference}}
[]