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