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$
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     *
260     * @see #date(SinkEventAttributes)
261     */
262    void date();
263
264    /**
265     * Starts the date element. This is used to identify the date of the document: there is no strict definition
266     * if it is <b>creation date</b> or <b>last modification date</b>, which are the 2 classical semantics.
267     * There is no formal formatting requirements either.
268     * <br>
269     * The date is recommended (but it is not a requirement) to be aligned to the
270     * <a href="http://www.iso.org/iso/iso_catalogue/catalogue_tc/catalogue_detail.htm?csnumber=26780">ISO-8601</a>
271     * standard, i.e.:
272     * <pre>YYYY-MM-DD</pre>
273     * where
274     * <ul>
275     * <li><code>YYYY</code> is the year in the Gregorian calendar,</li>
276     * <li><code>MM</code> is the month of the year between 01 (January) and 12 (December),</li>
277     * <li>and <code>DD</code> is the day of the month between 01 and 31.</li>
278     * </ul>
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 an article within a document.
322     *
323     * @see #article(SinkEventAttributes)
324     */
325    void article();
326
327    /**
328     * Starts an article within a document.
329     *
330     * <p>
331     *   Supported attributes are the {@link SinkEventAttributes base attributes}.
332     * </p>
333     *
334     * @param attributes A set of {@link SinkEventAttributes}, may be <code>null</code>.
335     * @since 2.0
336     */
337    void article( SinkEventAttributes attributes );
338
339    /**
340     * Ends the article element.
341     */
342    void article_();
343
344    /**
345     * Starts a navigation section within a document.
346     *
347     * @see #navigation(SinkEventAttributes)
348     */
349    void navigation();
350
351    /**
352     * Starts a navigation section within a document.
353     *
354     * <p>
355     *   Supported attributes are the {@link SinkEventAttributes base attributes}.
356     * </p>
357     *
358     * @param attributes A set of {@link SinkEventAttributes}, may be <code>null</code>.
359     * @since 2.0
360     * @see #navigation(SinkEventAttributes)
361     */
362    void navigation( SinkEventAttributes attributes );
363
364    /**
365     * Ends the navigation element.
366     */
367    void navigation_();
368
369    /**
370     * Starts a sidebar section within a document.
371     *
372     * @see #sidebar(SinkEventAttributes)
373     */
374    void sidebar();
375
376    /**
377     * Starts a sidebar section within a document.
378     *
379     * <p>
380     *   Supported attributes are the {@link SinkEventAttributes base attributes}.
381     * </p>
382     *
383     * @param attributes A set of {@link SinkEventAttributes}, may be <code>null</code>.
384     * @since 2.0
385     */
386    void sidebar( SinkEventAttributes attributes );
387
388    /**
389     * Ends the sidebar element.
390     */
391    void sidebar_();
392
393    /**
394     * Starts a title heading element.
395     */
396    void sectionTitle();
397
398    /**
399     * Ends a title heading element.
400     */
401    void sectionTitle_();
402
403    /**
404     * Starts a first heading element which contains the topic of the section.
405     *
406     * @see #section(int,SinkEventAttributes)
407     */
408    void section1();
409
410    /**
411     * Ends a first heading element.
412     */
413    void section1_();
414
415    /**
416     * Starts a first title heading element. This element is optional, but if it exists,
417     * it has to be contained, and be the first element, within a {@link #section1()} element.
418     *
419     * @see #sectionTitle(int,SinkEventAttributes)
420     */
421    void sectionTitle1();
422
423    /**
424     * Ends a first title heading element.
425     */
426    void sectionTitle1_();
427
428    /**
429     * Starts a second heading element which contains the topic of the section.
430     * This has to be contained within a {@link #section1()} element.
431     *
432     * @see #section(int,SinkEventAttributes)
433     */
434    void section2();
435
436    /**
437     * Ends a second heading element.
438     */
439    void section2_();
440
441    /**
442     * Starts a second title heading element. This element is optional, but if it exists,
443     * it has to be contained, and be the first element, within a {@link #section2()} element.
444     *
445     * @see #sectionTitle(int,SinkEventAttributes)
446     */
447    void sectionTitle2();
448
449    /**
450     * Ends a second title heading element.
451     */
452    void sectionTitle2_();
453
454    /**
455     * Starts a third heading element which contains the topic of the section.
456     * This has to be contained within a {@link #section2()} element.
457     *
458     * @see #section(int,SinkEventAttributes)
459     */
460    void section3();
461
462    /**
463     * Ends a third heading element.
464     */
465    void section3_();
466
467    /**
468     * Starts a third title heading element. This element is optional, but if it exists,
469     * it has to be contained, and be the first element, within a {@link #section3()} element.
470     *
471     * @see #sectionTitle(int,SinkEventAttributes)
472     */
473    void sectionTitle3();
474
475    /**
476     * Ends a third title heading element.
477     */
478    void sectionTitle3_();
479
480    /**
481     * Starts a 4th heading element which contains the topic of the section.
482     * This has to be contained within a {@link #section3()} element.
483     *
484     * @see #section(int,SinkEventAttributes)
485     */
486    void section4();
487
488    /**
489     * Ends a 4th heading element.
490     */
491    void section4_();
492
493    /**
494     * Starts a 4th title heading element. This element is optional, but if it exists,
495     * it has to be contained, and be the first element, within a {@link #section4()} element.
496     *
497     * @see #sectionTitle(int,SinkEventAttributes)
498     */
499    void sectionTitle4();
500
501    /**
502     * Ends a 4th title heading element.
503     */
504    void sectionTitle4_();
505
506    /**
507     * Starts a 5th heading element which contains the topic of the section.
508     * This has to be contained within a {@link #section4()} element.
509     *
510     * @see #section(int,SinkEventAttributes)
511     */
512    void section5();
513
514    /**
515     * Ends a 5th heading element.
516     */
517    void section5_();
518
519    /**
520     * Starts a 5th title heading element. This element is optional, but if it exists,
521     * it has to be contained, and be the first element, within a {@link #section5()} element.
522     *
523     * @see #sectionTitle(int,SinkEventAttributes)
524     */
525    void sectionTitle5();
526
527    /**
528     * Ends a 5th title heading element.
529     */
530    void sectionTitle5_();
531
532    /**
533     * Starts a 6th heading element which contains the topic of the section.
534     * This has to be contained within a {@link #section5()} element.
535     *
536     * @see #section(int,SinkEventAttributes)
537     * @since 1.7
538     */
539    void section6();
540
541    /**
542     * Ends a 6th heading element.
543     * @since 1.7
544     */
545    void section6_();
546
547    /**
548     * Starts a 6th title heading element. This element is optional, but if it exists,
549     * it has to be contained, and be the first element, within a {@link #section6()} element.
550     *
551     * @see #sectionTitle(int,SinkEventAttributes)
552     * @since 1.7
553     */
554    void sectionTitle6();
555
556    /**
557     * Ends a 6th title heading element.
558     * @since 1.7
559     */
560    void sectionTitle6_();
561
562    /**
563     * Start a new section at the given level.
564     *
565     * <p>
566     *   Sections with higher level have to be entirely contained within sections of lower level.
567     * </p>
568     * <p>
569     *   Supported attributes are the {@link SinkEventAttributes base attributes}.
570     * </p>
571     *
572     * @param level the section level.
573     * @param attributes A set of {@link SinkEventAttributes}, may be <code>null</code>.
574     * @since 1.1
575     */
576    void section( int level, SinkEventAttributes attributes );
577
578    /**
579     * Ends a section at the given level.
580     *
581     * @param level the section level.
582     * @since 1.1
583     */
584    void section_( int level );
585
586    /**
587     * Start a new section title at the given level.
588     *
589     * <p>
590     *    This element is optional, but if it exists, it has to be contained, and be the first
591     *    element, within a corresponding {@link #section(int,SinkEventAttributes) section}
592     *    element of the same level.
593     * </p>
594     * <p>
595     *   <b>NOTE:</b> It is strongly recommended not to make section titles implicit anchors.
596     *   Neither Parsers nor Sinks should insert any content that is not explicitly present
597     *   in the original source document, as this would lead to undefined behaviour for
598     *   multi-format processing chains. However, while Parsers <b>must never</b> emit anchors
599     *   for section titles, some specialized Sinks may implement such a feature if the resulting
600     *   output documents are not going to be further processed (and this is properly documented).
601     * </p>
602     * <p>
603     *   Supported attributes are the {@link SinkEventAttributes base attributes} plus
604     *   {@link SinkEventAttributes#ALIGN ALIGN}.
605     * </p>
606     *
607     * @param level the section title level.
608     * @param attributes A set of {@link SinkEventAttributes}, may be <code>null</code>.
609     * @since 1.1
610     */
611    void sectionTitle( int level, SinkEventAttributes attributes );
612
613    /**
614     * Ends a section title at the given level.
615     *
616     * @param level the section title level.
617     * @since 1.1
618     */
619    void sectionTitle_( int level );
620
621    /**
622     * Start a new header within the section or body.
623     */
624    void header();
625
626    /**
627     * Start a new header within the section or body.
628     *
629     * <p>
630     *   Supported attributes are the {@link SinkEventAttributes base attributes}.
631     * </p>
632     *
633     * @param attributes A set of {@link SinkEventAttributes}, may be <code>null</code>.
634     * @since 2.0
635     */
636    void header( SinkEventAttributes attributes );
637
638    /**
639     * Ends a header element.
640     */
641    void header_();
642
643    /**
644     * Start the main content section between the header and the
645     * footer within the sections and/or body.
646     */
647    void content();
648
649    /**
650     * Start the main content section between the header and the
651     * footer within the sections and/or body.
652     *
653     * <p>
654     *   Supported attributes are the {@link SinkEventAttributes base attributes}.
655     * </p>
656     *
657     * @param attributes A set of {@link SinkEventAttributes}, may be <code>null</code>.
658     * @since 2.0
659     */
660    void content( SinkEventAttributes attributes );
661
662    /**
663     * Ends a main content section.
664     */
665    void content_();
666
667    /**
668     * Start a new footer within the section or body.
669     */
670    void footer();
671
672    /**
673     * Start a new footer within the section or body.
674     *
675     * <p>
676     *   Supported attributes are the {@link SinkEventAttributes base attributes}.
677     * </p>
678     *
679     * @param attributes A set of {@link SinkEventAttributes}, may be <code>null</code>.
680     * @since 2.0
681     */
682    void footer( SinkEventAttributes attributes );
683
684    /**
685     * Ends a footer element.
686     */
687    void footer_();
688
689    /**
690     * Starts an unordered list element.
691     *
692     * @see #list(SinkEventAttributes)
693     */
694    void list();
695
696    /**
697     * Starts an unordered list.
698     *
699     * <p>
700     *   Supported attributes are the {@link SinkEventAttributes base attributes}.
701     * </p>
702     *
703     * @param attributes A set of {@link SinkEventAttributes}, may be <code>null</code>.
704     * @since 1.1
705     */
706    void list( SinkEventAttributes attributes );
707
708    /**
709     * Ends an unordered list element.
710     */
711    void list_();
712
713    /**
714     * Starts a list item element within an unordered list.
715     *
716     * @see #listItem(SinkEventAttributes)
717     */
718    void listItem();
719
720    /**
721     * Starts a list item element within an unordered list.
722     *
723     * <p>
724     *   Supported attributes are the {@link SinkEventAttributes base attributes}.
725     * </p>
726     *
727     * @param attributes A set of {@link SinkEventAttributes}, may be <code>null</code>.
728     * @since 1.1
729     */
730    void listItem( SinkEventAttributes attributes );
731
732    /**
733     * Ends a list item element within an unordered list.
734     */
735    void listItem_();
736
737    /**
738     * Starts an ordered list element.
739     *
740     * @param numbering the numbering style.
741     * @see #numberedList(int,SinkEventAttributes)
742     */
743    void numberedList( int numbering );
744
745    /**
746     * Starts an ordered list element.
747     *
748     * <p>
749     *   Supported attributes are the {@link SinkEventAttributes base attributes}.
750     * </p>
751     *
752     * @param numbering the numbering style.
753     * @param attributes A set of {@link SinkEventAttributes}, may be <code>null</code>.
754     * @since 1.1
755     * @see #NUMBERING_DECIMAL
756     * @see #NUMBERING_LOWER_ALPHA
757     * @see #NUMBERING_LOWER_ROMAN
758     * @see #NUMBERING_UPPER_ALPHA
759     * @see #NUMBERING_UPPER_ROMAN
760     */
761    void numberedList( int numbering, SinkEventAttributes attributes );
762
763    /**
764     * Ends an ordered list element.
765     */
766    void numberedList_();
767
768    /**
769     * Starts a list item element within an ordered list.
770     *
771     * @see #numberedListItem(SinkEventAttributes)
772     */
773    void numberedListItem();
774
775    /**
776     * Starts a list item element within an ordered list.
777     *
778     * <p>
779     *   Supported attributes are the {@link SinkEventAttributes base attributes}.
780     * </p>
781     *
782     * @param attributes A set of {@link SinkEventAttributes}, may be <code>null</code>.
783     * @since 1.1
784     */
785    void numberedListItem( SinkEventAttributes attributes );
786
787    /**
788     * Ends a list item element within an ordered list.
789     */
790    void numberedListItem_();
791
792    /**
793     * Starts a definition list element.
794     *
795     * @see #definitionList(SinkEventAttributes)
796     */
797    void definitionList();
798
799    /**
800     * Starts a definition list.
801     *
802     * <p>
803     *   Supported attributes are the {@link SinkEventAttributes base attributes}.
804     * </p>
805     *
806     * @param attributes A set of {@link SinkEventAttributes}, may be <code>null</code>.
807     * @since 1.1
808     */
809    void definitionList( SinkEventAttributes attributes );
810
811    /**
812     * Ends a definition list element.
813     */
814    void definitionList_();
815
816    /**
817     * Starts a list item element within a definition list.
818     *
819     * @see #definitionListItem(SinkEventAttributes)
820     */
821    void definitionListItem();
822
823    /**
824     * Starts a list item element within a definition list.
825     *
826     * <p>
827     *   Every definitionListItem has to contain exactly one {@link #definedTerm(SinkEventAttributes)}
828     *   and one {@link #definition(SinkEventAttributes)}, in this order.
829     * </p>
830     * <p>
831     *   Supported attributes are the {@link SinkEventAttributes base attributes}.
832     * </p>
833     *
834     * @param attributes A set of {@link SinkEventAttributes}, may be <code>null</code>.
835     * @since 1.1
836     */
837    void definitionListItem( SinkEventAttributes attributes );
838
839    /**
840     * Ends a list item element within a definition list.
841     */
842    void definitionListItem_();
843
844    /**
845     * Starts a definition element within a definition list.
846     *
847     * @see #definition(SinkEventAttributes)
848     */
849    void definition();
850
851    /**
852     * Starts a definition element within a definition list.
853     *
854     * <p>
855     *   Supported attributes are the {@link SinkEventAttributes base attributes}.
856     * </p>
857     *
858     * @param attributes A set of {@link SinkEventAttributes}, may be <code>null</code>.
859     * @since 1.1
860     */
861    void definition( SinkEventAttributes attributes );
862
863    /**
864     * Ends a definition element within a definition list.
865     */
866    void definition_();
867
868    /**
869     * Starts a definition term element within a definition list.
870     *
871     * @see #definedTerm(SinkEventAttributes)
872     */
873    void definedTerm();
874
875    /**
876     * Starts a definition term element within a definition list.
877     *
878     * <p>
879     *   Supported attributes are the {@link SinkEventAttributes base attributes}.
880     * </p>
881     *
882     * @param attributes A set of {@link SinkEventAttributes}, may be <code>null</code>.
883     * @since 1.1
884     */
885    void definedTerm( SinkEventAttributes attributes );
886
887    /**
888     * Ends a definition term element within a definition list.
889     */
890    void definedTerm_();
891
892    /**
893     * Starts a basic image embedding element.
894     *
895     * @see #figure(SinkEventAttributes)
896     */
897    void figure();
898
899    /**
900     * Starts a basic image embedding element.
901     *
902     * <p>
903     *   The canonical sequence of events for the figure element is:
904     * </p>
905     * <pre>
906     *   sink.figure();
907     *
908     *   sink.figureGraphics( "figure.png" );
909     *
910     *   sink.figureCaption();
911     *   sink.text( "Figure caption",);
912     *   sink.figureCaption_();
913     *
914     *   sink.figure_();
915     * </pre>
916     * <p>
917     *   where the figureCaption element is optional.
918     * </p>
919     * <p>
920     *   However, <strong>NOTE</strong> that the order of figureCaption and
921     *   figureGraphics events is arbitrary,
922     *   ie a parser may emit the figureCaption before or after the figureGraphics.
923     *   Implementing sinks should be prepared to handle both possibilities.
924     * </p>
925     * <p>
926     *   <strong>NOTE</strong> also that the figureGraphics() event does not have to be embedded
927     *   inside figure(), in particular for in-line images the figureGraphics() should be used
928     *   stand-alone (in HTML language, figureGraphics() produces a <code>&lt;img&gt;</code>
929     *   tag, while figure() opens a paragraph- or <code>&lt;div&gt;</code>- like environment).
930     * </p>
931     * <p>
932     *   Supported attributes are the {@link SinkEventAttributes base attributes}.
933     * </p>
934     *
935     * @param attributes A set of {@link SinkEventAttributes}, may be <code>null</code>.
936     * @since 1.1
937     */
938    void figure( SinkEventAttributes attributes );
939
940    /**
941     * Ends a basic image embedding element.
942     */
943    void figure_();
944
945    /**
946     * Starts a caption of an image element.
947     *
948     * @see #figureCaption(SinkEventAttributes)
949     */
950    void figureCaption();
951
952    /**
953     * Starts a figure caption.
954     *
955     * <p>
956     *   Supported attributes are the {@link SinkEventAttributes base attributes}.
957     * </p>
958     *
959     * @param attributes A set of {@link SinkEventAttributes}, may be <code>null</code>.
960     * @since 1.1
961     * @see #figure(SinkEventAttributes)
962     */
963    void figureCaption( SinkEventAttributes attributes );
964
965    /**
966     * Ends a caption of an image.
967     */
968    void figureCaption_();
969
970    /**
971     * Adding a source of a graphic.
972     *
973     * @param name the source
974     */
975    void figureGraphics( String name );
976
977    /**
978     * Adds a graphic element.
979     *
980     * <p>
981     *   The <code>src</code> parameter should be a valid link, ie it can be an absolute
982     *   URL or a link relative to the current source document.
983     * </p>
984     * <p>
985     *   Supported attributes are the {@link SinkEventAttributes base attributes} plus:
986     * </p>
987     * <blockquote>
988     *   {@link SinkEventAttributes#SRC SRC}, {@link SinkEventAttributes#ALT ALT},
989     *   {@link SinkEventAttributes#WIDTH WIDTH}, {@link SinkEventAttributes#HEIGHT HEIGHT},
990     *   {@link SinkEventAttributes#ALIGN ALIGN}, {@link SinkEventAttributes#BORDER BORDER},
991     *   {@link SinkEventAttributes#HSPACE HSPACE}, {@link SinkEventAttributes#VSPACE VSPACE},
992     *   {@link SinkEventAttributes#ISMAP ISMAP}, {@link SinkEventAttributes#USEMAP USEMAP}.
993     * </blockquote>
994     * <p>
995     *   If the {@link SinkEventAttributes#SRC SRC} attribute is specified in SinkEventAttributes,
996     *   it will be overridden by the <code>src</code> parameter.
997     * </p>
998     *
999     * @param src the image source, a valid URL.
1000     * @param attributes A set of {@link SinkEventAttributes}, may be <code>null</code>.
1001     * @since 1.1
1002     * @see #figure(SinkEventAttributes)
1003     */
1004    void figureGraphics( String src, SinkEventAttributes attributes );
1005
1006    /**
1007     * Starts a table element for marking up tabular information in a document.
1008     *
1009     * @see #table(SinkEventAttributes)
1010     */
1011    void table();
1012
1013    /**
1014     * Starts a table.
1015     *
1016     * <p>
1017     *   The canonical sequence of events for the table element is:
1018     * </p>
1019     * <pre>
1020     *   sink.table();
1021     *
1022     *   sink.tableRows( justify, true );
1023     *
1024     *   sink.tableRow();
1025     *   sink.tableCell();
1026     *   sink.text( "cell 1,1" );
1027     *   sink.tableCell_();
1028     *   sink.tableCell();
1029     *   sink.text( "cell 1,2" );
1030     *   sink.tableCell_();
1031     *   sink.tableRow_();
1032     *
1033     *   sink.tableRows_();
1034     *
1035     *   sink.tableCaption();
1036     *   sink.text( "Table caption" );
1037     *   sink.tableCaption_();
1038     *
1039     *   sink.table_();
1040     *
1041     * </pre>
1042     * <p>
1043     *   where the tableCaption element is optional.
1044     * </p>
1045     * <p>
1046     *   However, <strong>NOTE</strong> that the order of tableCaption and
1047     *   {@link #tableRows(int[],boolean)} events is arbitrary,
1048     *   ie a parser may emit the tableCaption before or after the tableRows.
1049     *   Implementing sinks should be prepared to handle both possibilities.
1050     * </p>
1051     * <p>
1052     *   Supported attributes are the {@link SinkEventAttributes base attributes} plus:
1053     * </p>
1054     * <blockquote>
1055     *   {@link SinkEventAttributes#ALIGN ALIGN}, {@link SinkEventAttributes#BGCOLOR BGCOLOR},
1056     *   {@link SinkEventAttributes#BORDER BORDER}, {@link SinkEventAttributes#CELLPADDING CELLPADDING},
1057     *   {@link SinkEventAttributes#CELLSPACING CELLSPACING}, {@link SinkEventAttributes#FRAME FRAME},
1058     *   {@link SinkEventAttributes#RULES RULES}, {@link SinkEventAttributes#SUMMARY SUMMARY},
1059     *   {@link SinkEventAttributes#WIDTH WIDTH}.
1060     * </blockquote>
1061     *
1062     * @param attributes A set of {@link SinkEventAttributes}, may be <code>null</code>.
1063     * @since 1.1
1064     */
1065    void table( SinkEventAttributes attributes );
1066
1067    /**
1068     * Ends a table element.
1069     */
1070    void table_();
1071
1072    /**
1073     * Starts an element that contains rows of table data.
1074     *
1075     * @param justification the default justification of columns.
1076     * This can be overridden by individual table rows or table cells.
1077     * If null a left alignment is assumed by default. If this array
1078     * has less elements than there are columns in the table then the value of
1079     * the last array element will be taken as default for the remaining table cells.
1080     * @param grid true to provide a grid, false otherwise.
1081     * @see #table(SinkEventAttributes)
1082     * @see #JUSTIFY_CENTER
1083     * @see #JUSTIFY_LEFT
1084     * @see #JUSTIFY_RIGHT
1085     */
1086    void tableRows( int[] justification, boolean grid );
1087
1088    /**
1089     * Ends an element that contains rows of table data.
1090     */
1091    void tableRows_();
1092
1093    /**
1094     * Starts a row element which acts as a container for a row of table cells.
1095     *
1096     * @see #tableRow(SinkEventAttributes)
1097     */
1098    void tableRow();
1099
1100    /**
1101     * Starts a table row.
1102     *
1103     * <p>
1104     *   Supported attributes are the {@link SinkEventAttributes base attributes} plus:
1105     * </p>
1106     * <blockquote>
1107     *   {@link SinkEventAttributes#ALIGN ALIGN}, {@link SinkEventAttributes#BGCOLOR BGCOLOR},
1108     *   {@link SinkEventAttributes#VALIGN VALIGN}.
1109     * </blockquote>
1110     *
1111     * @param attributes A set of {@link SinkEventAttributes}, may be <code>null</code>.
1112     * @since 1.1
1113     */
1114    void tableRow( SinkEventAttributes attributes );
1115
1116    /**
1117     * Ends a row element.
1118     */
1119    void tableRow_();
1120
1121    /**
1122     * Starts a cell element which defines a cell that contains data.
1123     *
1124     * @see #tableCell(SinkEventAttributes)
1125     */
1126    void tableCell();
1127
1128    /**
1129     * Starts a cell element which defines a cell that contains data.
1130     *
1131     * @param width the size of the cell.
1132     * @deprecated Use #tableCell(SinkEventAttributes) instead.
1133     */
1134    void tableCell( String width );
1135
1136    /**
1137     * Starts a table cell.
1138     *
1139     * <p>
1140     *   Supported attributes are the {@link SinkEventAttributes base attributes} plus:
1141     * </p>
1142     * <blockquote>
1143     *   {@link SinkEventAttributes#ABBRV ABBRV}, {@link SinkEventAttributes#ALIGN ALIGN},
1144     *   {@link SinkEventAttributes#AXIS AXIS}, {@link SinkEventAttributes#BGCOLOR BGCOLOR},
1145     *   {@link SinkEventAttributes#COLSPAN COLSPAN}, {@link SinkEventAttributes#HEADERS HEADERS},
1146     *   {@link SinkEventAttributes#HEIGHT HEIGHT}, {@link SinkEventAttributes#NOWRAP NOWRAP},
1147     *   {@link SinkEventAttributes#ROWSPAN ROWSPAN}, {@link SinkEventAttributes#SCOPE SCOPE},
1148     *   {@link SinkEventAttributes#VALIGN VALIGN}, {@link SinkEventAttributes#WIDTH WIDTH}.
1149     * </blockquote>
1150     *
1151     * @param attributes A set of {@link SinkEventAttributes}, may be <code>null</code>.
1152     * @since 1.1
1153     */
1154    void tableCell( SinkEventAttributes attributes );
1155
1156    /**
1157     * Ends a cell element.
1158     */
1159    void tableCell_();
1160
1161    /**
1162     * Starts a cell element which defines a cell that contains header information.
1163     *
1164     * @see #tableHeaderCell(SinkEventAttributes)
1165     */
1166    void tableHeaderCell();
1167
1168    /**
1169     * Starts a cell element which defines a cell that contains header information.
1170     *
1171     * @param width the size of the header cell.
1172     * @deprecated Use #tableHeaderCell(SinkEventAttributes) instead.
1173     */
1174    void tableHeaderCell( String width );
1175
1176    /**
1177     * Starts a table header cell.
1178     *
1179     * <p>
1180     *   Supported attributes are the same as for {@link #tableCell(SinkEventAttributes) tableCell}.
1181     * </p>
1182     *
1183     * @param attributes A set of {@link SinkEventAttributes}, may be <code>null</code>.
1184     * @since 1.1
1185     */
1186    void tableHeaderCell( SinkEventAttributes attributes );
1187
1188    /**
1189     * Ends a cell header element.
1190     */
1191    void tableHeaderCell_();
1192
1193    /**
1194     * Starts a caption element of a table.
1195     *
1196     * @see #tableCaption(SinkEventAttributes)
1197     */
1198    void tableCaption();
1199
1200    /**
1201     * Starts a table caption.
1202     *
1203     * <p>
1204     *   Note that the order of tableCaption and
1205     *   {@link #tableRows(int[],boolean)} events is arbitrary,
1206     *   ie a parser may emit the tableCaption before or after the tableRows.
1207     *   Implementing sinks should be prepared to handle both possibilities.
1208     * </p>
1209     * <p>
1210     *   Supported attributes are the {@link SinkEventAttributes base attributes}
1211     *   plus {@link SinkEventAttributes#ALIGN ALIGN}.
1212     * </p>
1213     *
1214     * @param attributes A set of {@link SinkEventAttributes}, may be <code>null</code>.
1215     * @since 1.1
1216     * @see #table(SinkEventAttributes)
1217     */
1218    void tableCaption( SinkEventAttributes attributes );
1219
1220    /**
1221     * Ends a caption element of a table.
1222     */
1223    void tableCaption_();
1224
1225    /**
1226     * Starts an element which represents a paragraph.
1227     *
1228     * @see #paragraph(SinkEventAttributes)
1229     */
1230    void paragraph();
1231
1232    /**
1233     * Starts a paragraph.
1234     *
1235     * <p>
1236     *   Supported attributes are the {@link SinkEventAttributes base attributes}
1237     *   plus {@link SinkEventAttributes#ALIGN ALIGN}.
1238     * </p>
1239     *
1240     * @param attributes A set of {@link SinkEventAttributes}, may be <code>null</code>.
1241     * @since 1.1
1242     */
1243    void paragraph( SinkEventAttributes attributes );
1244
1245    /**
1246     * Ends a paragraph element.
1247     */
1248    void paragraph_();
1249
1250    /**
1251     * Starts a data element which groups together other elements representing microformats.
1252     *
1253     * @see #data(String, SinkEventAttributes)
1254     */
1255    void data( String value );
1256
1257    /**
1258     * Starts a data element which groups together other elements representing microformats.
1259     *
1260     * <p>
1261     *   Supported attributes are the {@link SinkEventAttributes base attributes}
1262     *   plus {@link SinkEventAttributes#VALUE VALUE}.
1263     * </p>
1264     *
1265     * @param value the machine readable value of the data, may be <code>null</code>.
1266     * @param attributes A set of {@link SinkEventAttributes}, may be <code>null</code>.
1267     * @since 2.0
1268     */
1269    void data( String value, SinkEventAttributes attributes );
1270
1271    /**
1272     * Ends an data element.
1273     */
1274    void data_();
1275
1276    /**
1277     * Starts a time element which groups together other elements representing a time.
1278     *
1279     * @see #time(String, SinkEventAttributes)
1280     */
1281    void time( String datetime );
1282
1283    /**
1284     * Starts a time element which groups together other elements representing a time.
1285     *
1286     * <p>
1287     *   Supported attributes are the {@link SinkEventAttributes base attributes}
1288     *   plus {@link SinkEventAttributes#DATETIME DATETIME}.
1289     * </p>
1290     *
1291     * @param datetime the machine readable value of the time, may be <code>null</code>.
1292     * @param attributes A set of {@link SinkEventAttributes}, may be <code>null</code>.
1293     * @since 2.0
1294     */
1295    void time( String datetime, SinkEventAttributes attributes );
1296
1297    /**
1298     * Ends a time element.
1299     */
1300    void time_();
1301
1302    /**
1303     * Starts an address element.
1304     *
1305     * @see #address(SinkEventAttributes)
1306     */
1307    void address();
1308
1309    /**
1310     * Starts an address element.
1311     *
1312     * @param attributes A set of {@link SinkEventAttributes}, may be <code>null</code>.
1313     * @since 2.0
1314     */
1315    void address( SinkEventAttributes attributes );
1316
1317    /**
1318     * Ends an address element.
1319     */
1320    void address_();
1321
1322    /**
1323     * Starts a blockquote element.
1324     *
1325     * @see #blockquote(SinkEventAttributes)
1326     */
1327    void blockquote();
1328
1329    /**
1330     * Starts a blockquote element.
1331     *
1332     * <p>
1333     *   Supported attributes are the {@link SinkEventAttributes base attributes}.
1334     * </p>
1335     *
1336     * @param attributes A set of {@link SinkEventAttributes}, may be <code>null</code>.
1337     * @since 2.0
1338     */
1339    void blockquote( SinkEventAttributes attributes );
1340
1341    /**
1342     * Ends an blockquote element.
1343     */
1344    void blockquote_();
1345
1346    /**
1347     * Starts a division element grouping together other elements.
1348     *
1349     * @see #division(SinkEventAttributes)
1350     */
1351    void division();
1352
1353    /**
1354     * Starts a division element grouping together other elements.
1355     *
1356     * <p>
1357     *   Supported attributes are the {@link SinkEventAttributes base attributes}
1358     *   plus {@link SinkEventAttributes#ALIGN ALIGN}.
1359     * </p>
1360     *
1361     * @param attributes A set of {@link SinkEventAttributes}, may be <code>null</code>.
1362     * @since 2.0
1363     */
1364    void division( SinkEventAttributes attributes );
1365
1366    /**
1367     * Ends a division element.
1368     */
1369    void division_();
1370
1371    /**
1372     * Starts an element which indicates that whitespace in the enclosed text has semantic relevance.
1373     *
1374     * @param boxed true to add a box, false otherwise
1375     * @deprecated Use #verbatim(SinkEventAttributes) instead.
1376     */
1377    void verbatim( boolean boxed );
1378
1379    /**
1380     * Starts a verbatim block, ie a block where whitespace has semantic relevance.
1381     *
1382     * <p>
1383     *   Text in a verbatim block must only be wrapped at the linebreaks in the source,
1384     *   and spaces should not be collapsed. It should be displayed in a fixed-width font to
1385     *   retain the formatting but the overall size may be chosen by the implementation.
1386     * </p>
1387     *
1388     * <p>
1389     *   Most Sink events may be emitted within a verbatim block, the only elements explicitly
1390     *   forbidden are font-changing events and figures. Also, verbatim blocks may not be nested.
1391     * </p>
1392     *
1393     * <p>
1394     *   Supported attributes are the {@link SinkEventAttributes base attributes} plus:
1395     * </p>
1396     * <blockquote>
1397     *   {@link SinkEventAttributes#DECORATION DECORATION} (value: "boxed"),
1398     *   {@link SinkEventAttributes#ALIGN ALIGN}, {@link SinkEventAttributes#WIDTH WIDTH}.
1399     * </blockquote>
1400     *
1401     * @param attributes A set of {@link SinkEventAttributes}, may be <code>null</code>.
1402     * @since 1.1
1403     */
1404    void verbatim( SinkEventAttributes attributes );
1405
1406    /**
1407     * Ends a verbatim element.
1408     */
1409    void verbatim_();
1410
1411    /**
1412     * Adding a separator of sections from a text to each other.
1413     *
1414     * @see #horizontalRule(SinkEventAttributes)
1415     */
1416    void horizontalRule();
1417
1418    /**
1419     * Adds a horizontal separator rule.
1420     *
1421     * <p>
1422     *   Supported attributes are the {@link SinkEventAttributes base attributes} plus:
1423     * </p>
1424     * <blockquote>
1425     *   {@link SinkEventAttributes#ALIGN ALIGN}, {@link SinkEventAttributes#NOSHADE NOSHADE},
1426     *   {@link SinkEventAttributes#SIZE SIZE}, {@link SinkEventAttributes#WIDTH WIDTH}.
1427     * </blockquote>
1428     *
1429     * @param attributes A set of {@link SinkEventAttributes}, may be <code>null</code>.
1430     * @since 1.1
1431     */
1432    void horizontalRule( SinkEventAttributes attributes );
1433
1434    /**
1435     * Adding a new page separator.
1436     */
1437    void pageBreak();
1438
1439    /**
1440     * Starts an element which defines an anchor.
1441     *
1442     * @param name the name of the anchor.
1443     * @see #anchor(String,SinkEventAttributes)
1444     */
1445    void anchor( String name );
1446
1447    /**
1448     * Starts an element which defines an anchor.
1449     *
1450     * <p>
1451     *   The <code>name</code> parameter has to be a valid SGML NAME token.
1452     *   According to the <a href="http://www.w3.org/TR/html4/types.html#type-name">
1453     *   HTML 4.01 specification section 6.2 SGML basic types</a>:
1454     * </p>
1455     * <p>
1456     *   <i>ID and NAME tokens must begin with a letter ([A-Za-z]) and may be
1457     *   followed by any number of letters, digits ([0-9]), hyphens ("-"),
1458     *   underscores ("_"), colons (":"), and periods (".").</i>
1459     * </p>
1460     * <p>
1461     *   Supported attributes are the {@link SinkEventAttributes base attributes}.
1462     *   If {@link SinkEventAttributes#NAME NAME} is specified in the SinkEventAttributes,
1463     *   it will be overwritten by the <code>name</code> parameter.
1464     * </p>
1465     *
1466     * @param name the name of the anchor. This has to be a valid SGML NAME token.
1467     * @param attributes A set of {@link SinkEventAttributes}, may be <code>null</code>.
1468     * @since 1.1
1469     */
1470    void anchor( String name, SinkEventAttributes attributes );
1471
1472    /**
1473     * Ends an anchor element.
1474     */
1475    void anchor_();
1476
1477    /**
1478     * Starts an element which defines a link.
1479     *
1480     * @param name the name of the link.
1481     * @see #link(String,SinkEventAttributes)
1482     */
1483    void link( String name );
1484
1485    /**
1486     * Starts a link.
1487     *
1488     * <p>
1489     *   The <code>name</code> parameter has to be a valid html <code>href</code>
1490     *   parameter, ie for internal links (links to an anchor within the same source
1491     *   document), <code>name</code> should start with the character "#".
1492     * </p>
1493     * <p>
1494     *   Supported attributes are the {@link SinkEventAttributes base attributes} plus:
1495     * </p>
1496     * <blockquote>
1497     *   {@link SinkEventAttributes#CHARSET CHARSET}, {@link SinkEventAttributes#COORDS COORDS},
1498     *   {@link SinkEventAttributes#HREF HREF}, {@link SinkEventAttributes#HREFLANG HREFLANG},
1499     *   {@link SinkEventAttributes#REL REL}, {@link SinkEventAttributes#REV REV},
1500     *   {@link SinkEventAttributes#SHAPE SHAPE}, {@link SinkEventAttributes#TARGET TARGET},
1501     *   {@link SinkEventAttributes#TYPE TYPE}.
1502     * </blockquote>
1503     * <p>
1504     *   If {@link SinkEventAttributes#HREF HREF} is specified in the
1505     *   SinkEventAttributes, it will be overwritten by the <code>name</code> parameter.
1506     * </p>
1507     *
1508     * @param name the name of the link.
1509     * @param attributes A set of {@link SinkEventAttributes}, may be <code>null</code>.
1510     * @since 1.1
1511     */
1512    void link( String name, SinkEventAttributes attributes );
1513
1514    /**
1515     * Ends a link element.
1516     */
1517    void link_();
1518
1519    /**
1520     * Starts an inline element.
1521     *
1522     * @see #inline(SinkEventAttributes)
1523     */
1524    void inline();
1525
1526    /**
1527     * Starts an inline element.
1528     *
1529     * <p>
1530     *   The inline method is similar to {@link #text(String,SinkEventAttributes)}, but
1531     *   allows you to wrap arbitrary elements in addition to text.
1532     * </p>
1533     *
1534     * <p>
1535     *   Supported attributes are the {@link SinkEventAttributes base attributes} plus
1536     * </p>
1537     * <blockquote>
1538     *   {@link SinkEventAttributes#SEMANTICS SEMANTICS} (values "emphasis", "strong",
1539     *   "small", "line-through", "citation", "quote", "definition", "abbreviation",
1540     *   "italic", "bold", "monospaced", "variable", "sample", "keyboard", "superscript",
1541     *   "subscript", "annotation", "highlight", "ruby", "rubyBase", "rubyText",
1542     *   "rubyTextContainer", "rubyParentheses", "bidirectionalIsolation",
1543     *   "bidirectionalOverride", "phrase", "insert", "delete").
1544     * </blockquote>
1545     *
1546     * @param attributes A set of {@link SinkEventAttributes}, may be <code>null</code>.
1547     * @since 2.0
1548     */
1549    void inline( SinkEventAttributes attributes );
1550
1551    /**
1552     * Ends an inline element.
1553     */
1554    void inline_();
1555
1556    /**
1557     * Starts an italic element.
1558     *
1559     * Alternatively one may use {@link #text(String,SinkEventAttributes)} with
1560     *              {@link SinkEventAttributes#STYLE STYLE} instead.
1561     */
1562    void italic();
1563
1564    /**
1565     * Ends an italic element.
1566     *
1567     * Alternatively one may use {@link #text(String,SinkEventAttributes)} with
1568     *              {@link SinkEventAttributes#STYLE STYLE} instead.
1569     */
1570    void italic_();
1571
1572    /**
1573     * Starts a bold element.
1574     *
1575     * Alternatively one may use {@link #text(String,SinkEventAttributes)} with
1576     *              {@link SinkEventAttributes#STYLE STYLE} instead.
1577     */
1578    void bold();
1579
1580    /**
1581     * Ends a bold element.
1582     *
1583     * Alternatively one may use {@link #text(String,SinkEventAttributes)} with
1584     *              {@link SinkEventAttributes#STYLE STYLE} instead.
1585     */
1586    void bold_();
1587
1588    /**
1589     * Starts a monospaced element.
1590     *
1591     * Alternatively one may use {@link #text(String,SinkEventAttributes)} with
1592     *              {@link SinkEventAttributes#STYLE STYLE} instead.
1593     */
1594    void monospaced();
1595
1596    /**
1597     * Ends a monospaced element.
1598     *
1599     * Alternatively one may use {@link #text(String,SinkEventAttributes)} with
1600     *              {@link SinkEventAttributes#STYLE STYLE} instead.
1601     */
1602    void monospaced_();
1603
1604    /**
1605     * Adds a line break.
1606     *
1607     * @see #lineBreak(SinkEventAttributes)
1608     */
1609    void lineBreak();
1610
1611    /**
1612     * Adds a line break.
1613     *
1614     * <p>
1615     *   Supported attributes are:
1616     * </p>
1617     * <blockquote>
1618     *   {@link SinkEventAttributes#ID ID}, {@link SinkEventAttributes#CLASS CLASS},
1619     *   {@link SinkEventAttributes#TITLE TITLE}, {@link SinkEventAttributes#STYLE STYLE}.
1620     * </blockquote>
1621     *
1622     * @param attributes A set of {@link SinkEventAttributes}, may be <code>null</code>.
1623     * @since 1.1
1624     */
1625    void lineBreak( SinkEventAttributes attributes );
1626
1627    /**
1628     * Adds a line break opportunity.
1629     *
1630     * @see #lineBreak(SinkEventAttributes)
1631     */
1632    void lineBreakOpportunity();
1633
1634    /**
1635     * Adds a line break opportunity.
1636     *
1637     * <p>
1638     *   Supported attributes are:
1639     * </p>
1640     * <blockquote>
1641     *   {@link SinkEventAttributes#ID ID}, {@link SinkEventAttributes#CLASS CLASS},
1642     *   {@link SinkEventAttributes#TITLE TITLE}, {@link SinkEventAttributes#STYLE STYLE}.
1643     * </blockquote>
1644     *
1645     * @param attributes A set of {@link SinkEventAttributes}, may be <code>null</code>.
1646     * @since 2.0
1647     */
1648    void lineBreakOpportunity( SinkEventAttributes attributes );
1649
1650    /**
1651     * Adding a non breaking space, <i>ie</i> a space without any special formatting operations.
1652     */
1653    void nonBreakingSpace();
1654
1655    /**
1656     * Adding a text.
1657     *
1658     * @param text The text to write.
1659     * @see #text(String,SinkEventAttributes)
1660     */
1661    void text( String text );
1662
1663    /**
1664     * Adds a text.
1665     *
1666     * <p>
1667     *   The <code>text</code> parameter should contain only real content, ie any
1668     *   ignorable/collapsable whitespace/EOLs or other pretty-printing should
1669     *   be removed/normalized by a parser.
1670     * </p>
1671     * <p>
1672     *   If <code>text</code> contains any variants of line terminators, they should
1673     *   be normalized to the System EOL by an implementing Sink.
1674     * </p>
1675     * <p>
1676     *   Supported attributes are the {@link SinkEventAttributes base attributes} plus
1677     * </p>
1678     * <blockquote>
1679     *   {@link SinkEventAttributes#SEMANTICS SEMANTICS} (values "emphasis", "strong",
1680     *   "small", "line-through", "citation", "quote", "definition", "abbreviation",
1681     *   "italic", "bold", "monospaced", "variable", "sample", "keyboard", "superscript",
1682     *   "subscript", "annotation", "highlight", "ruby", "rubyBase", "rubyText",
1683     *   "rubyTextContainer", "rubyParentheses", "bidirectionalIsolation",
1684     *   "bidirectionalOverride", "phrase", "insert", "delete").
1685     * </blockquote>
1686     * <p>
1687     *   The following attributes are deprecated:
1688     * </p>
1689     * <blockquote>
1690     *   {@link SinkEventAttributes#VALIGN VALIGN} (values "sub", "sup"),
1691     *   {@link SinkEventAttributes#DECORATION DECORATION} (values "underline", "overline", "line-through"),
1692     *   {@link SinkEventAttributes#STYLE STYLE} (values "italic", "bold", "monospaced").
1693     * </blockquote>
1694     *
1695     * @param text The text to write.
1696     * @param attributes A set of {@link SinkEventAttributes}, may be <code>null</code>.
1697     * @since 1.1
1698     */
1699    void text( String text, SinkEventAttributes attributes );
1700
1701    /**
1702     * Adding a raw text, <i>ie</i> a text without any special formatting operations.
1703     *
1704     * @param text The text to write.
1705     */
1706    void rawText( String text );
1707
1708    /**
1709     * Add a comment.
1710     *
1711     * @param comment The comment to write.
1712     * @since 1.1
1713     */
1714    void comment( String comment );
1715
1716    /**
1717     * Add an unknown event. This may be used by parsers to notify a general Sink about
1718     * an event that doesn't fit into any event defined by the Sink API.
1719     * Depending on the parameters, a Sink may decide whether or not to process the event,
1720     * emit it as raw text, as a comment, log it, etc.
1721     *
1722     * @param name The name of the event.
1723     * @param requiredParams An optional array of required parameters to the event.
1724     * May be <code>null</code>.
1725     * @param attributes A set of {@link SinkEventAttributes}, may be <code>null</code>.
1726     * @since 1.1
1727     */
1728    void unknown( String name, Object[] requiredParams, SinkEventAttributes attributes );
1729
1730    /**
1731     * Flush the writer or the stream, if needed.
1732     * Flushing a previously-flushed Sink has no effect.
1733     */
1734    void flush();
1735
1736    /**
1737     * Close the writer or the stream, if needed.
1738     * Closing a previously-closed Sink has no effect.
1739     */
1740    void close();
1741}