001package org.apache.maven.doxia.sink;
002
003/*
004 * Licensed to the Apache Software Foundation (ASF) under one
005 * or more contributor license agreements.  See the NOTICE file
006 * distributed with this work for additional information
007 * regarding copyright ownership.  The ASF licenses this file
008 * to you under the Apache License, Version 2.0 (the
009 * "License"); you may not use this file except in compliance
010 * with the License.  You may obtain a copy of the License at
011 *
012 *   http://www.apache.org/licenses/LICENSE-2.0
013 *
014 * Unless required by applicable law or agreed to in writing,
015 * software distributed under the License is distributed on an
016 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
017 * KIND, either express or implied.  See the License for the
018 * specific language governing permissions and limitations
019 * under the License.
020 */
021
022import org.apache.maven.doxia.logging.LogEnabled;
023
024/**
025 * A <i>Sink</i> consumes Doxia events to produce a resultant output format
026 * (eg Docbook, PDF, XHTML...).
027 * <p>
028 *   Doxia allows you to transform any supported input document format (ie for which a Parser exists)
029 *   into any supported output document format (ie for which a Sink exists).
030 * </p>
031 * <p>
032 *   A parser is responsible for reading an input document and emitting a sequence of Doxia events
033 *   which can then be consumed by a Doxia Sink. Thus, you can parse any front- end format
034 *   (eg APT, FML, Xdoc, ...) and have them all contribute to a final XHTML version of a web site.
035 *   All documents being parsed result in a stream of Doxia events (eg paragraph, bold, italic,
036 *   text,...), which are then fed into a XHTML Sink to produce a set of XHTML pages.
037 * </p>
038 * <p>
039 *   A Sink is ultimately responsible for the final format and structure of the output document.
040 *   For example, you can take a collection of APT documents, let a Parser emit a series of Doxia
041 *   events and have that be fed into a Sink to produce a single PDF, a book, a site, or a
042 *   Word document. The Sink is fully responsible for the final output.
043 * </p>
044 * <p>
045 *   You can easily integrate any custom (XML, Wiki,...) format by creating a Doxia Parser which
046 *   reads your input document and produces a proper sequence of Doxia events.
047 *   Those can then be fed into an arbitrary Sink to produce any desired final output.
048 * </p>
049 * <p>
050 * <b>Note</b>: All implemented sink <b>should</b> use UTF-8 as encoding.
051 * </p>
052 *
053 * @since 1.0-alpha-6
054 * @author <a href="mailto:jason@maven.org">Jason van Zyl</a>
055 * @author <a href="mailto:vincent.siveton@gmail.com">Vincent Siveton</a>
056 * @author ltheussl
057 * @version $Id: Sink.html 979316 2016-02-02 21:51:43Z hboutemy $
058 */
059public interface Sink
060    extends LogEnabled
061{
062    /** The Plexus Sink Role. */
063    String ROLE = Sink.class.getName();
064
065    /**
066     * A numbering to handle a number list.
067     * @see #numberedList(int,SinkEventAttributes)
068     */
069    int NUMBERING_DECIMAL = 0;
070
071    /**
072     * A numbering to handle a lower alpha list.
073     * @see #numberedList(int,SinkEventAttributes)
074     */
075    int NUMBERING_LOWER_ALPHA = 1;
076
077    /**
078     * A numbering to handle a upper alpha list.
079     * @see #numberedList(int,SinkEventAttributes)
080     */
081    int NUMBERING_UPPER_ALPHA = 2;
082
083    /**
084     * A numbering to handle a lower roman list.
085     * @see #numberedList(int,SinkEventAttributes)
086     */
087    int NUMBERING_LOWER_ROMAN = 3;
088
089    /**
090     * A numbering to handle a upper roman list.
091     * @see #numberedList(int,SinkEventAttributes)
092     */
093    int NUMBERING_UPPER_ROMAN = 4;
094
095    /**
096     * A level 1 section (section).
097     * @see #section(int,SinkEventAttributes)
098     */
099    int SECTION_LEVEL_1 = 1;
100
101    /**
102     * A level 2 section (subsection).
103     * @see #section(int,SinkEventAttributes)
104     */
105    int SECTION_LEVEL_2 = 2;
106
107    /**
108     * A level 3 section (sub-subsection).
109     * @see #section(int,SinkEventAttributes)
110     */
111    int SECTION_LEVEL_3 = 3;
112
113    /**
114     * A level 4 section (sub-sub-subsection).
115     * @see #section(int,SinkEventAttributes)
116     */
117    int SECTION_LEVEL_4 = 4;
118
119    /**
120     * A level 5 section (sub-sub-sub-subsection).
121     * @see #section(int,SinkEventAttributes)
122     */
123    int SECTION_LEVEL_5 = 5;
124
125    /**
126     * A level 5 section (sub-sub-sub-subsection).
127     * @see #section(int,SinkEventAttributes)
128     */
129    int SECTION_LEVEL_6 = 6;
130
131    /**
132     * Center alignment for table cells.
133     * @see #tableRows(int[], boolean)
134     */
135    int JUSTIFY_CENTER = 0;
136
137    /**
138     * Left alignment for table cells.
139     * @see #tableRows(int[], boolean)
140     */
141    int JUSTIFY_LEFT = 1;
142
143    /**
144     * Right alignment for table cells.
145     * @see #tableRows(int[], boolean)
146     */
147    int JUSTIFY_RIGHT = 2;
148
149    /**
150     * Starts the head element.
151     *
152     * @see #head(SinkEventAttributes)
153     */
154    void head();
155
156    /**
157     * Starts the head element.
158     *
159     * <p>
160     *   This contains information about the current document, (eg its title) that is not
161     *   considered document content. The head element is optional but if it exists, it has to be
162     *   unique within a sequence of Sink events that produces one output document, and it has
163     *   to come before the {@link #body(SinkEventAttributes)} element.
164     * </p>
165     * <p>
166     *   The canonical sequence of events for the head element is:
167     * </p>
168     * <pre>
169     *   sink.head();
170     *
171     *   sink.title();
172     *   sink.text( "Title" );
173     *   sink.title_();
174     *
175     *   sink.author();
176     *   sink.text( "Author" );
177     *   sink.author_();
178     *
179     *   sink.date();
180     *   sink.text( "Date" );
181     *   sink.date_();
182     *
183     *   sink.head_();
184     * </pre>
185     * <p>
186     *   but none of the enclosed events is required.  However, if they exist they have to occur
187     *   in the order shown, and the title() and date() events have to be unique (author() events
188     *   may occur any number of times).
189     * </p>
190     * <p>
191     *   Supported attributes are:
192     * </p>
193     * <blockquote>
194     *   {@link SinkEventAttributes#PROFILE PROFILE}, {@link SinkEventAttributes#LANG LANG}.
195     * </blockquote>
196     *
197     * @param attributes A set of {@link SinkEventAttributes}, may be <code>null</code>.
198     * @since 1.1
199     */
200    void head( SinkEventAttributes attributes );
201
202    /**
203     * Ends the head element.
204     */
205    void head_();
206
207    /**
208     * Starts the title element.
209     *
210     * @see #title(SinkEventAttributes)
211     */
212    void title();
213
214    /**
215     * Starts the title element. This is used to identify the document.
216     *
217     * <p>
218     *   Supported attributes are the {@link SinkEventAttributes base attributes}.
219     * </p>
220     *
221     * @param attributes A set of {@link SinkEventAttributes}, may be <code>null</code>.
222     * @since 1.1
223     * @see #head(SinkEventAttributes)
224     */
225    void title( SinkEventAttributes attributes );
226
227    /**
228     * Ends the title element.
229     */
230    void title_();
231
232    /**
233     * Starts an author element.
234     *
235     * @see #author(SinkEventAttributes)
236     */
237    void author();
238
239    /**
240     * Starts an author element. This is used to identify the author of the document.
241     *
242     * <p>
243     *   Supported attributes are: {@link SinkEventAttributes#EMAIL EMAIL}.
244     * </p>
245     *
246     * @param attributes A set of {@link SinkEventAttributes}, may be <code>null</code>.
247     * @since 1.1
248     * @see #head(SinkEventAttributes)
249     */
250    void author( SinkEventAttributes attributes );
251
252    /**
253     * Ends an author element.
254     */
255    void author_();
256
257    /**
258     * Starts the date element.
259     * <br/>
260     * The date is recommended (but it is not a requirement) to be align to the
261     * <a href="http://www.iso.org/iso/iso_catalogue/catalogue_tc/catalogue_detail.htm?csnumber=26780">ISO-8601</a>
262     * standard, i.e.:
263     * <pre>
264     * YYYY-MM-DD
265     * </pre>
266     * where
267     * <ul>
268     * <li>YYYY is the year in the Gregorian calendar</li>
269     * <li>MM is the month of the year between 01 (January) and 12 (December)</li>
270     * <li>and DD is the day of the month between 01 and 31</li>
271     * </ul>
272     *
273     * @see #date(SinkEventAttributes)
274     */
275    void date();
276
277    /**
278     * Starts the date element. This is used to identify the date of the document.
279     *
280     * <p>
281     *   Supported attributes are: none.
282     * </p>
283     *
284     * @param attributes A set of {@link SinkEventAttributes}, may be <code>null</code>.
285     * @since 1.1
286     * @see #head(SinkEventAttributes)
287     */
288    void date( SinkEventAttributes attributes );
289
290    /**
291     * Ends the date element.
292     */
293    void date_();
294
295    /**
296     * Starts the body of a document.
297     *
298     * @see #body(SinkEventAttributes)
299     */
300    void body();
301
302    /**
303     * Starts the body of a document. This contains the document's content.
304     *
305     * <p>
306     *   Supported attributes are the {@link SinkEventAttributes base attributes}.
307     * </p>
308     *
309     * @param attributes A set of {@link SinkEventAttributes}, may be <code>null</code>.
310     * @since 1.1
311     * @see #head(SinkEventAttributes)
312     */
313    void body( SinkEventAttributes attributes );
314
315    /**
316     * Ends the body element.
317     */
318    void body_();
319
320    /**
321     * Starts a title heading element.
322     */
323    void sectionTitle();
324
325    /**
326     * Ends a title heading element.
327     */
328    void sectionTitle_();
329
330    /**
331     * Starts a first heading element which contains the topic of the section.
332     *
333     * @see #section(int,SinkEventAttributes)
334     */
335    void section1();
336
337    /**
338     * Ends a first heading element.
339     */
340    void section1_();
341
342    /**
343     * Starts a first title heading element. This element is optional, but if it exists,
344     * it has to be contained, and be the first element, within a {@link #section1()} element.
345     *
346     * @see #sectionTitle(int,SinkEventAttributes)
347     */
348    void sectionTitle1();
349
350    /**
351     * Ends a first title heading element.
352     */
353    void sectionTitle1_();
354
355    /**
356     * Starts a second heading element which contains the topic of the section.
357     * This has to be contained within a {@link #section1()} element.
358     *
359     * @see #section(int,SinkEventAttributes)
360     */
361    void section2();
362
363    /**
364     * Ends a second heading element.
365     */
366    void section2_();
367
368    /**
369     * Starts a second title heading element. This element is optional, but if it exists,
370     * it has to be contained, and be the first element, within a {@link #section2()} element.
371     *
372     * @see #sectionTitle(int,SinkEventAttributes)
373     */
374    void sectionTitle2();
375
376    /**
377     * Ends a second title heading element.
378     */
379    void sectionTitle2_();
380
381    /**
382     * Starts a third heading element which contains the topic of the section.
383     * This has to be contained within a {@link #section2()} element.
384     *
385     * @see #section(int,SinkEventAttributes)
386     */
387    void section3();
388
389    /**
390     * Ends a third heading element.
391     */
392    void section3_();
393
394    /**
395     * Starts a third title heading element. This element is optional, but if it exists,
396     * it has to be contained, and be the first element, within a {@link #section3()} element.
397     *
398     * @see #sectionTitle(int,SinkEventAttributes)
399     */
400    void sectionTitle3();
401
402    /**
403     * Ends a third title heading element.
404     */
405    void sectionTitle3_();
406
407    /**
408     * Starts a 4th heading element which contains the topic of the section.
409     * This has to be contained within a {@link #section3()} element.
410     *
411     * @see #section(int,SinkEventAttributes)
412     */
413    void section4();
414
415    /**
416     * Ends a 4th heading element.
417     */
418    void section4_();
419
420    /**
421     * Starts a 4th title heading element. This element is optional, but if it exists,
422     * it has to be contained, and be the first element, within a {@link #section4()} element.
423     *
424     * @see #sectionTitle(int,SinkEventAttributes)
425     */
426    void sectionTitle4();
427
428    /**
429     * Ends a 4th title heading element.
430     */
431    void sectionTitle4_();
432
433    /**
434     * Starts a 5th heading element which contains the topic of the section.
435     * This has to be contained within a {@link #section4()} element.
436     *
437     * @see #section(int,SinkEventAttributes)
438     */
439    void section5();
440
441    /**
442     * Ends a 5th heading element.
443     */
444    void section5_();
445
446    /**
447     * Starts a 5th title heading element. This element is optional, but if it exists,
448     * it has to be contained, and be the first element, within a {@link #section5()} element.
449     *
450     * @see #sectionTitle(int,SinkEventAttributes)
451     */
452    void sectionTitle5();
453
454    /**
455     * Ends a 5th title heading element.
456     */
457    void sectionTitle5_();
458    
459    /**
460     * Starts a 6th heading element which contains the topic of the section.
461     * This has to be contained within a {@link #section5()} element.
462     *
463     * @see #section(int,SinkEventAttributes)
464     * @since 1.7
465     */
466    void section6();
467
468    /**
469     * Ends a 6th heading element.
470     * @since 1.7
471     */
472    void section6_();
473
474    /**
475     * Starts a 6th title heading element. This element is optional, but if it exists,
476     * it has to be contained, and be the first element, within a {@link #section6()} element.
477     *
478     * @see #sectionTitle(int,SinkEventAttributes)
479     * @since 1.7
480     */
481    void sectionTitle6();
482
483    /**
484     * Ends a 6th title heading element.
485     * @since 1.7
486     */
487    void sectionTitle6_();
488
489    /**
490     * Start a new section at the given level.
491     *
492     * <p>
493     *   Sections with higher level have to be entirely contained within sections of lower level.
494     * </p>
495     * <p>
496     *   Supported attributes are the {@link SinkEventAttributes base attributes}.
497     * </p>
498     *
499     * @param level the section level.
500     * @param attributes A set of {@link SinkEventAttributes}, may be <code>null</code>.
501     * @since 1.1
502     */
503    void section( int level, SinkEventAttributes attributes );
504
505    /**
506     * Ends a section at the given level.
507     *
508     * @param level the section level.
509     * @since 1.1
510     */
511    void section_( int level );
512
513    /**
514     * Start a new section title at the given level.
515     *
516     * <p>
517     *    This element is optional, but if it exists, it has to be contained, and be the first
518     *    element, within a corresponding {@link #section(int,SinkEventAttributes) section}
519     *    element of the same level.
520     * </p>
521     * <p>
522     *   <b>NOTE:</b> It is strongly recommended not to make section titles implicit anchors.
523     *   Neither Parsers nor Sinks should insert any content that is not explicitly present
524     *   in the original source document, as this would lead to undefined behaviour for
525     *   multi-format processing chains. However, while Parsers <b>must never</b> emit anchors
526     *   for section titles, some specialized Sinks may implement such a feature if the resulting
527     *   output documents are not going to be further processed (and this is properly documented).
528     * </p>
529     * <p>
530     *   Supported attributes are the {@link SinkEventAttributes base attributes} plus
531     *   {@link SinkEventAttributes#ALIGN ALIGN}.
532     * </p>
533     *
534     * @param level the section title level.
535     * @param attributes A set of {@link SinkEventAttributes}, may be <code>null</code>.
536     * @since 1.1
537     */
538    void sectionTitle( int level, SinkEventAttributes attributes );
539
540    /**
541     * Ends a section title at the given level.
542     *
543     * @param level the section title level.
544     * @since 1.1
545     */
546    void sectionTitle_( int level );
547
548    /**
549     * Starts an unordered list element.
550     *
551     * @see #list(SinkEventAttributes)
552     */
553    void list();
554
555    /**
556     * Starts an unordered list.
557     *
558     * <p>
559     *   Supported attributes are the {@link SinkEventAttributes base attributes}.
560     * </p>
561     *
562     * @param attributes A set of {@link SinkEventAttributes}, may be <code>null</code>.
563     * @since 1.1
564     */
565    void list( SinkEventAttributes attributes );
566
567    /**
568     * Ends an unordered list element.
569     */
570    void list_();
571
572    /**
573     * Starts a list item element within an unordered list.
574     *
575     * @see #listItem(SinkEventAttributes)
576     */
577    void listItem();
578
579    /**
580     * Starts a list item element within an unordered list.
581     *
582     * <p>
583     *   Supported attributes are the {@link SinkEventAttributes base attributes}.
584     * </p>
585     *
586     * @param attributes A set of {@link SinkEventAttributes}, may be <code>null</code>.
587     * @since 1.1
588     */
589    void listItem( SinkEventAttributes attributes );
590
591    /**
592     * Ends a list item element within an unordered list.
593     */
594    void listItem_();
595
596    /**
597     * Starts an ordered list element.
598     *
599     * @param numbering the numbering style.
600     * @see #numberedList(int,SinkEventAttributes)
601     */
602    void numberedList( int numbering );
603
604    /**
605     * Starts an ordered list element.
606     *
607     * <p>
608     *   Supported attributes are the {@link SinkEventAttributes base attributes}.
609     * </p>
610     *
611     * @param numbering the numbering style.
612     * @param attributes A set of {@link SinkEventAttributes}, may be <code>null</code>.
613     * @since 1.1
614     * @see #NUMBERING_DECIMAL
615     * @see #NUMBERING_LOWER_ALPHA
616     * @see #NUMBERING_LOWER_ROMAN
617     * @see #NUMBERING_UPPER_ALPHA
618     * @see #NUMBERING_UPPER_ROMAN
619     */
620    void numberedList( int numbering, SinkEventAttributes attributes );
621
622    /**
623     * Ends an ordered list element.
624     */
625    void numberedList_();
626
627    /**
628     * Starts a list item element within an ordered list.
629     *
630     * @see #numberedListItem(SinkEventAttributes)
631     */
632    void numberedListItem();
633
634    /**
635     * Starts a list item element within an ordered list.
636     *
637     * <p>
638     *   Supported attributes are the {@link SinkEventAttributes base attributes}.
639     * </p>
640     *
641     * @param attributes A set of {@link SinkEventAttributes}, may be <code>null</code>.
642     * @since 1.1
643     */
644    void numberedListItem( SinkEventAttributes attributes );
645
646    /**
647     * Ends a list item element within an ordered list.
648     */
649    void numberedListItem_();
650
651    /**
652     * Starts a definition list element.
653     *
654     * @see #definitionList(SinkEventAttributes)
655     */
656    void definitionList();
657
658    /**
659     * Starts a definition list.
660     *
661     * <p>
662     *   Supported attributes are the {@link SinkEventAttributes base attributes}.
663     * </p>
664     *
665     * @param attributes A set of {@link SinkEventAttributes}, may be <code>null</code>.
666     * @since 1.1
667     */
668    void definitionList( SinkEventAttributes attributes );
669
670    /**
671     * Ends a definition list element.
672     */
673    void definitionList_();
674
675    /**
676     * Starts a list item element within a definition list.
677     *
678     * @see #definitionListItem(SinkEventAttributes)
679     */
680    void definitionListItem();
681
682    /**
683     * Starts a list item element within a definition list.
684     *
685     * <p>
686     *   Every definitionListItem has to contain exactly one {@link #definedTerm(SinkEventAttributes)}
687     *   and one {@link #definition(SinkEventAttributes)}, in this order.
688     * </p>
689     * <p>
690     *   Supported attributes are the {@link SinkEventAttributes base attributes}.
691     * </p>
692     *
693     * @param attributes A set of {@link SinkEventAttributes}, may be <code>null</code>.
694     * @since 1.1
695     */
696    void definitionListItem( SinkEventAttributes attributes );
697
698    /**
699     * Ends a list item element within a definition list.
700     */
701    void definitionListItem_();
702
703    /**
704     * Starts a definition element within a definition list.
705     *
706     * @see #definition(SinkEventAttributes)
707     */
708    void definition();
709
710    /**
711     * Starts a definition element within a definition list.
712     *
713     * <p>
714     *   Supported attributes are the {@link SinkEventAttributes base attributes}.
715     * </p>
716     *
717     * @param attributes A set of {@link SinkEventAttributes}, may be <code>null</code>.
718     * @since 1.1
719     */
720    void definition( SinkEventAttributes attributes );
721
722    /**
723     * Ends a definition element within a definition list.
724     */
725    void definition_();
726
727    /**
728     * Starts a definition term element within a definition list.
729     *
730     * @see #definedTerm(SinkEventAttributes)
731     */
732    void definedTerm();
733
734    /**
735     * Starts a definition term element within a definition list.
736     *
737     * <p>
738     *   Supported attributes are the {@link SinkEventAttributes base attributes}.
739     * </p>
740     *
741     * @param attributes A set of {@link SinkEventAttributes}, may be <code>null</code>.
742     * @since 1.1
743     */
744    void definedTerm( SinkEventAttributes attributes );
745
746    /**
747     * Starts a definition term element within a definition list.
748     */
749    void definedTerm_();
750
751    /**
752     * Starts a basic image embedding element.
753     *
754     * @see #figure(SinkEventAttributes)
755     */
756    void figure();
757
758    /**
759     * Starts a basic image embedding element.
760     *
761     * <p>
762     *   The canonical sequence of events for the figure element is:
763     * </p>
764     * <pre>
765     *   sink.figure();
766     *
767     *   sink.figureGraphics( "figure.png" );
768     *
769     *   sink.figureCaption();
770     *   sink.text( "Figure caption",);
771     *   sink.figureCaption_();
772     *
773     *   sink.figure_();
774     * </pre>
775     * <p>
776     *   where the figureCaption element is optional.
777     * </p>
778     * <p>
779     *   However, <strong>NOTE</strong> that the order of figureCaption and
780     *   figureGraphics events is arbitrary,
781     *   ie a parser may emit the figureCaption before or after the figureGraphics.
782     *   Implementing sinks should be prepared to handle both possibilities.
783     * </p>
784     * <p>
785     *   <strong>NOTE</strong> also that the figureGraphics() event does not have to be embedded
786     *   inside figure(), in particular for in-line images the figureGraphics() should be used
787     *   stand-alone (in HTML language, figureGraphics() produces a <code>&lt;img&gt;</code>
788     *   tag, while figure() opens a paragraph- or <code>&lt;div&gt;</code>- like environment).
789     * </p>
790     * <p>
791     *   Supported attributes are the {@link SinkEventAttributes base attributes}.
792     * </p>
793     *
794     * @param attributes A set of {@link SinkEventAttributes}, may be <code>null</code>.
795     * @since 1.1
796     */
797    void figure( SinkEventAttributes attributes );
798
799    /**
800     * Ends a basic image embedding element.
801     */
802    void figure_();
803
804    /**
805     * Starts a caption of an image element.
806     *
807     * @see #figureCaption(SinkEventAttributes)
808     */
809    void figureCaption();
810
811    /**
812     * Starts a figure caption.
813     *
814     * <p>
815     *   Supported attributes are the {@link SinkEventAttributes base attributes}.
816     * </p>
817     *
818     * @param attributes A set of {@link SinkEventAttributes}, may be <code>null</code>.
819     * @since 1.1
820     * @see #figure(SinkEventAttributes)
821     */
822    void figureCaption( SinkEventAttributes attributes );
823
824    /**
825     * Ends a caption of an image.
826     */
827    void figureCaption_();
828
829    /**
830     * Adding a source of a graphic.
831     *
832     * @param name the source
833     */
834    void figureGraphics( String name );
835
836    /**
837     * Adds a graphic element.
838     *
839     * <p>
840     *   The <code>src</code> parameter should be a valid link, ie it can be an absolute
841     *   URL or a link relative to the current source document.
842     * </p>
843     * <p>
844     *   Supported attributes are the {@link SinkEventAttributes base attributes} plus:
845     * </p>
846     * <blockquote>
847     *   {@link SinkEventAttributes#SRC SRC}, {@link SinkEventAttributes#ALT ALT},
848     *   {@link SinkEventAttributes#WIDTH WIDTH}, {@link SinkEventAttributes#HEIGHT HEIGHT},
849     *   {@link SinkEventAttributes#ALIGN ALIGN}, {@link SinkEventAttributes#BORDER BORDER},
850     *   {@link SinkEventAttributes#HSPACE HSPACE}, {@link SinkEventAttributes#VSPACE VSPACE},
851     *   {@link SinkEventAttributes#ISMAP ISMAP}, {@link SinkEventAttributes#USEMAP USEMAP}.
852     * </blockquote>
853     * <p>
854     *   If the {@link SinkEventAttributes#SRC SRC} attribute is specified in SinkEventAttributes,
855     *   it will be overridden by the <code>src</code> parameter.
856     * </p>
857     *
858     * @param src the image source, a valid URL.
859     * @param attributes A set of {@link SinkEventAttributes}, may be <code>null</code>.
860     * @since 1.1
861     * @see #figure(SinkEventAttributes)
862     */
863    void figureGraphics( String src, SinkEventAttributes attributes );
864
865    /**
866     * Starts a table element for marking up tabular information in a document.
867     *
868     * @see #table(SinkEventAttributes)
869     */
870    void table();
871
872    /**
873     * Starts a table.
874     *
875     * <p>
876     *   The canonical sequence of events for the table element is:
877     * </p>
878     * <pre>
879     *   sink.table();
880     *
881     *   sink.tableRows( justify, true );
882     *
883     *   sink.tableRow();
884     *   sink.tableCell();
885     *   sink.text( "cell 1,1" );
886     *   sink.tableCell_();
887     *   sink.tableCell();
888     *   sink.text( "cell 1,2" );
889     *   sink.tableCell_();
890     *   sink.tableRow_();
891     *
892     *   sink.tableRows_();
893     *
894     *   sink.tableCaption();
895     *   sink.text( "Table caption" );
896     *   sink.tableCaption_();
897     *
898     *   sink.table_();
899     *
900     * </pre>
901     * <p>
902     *   where the tableCaption element is optional.
903     * </p>
904     * <p>
905     *   However, <strong>NOTE</strong> that the order of tableCaption and
906     *   {@link #tableRows(int[],boolean)} events is arbitrary,
907     *   ie a parser may emit the tableCaption before or after the tableRows.
908     *   Implementing sinks should be prepared to handle both possibilities.
909     * </p>
910     * <p>
911     *   Supported attributes are the {@link SinkEventAttributes base attributes} plus:
912     * </p>
913     * <blockquote>
914     *   {@link SinkEventAttributes#ALIGN ALIGN}, {@link SinkEventAttributes#BGCOLOR BGCOLOR},
915     *   {@link SinkEventAttributes#BORDER BORDER}, {@link SinkEventAttributes#CELLPADDING CELLPADDING},
916     *   {@link SinkEventAttributes#CELLSPACING CELLSPACING}, {@link SinkEventAttributes#FRAME FRAME},
917     *   {@link SinkEventAttributes#RULES RULES}, {@link SinkEventAttributes#SUMMARY SUMMARY},
918     *   {@link SinkEventAttributes#WIDTH WIDTH}.
919     * </blockquote>
920     *
921     * @param attributes A set of {@link SinkEventAttributes}, may be <code>null</code>.
922     * @since 1.1
923     */
924    void table( SinkEventAttributes attributes );
925
926    /**
927     * Ends a table element.
928     */
929    void table_();
930
931    /**
932     * Starts an element that contains rows of table data.
933     *
934     * @param justification the default justification of columns.
935     * This can be overridden by individual table rows or table cells.
936     * If null a left alignment is assumed by default. If this array
937     * has less elements than there are columns in the table then the value of
938     * the last array element will be taken as default for the remaining table cells.
939     * @param grid true to provide a grid, false otherwise.
940     * @see #table(SinkEventAttributes)
941     * @see #JUSTIFY_CENTER
942     * @see #JUSTIFY_LEFT
943     * @see #JUSTIFY_RIGHT
944     */
945    void tableRows( int[] justification, boolean grid );
946
947    /**
948     * Ends an element that contains rows of table data.
949     */
950    void tableRows_();
951
952    /**
953     * Starts a row element which acts as a container for a row of table cells.
954     *
955     * @see #tableRow(SinkEventAttributes)
956     */
957    void tableRow();
958
959    /**
960     * Starts a table row.
961     *
962     * <p>
963     *   Supported attributes are the {@link SinkEventAttributes base attributes} plus:
964     * </p>
965     * <blockquote>
966     *   {@link SinkEventAttributes#ALIGN ALIGN}, {@link SinkEventAttributes#BGCOLOR BGCOLOR},
967     *   {@link SinkEventAttributes#VALIGN VALIGN}.
968     * </blockquote>
969     *
970     * @param attributes A set of {@link SinkEventAttributes}, may be <code>null</code>.
971     * @since 1.1
972     */
973    void tableRow( SinkEventAttributes attributes );
974
975    /**
976     * Ends a row element.
977     */
978    void tableRow_();
979
980    /**
981     * Starts a cell element which defines a cell that contains data.
982     *
983     * @see #tableCell(SinkEventAttributes)
984     */
985    void tableCell();
986
987    /**
988     * Starts a cell element which defines a cell that contains data.
989     *
990     * @param width the size of the cell.
991     * @deprecated Use #tableCell(SinkEventAttributes) instead.
992     */
993    void tableCell( String width );
994
995    /**
996     * Starts a table cell.
997     *
998     * <p>
999     *   Supported attributes are the {@link SinkEventAttributes base attributes} plus:
1000     * </p>
1001     * <blockquote>
1002     *   {@link SinkEventAttributes#ABBRV ABBRV}, {@link SinkEventAttributes#ALIGN ALIGN},
1003     *   {@link SinkEventAttributes#AXIS AXIS}, {@link SinkEventAttributes#BGCOLOR BGCOLOR},
1004     *   {@link SinkEventAttributes#COLSPAN COLSPAN}, {@link SinkEventAttributes#HEADERS HEADERS},
1005     *   {@link SinkEventAttributes#HEIGHT HEIGHT}, {@link SinkEventAttributes#NOWRAP NOWRAP},
1006     *   {@link SinkEventAttributes#ROWSPAN ROWSPAN}, {@link SinkEventAttributes#SCOPE SCOPE},
1007     *   {@link SinkEventAttributes#VALIGN VALIGN}, {@link SinkEventAttributes#WIDTH WIDTH}.
1008     * </blockquote>
1009     *
1010     * @param attributes A set of {@link SinkEventAttributes}, may be <code>null</code>.
1011     * @since 1.1
1012     */
1013    void tableCell( SinkEventAttributes attributes );
1014
1015    /**
1016     * Ends a cell element.
1017     */
1018    void tableCell_();
1019
1020    /**
1021     * Starts a cell element which defines a cell that contains header information.
1022     *
1023     * @see #tableHeaderCell(SinkEventAttributes)
1024     */
1025    void tableHeaderCell();
1026
1027    /**
1028     * Starts a cell element which defines a cell that contains header information.
1029     *
1030     * @param width the size of the header cell.
1031     * @deprecated Use #tableHeaderCell(SinkEventAttributes) instead.
1032     */
1033    void tableHeaderCell( String width );
1034
1035    /**
1036     * Starts a table header cell.
1037     *
1038     * <p>
1039     *   Supported attributes are the same as for {@link #tableCell(SinkEventAttributes) tableCell}.
1040     * </p>
1041     *
1042     * @param attributes A set of {@link SinkEventAttributes}, may be <code>null</code>.
1043     * @since 1.1
1044     */
1045    void tableHeaderCell( SinkEventAttributes attributes );
1046
1047    /**
1048     * Ends a cell header element.
1049     */
1050    void tableHeaderCell_();
1051
1052    /**
1053     * Starts a caption element of a table.
1054     *
1055     * @see #tableCaption(SinkEventAttributes)
1056     */
1057    void tableCaption();
1058
1059    /**
1060     * Starts a table caption.
1061     *
1062     * <p>
1063     *   Note that the order of tableCaption and
1064     *   {@link #tableRows(int[],boolean)} events is arbitrary,
1065     *   ie a parser may emit the tableCaption before or after the tableRows.
1066     *   Implementing sinks should be prepared to handle both possibilities.
1067     * </p>
1068     * <p>
1069     *   Supported attributes are the {@link SinkEventAttributes base attributes}
1070     *   plus {@link SinkEventAttributes#ALIGN ALIGN}.
1071     * </p>
1072     *
1073     * @param attributes A set of {@link SinkEventAttributes}, may be <code>null</code>.
1074     * @since 1.1
1075     * @see #table(SinkEventAttributes)
1076     */
1077    void tableCaption( SinkEventAttributes attributes );
1078
1079    /**
1080     * Ends a caption element of a table.
1081     */
1082    void tableCaption_();
1083
1084    /**
1085     * Starts an element which represents a paragraph.
1086     *
1087     * @see #paragraph(SinkEventAttributes)
1088     */
1089    void paragraph();
1090
1091    /**
1092     * Starts a paragraph.
1093     *
1094     * <p>
1095     *   Supported attributes are the {@link SinkEventAttributes base attributes}
1096     *   plus {@link SinkEventAttributes#ALIGN ALIGN}.
1097     * </p>
1098     *
1099     * @param attributes A set of {@link SinkEventAttributes}, may be <code>null</code>.
1100     * @since 1.1
1101     */
1102    void paragraph( SinkEventAttributes attributes );
1103
1104    /**
1105     * Ends a paragraph element.
1106     */
1107    void paragraph_();
1108
1109    /**
1110     * Starts an element which indicates that whitespace in the enclosed text has semantic relevance.
1111     *
1112     * @param boxed true to add a box, false otherwise
1113     * @deprecated Use #verbatim(SinkEventAttributes) instead.
1114     */
1115    void verbatim( boolean boxed );
1116
1117    /**
1118     * Starts a verbatim block, ie a block where whitespace has semantic relevance.
1119     *
1120     * <p>
1121     *   Text in a verbatim block must only be wrapped at the linebreaks in the source,
1122     *   and spaces should not be collapsed. It should be displayed in a fixed-width font to
1123     *   retain the formatting but the overall size may be chosen by the implementation.
1124     * </p>
1125     *
1126     * <p>
1127     *   Most Sink events may be emitted within a verbatim block, the only elements explicitly
1128     *   forbidden are font-changing events and figures. Also, verbatim blocks may not be nested.
1129     * </p>
1130     *
1131     * <p>
1132     *   Supported attributes are the {@link SinkEventAttributes base attributes} plus:
1133     * </p>
1134     * <blockquote>
1135     *   {@link SinkEventAttributes#DECORATION DECORATION} (value: "boxed"),
1136     *   {@link SinkEventAttributes#ALIGN ALIGN}, {@link SinkEventAttributes#WIDTH WIDTH}.
1137     * </blockquote>
1138     *
1139     * @param attributes A set of {@link SinkEventAttributes}, may be <code>null</code>.
1140     * @since 1.1
1141     */
1142    void verbatim( SinkEventAttributes attributes );
1143
1144    /**
1145     * Ends a verbatim element.
1146     */
1147    void verbatim_();
1148
1149    /**
1150     * Adding a separator of sections from a text to each other.
1151     *
1152     * @see #horizontalRule(SinkEventAttributes)
1153     */
1154    void horizontalRule();
1155
1156    /**
1157     * Adds a horizontal separator rule.
1158     *
1159     * <p>
1160     *   Supported attributes are the {@link SinkEventAttributes base attributes} plus:
1161     * </p>
1162     * <blockquote>
1163     *   {@link SinkEventAttributes#ALIGN ALIGN}, {@link SinkEventAttributes#NOSHADE NOSHADE},
1164     *   {@link SinkEventAttributes#SIZE SIZE}, {@link SinkEventAttributes#WIDTH WIDTH}.
1165     * </blockquote>
1166     *
1167     * @param attributes A set of {@link SinkEventAttributes}, may be <code>null</code>.
1168     * @since 1.1
1169     */
1170    void horizontalRule( SinkEventAttributes attributes );
1171
1172    /**
1173     * Adding a new page separator.
1174     */
1175    void pageBreak();
1176
1177    /**
1178     * Starts an element which defines an anchor.
1179     *
1180     * @param name the name of the anchor.
1181     * @see #anchor(String,SinkEventAttributes)
1182     */
1183    void anchor( String name );
1184
1185    /**
1186     * Starts an element which defines an anchor.
1187     *
1188     * <p>
1189     *   The <code>name</code> parameter has to be a valid SGML NAME token.
1190     *   According to the <a href="http://www.w3.org/TR/html4/types.html#type-name">
1191     *   HTML 4.01 specification section 6.2 SGML basic types</a>:
1192     * </p>
1193     * <p>
1194     *   <i>ID and NAME tokens must begin with a letter ([A-Za-z]) and may be
1195     *   followed by any number of letters, digits ([0-9]), hyphens ("-"),
1196     *   underscores ("_"), colons (":"), and periods (".").</i>
1197     * </p>
1198     * <p>
1199     *   Supported attributes are the {@link SinkEventAttributes base attributes}.
1200     *   If {@link SinkEventAttributes#NAME NAME} is specified in the SinkEventAttributes,
1201     *   it will be overwritten by the <code>name</code> parameter.
1202     * </p>
1203     *
1204     * @param name the name of the anchor. This has to be a valid SGML NAME token.
1205     * @param attributes A set of {@link SinkEventAttributes}, may be <code>null</code>.
1206     * @since 1.1
1207     */
1208    void anchor( String name, SinkEventAttributes attributes );
1209
1210    /**
1211     * Ends an anchor element.
1212     */
1213    void anchor_();
1214
1215    /**
1216     * Starts an element which defines a link.
1217     *
1218     * @param name the name of the link.
1219     * @see #link(String,SinkEventAttributes)
1220     */
1221    void link( String name );
1222
1223    /**
1224     * Starts a link.
1225     *
1226     * <p>
1227     *   The <code>name</code> parameter has to be a valid html <code>href</code>
1228     *   parameter, ie for internal links (links to an anchor within the same source
1229     *   document), <code>name</code> should start with the character "#".
1230     * </p>
1231     * <p>
1232     *   Supported attributes are the {@link SinkEventAttributes base attributes} plus:
1233     * </p>
1234     * <blockquote>
1235     *   {@link SinkEventAttributes#CHARSET CHARSET}, {@link SinkEventAttributes#COORDS COORDS},
1236     *   {@link SinkEventAttributes#HREF HREF}, {@link SinkEventAttributes#HREFLANG HREFLANG},
1237     *   {@link SinkEventAttributes#REL REL}, {@link SinkEventAttributes#REV REV},
1238     *   {@link SinkEventAttributes#SHAPE SHAPE}, {@link SinkEventAttributes#TARGET TARGET},
1239     *   {@link SinkEventAttributes#TYPE TYPE}.
1240     * </blockquote>
1241     * <p>
1242     *   If {@link SinkEventAttributes#HREF HREF} is specified in the
1243     *   SinkEventAttributes, it will be overwritten by the <code>name</code> parameter.
1244     * </p>
1245     *
1246     * @param name the name of the link.
1247     * @param attributes A set of {@link SinkEventAttributes}, may be <code>null</code>.
1248     * @since 1.1
1249     */
1250    void link( String name, SinkEventAttributes attributes );
1251
1252    /**
1253     * Ends a link element.
1254     */
1255    void link_();
1256
1257    /**
1258     * Starts an italic element.
1259     *
1260     * Alternatively one may use {@link #text(String,SinkEventAttributes)} with
1261     *              {@link SinkEventAttributes#STYLE STYLE} instead.
1262     */
1263    void italic();
1264
1265    /**
1266     * Ends an italic element.
1267     *
1268     * Alternatively one may use {@link #text(String,SinkEventAttributes)} with
1269     *              {@link SinkEventAttributes#STYLE STYLE} instead.
1270     */
1271    void italic_();
1272
1273    /**
1274     * Starts a bold element.
1275     *
1276     * Alternatively one may use {@link #text(String,SinkEventAttributes)} with
1277     *              {@link SinkEventAttributes#STYLE STYLE} instead.
1278     */
1279    void bold();
1280
1281    /**
1282     * Ends a bold element.
1283     *
1284     * Alternatively one may use {@link #text(String,SinkEventAttributes)} with
1285     *              {@link SinkEventAttributes#STYLE STYLE} instead.
1286     */
1287    void bold_();
1288
1289    /**
1290     * Starts a monospaced element.
1291     *
1292     * Alternatively one may use {@link #text(String,SinkEventAttributes)} with
1293     *              {@link SinkEventAttributes#STYLE STYLE} instead.
1294     */
1295    void monospaced();
1296
1297    /**
1298     * Ends a monospaced element.
1299     *
1300     * Alternatively one may use {@link #text(String,SinkEventAttributes)} with
1301     *              {@link SinkEventAttributes#STYLE STYLE} instead.
1302     */
1303    void monospaced_();
1304
1305    /**
1306     * Adds a line break.
1307     *
1308     * @see #lineBreak(SinkEventAttributes)
1309     */
1310    void lineBreak();
1311
1312    /**
1313     * Adds a line break.
1314     *
1315     * <p>
1316     *   Supported attributes are:
1317     * </p>
1318     * <blockquote>
1319     *   {@link SinkEventAttributes#ID ID}, {@link SinkEventAttributes#CLASS CLASS},
1320     *   {@link SinkEventAttributes#TITLE TITLE}, {@link SinkEventAttributes#STYLE STYLE}.
1321     * </blockquote>
1322     *
1323     * @param attributes A set of {@link SinkEventAttributes}, may be <code>null</code>.
1324     * @since 1.1
1325     */
1326    void lineBreak( SinkEventAttributes attributes );
1327
1328    /**
1329     * Adding a non breaking space, <i>ie</i> a space without any special formatting operations.
1330     */
1331    void nonBreakingSpace();
1332
1333    /**
1334     * Adding a text.
1335     *
1336     * @param text The text to write.
1337     * @see #text(String,SinkEventAttributes)
1338     */
1339    void text( String text );
1340
1341    /**
1342     * Adds a text.
1343     *
1344     * <p>
1345     *   The <code>text</code> parameter should contain only real content, ie any
1346     *   ignorable/collapsable whitespace/EOLs or other pretty-printing should
1347     *   be removed/normalized by a parser.
1348     * </p>
1349     * <p>
1350     *   If <code>text</code> contains any variants of line terminators, they should
1351     *   be normalized to the System EOL by an implementing Sink.
1352     * </p>
1353     * <p>
1354     *   Supported attributes are the {@link SinkEventAttributes base attributes} plus
1355     * </p>
1356     * <blockquote>
1357     *   {@link SinkEventAttributes#VALIGN VALIGN} (values "sub", "sup"),
1358     *   {@link SinkEventAttributes#DECORATION DECORATION} (values "underline", "overline", "line-through"),
1359     *   {@link SinkEventAttributes#STYLE STYLE} (values "italic", "bold", "monospaced").
1360     * </blockquote>
1361     *
1362     * @param text The text to write.
1363     * @param attributes A set of {@link SinkEventAttributes}, may be <code>null</code>.
1364     * @since 1.1
1365     */
1366    void text( String text, SinkEventAttributes attributes );
1367
1368    /**
1369     * Adding a raw text, <i>ie</i> a text without any special formatting operations.
1370     *
1371     * @param text The text to write.
1372     */
1373    void rawText( String text );
1374
1375    /**
1376     * Add a comment.
1377     *
1378     * @param comment The comment to write.
1379     * @since 1.1
1380     */
1381    void comment( String comment );
1382
1383    /**
1384     * Add an unknown event. This may be used by parsers to notify a general Sink about
1385     * an event that doesn't fit into any event defined by the Sink API.
1386     * Depending on the parameters, a Sink may decide whether or not to process the event,
1387     * emit it as raw text, as a comment, log it, etc.
1388     *
1389     * @param name The name of the event.
1390     * @param requiredParams An optional array of required parameters to the event.
1391     * May be <code>null</code>.
1392     * @param attributes A set of {@link SinkEventAttributes}, may be <code>null</code>.
1393     * @since 1.1
1394     */
1395    void unknown( String name, Object[] requiredParams, SinkEventAttributes attributes );
1396
1397    /**
1398     * Flush the writer or the stream, if needed.
1399     * Flushing a previously-flushed Sink has no effect.
1400     */
1401    void flush();
1402
1403    /**
1404     * Close the writer or the stream, if needed.
1405     * Closing a previously-closed Sink has no effect.
1406     */
1407    void close();
1408}