1 package org.apache.maven.doxia.book.services.renderer.docbook;
2
3 /*
4 * Licensed to the Apache Software Foundation (ASF) under one
5 * or more contributor license agreements. See the NOTICE file
6 * distributed with this work for additional information
7 * regarding copyright ownership. The ASF licenses this file
8 * to you under the Apache License, Version 2.0 (the
9 * "License"); you may not use this file except in compliance
10 * with the License. You may obtain a copy of the License at
11 *
12 * http://www.apache.org/licenses/LICENSE-2.0
13 *
14 * Unless required by applicable law or agreed to in writing,
15 * software distributed under the License is distributed on an
16 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
17 * KIND, either express or implied. See the License for the
18 * specific language governing permissions and limitations
19 * under the License.
20 */
21
22 import java.io.Writer;
23
24 import javax.swing.text.MutableAttributeSet;
25 import javax.swing.text.html.HTML.Tag;
26
27 import org.apache.maven.doxia.module.docbook.DocBookSink;
28
29 /**
30 * An Docbook Sink that doesn't write out head or body elements for every section of a book, and has some convenience
31 * methods relating to the construction of a Doxia Book.
32 *
33 * @author Dave Syer
34 * @version $Id: DocBookBookSink.java 808201 2009-08-26 22:04:43Z vsiveton $
35 * @since 1.1
36 */
37 public class DocBookBookSink
38 extends DocBookSink
39 {
40 /** Indicates if we're inside a head. */
41 private boolean hasHead = false;
42
43 /**
44 * Construct a new DocBookSink.
45 *
46 * @param out the writer for the sink.
47 */
48 public DocBookBookSink( Writer out )
49 {
50 super( out );
51
52 setSystemId( "http://www.oasis-open.org/docbook/xml/4.4/docbookx.dtd" );
53 setPublicId( "-//OASIS//DTD DocBook V4.4//EN" );
54 }
55
56 // ----------------------------------------------------------------------
57 //
58 // ----------------------------------------------------------------------
59
60 /**
61 * {@inheritDoc}
62 *
63 * Does nothing because we don't want the header from each document to crop up in the middle of a book.
64 */
65 public void head()
66 {
67 // noop
68 }
69
70 /**
71 * {@inheritDoc}
72 *
73 * Does nothing because we don't want the header from each document to crop up in the middle of a book.
74 */
75 public void head_()
76 {
77 // noop
78 }
79
80 /**
81 * {@inheritDoc}
82 *
83 * Marks the skip flag to true so that this element's text is not emitted by the base class.
84 */
85 public void title()
86 {
87 setSkip( true );
88 }
89
90 /**
91 * {@inheritDoc}
92 *
93 * Marks the skip flag to false so that rendering can resume.
94 */
95 public void title_()
96 {
97 setSkip( false );
98 }
99
100 /**
101 * {@inheritDoc}
102 *
103 * Marks the skip flag to true so that this element's text is not emitted by the base class.
104 */
105 public void author()
106 {
107 setSkip( true );
108 }
109
110 /**
111 * {@inheritDoc}
112 *
113 * Marks the skip flag to false so that rendering can resume.
114 */
115 public void author_()
116 {
117 setSkip( false );
118 }
119
120 /**
121 * {@inheritDoc}
122 *
123 * Does nothing because we don't want the header from each document to crop up in the middle of a book.
124 */
125 public void body()
126 {
127 // noop
128 }
129
130 /**
131 * {@inheritDoc}
132 *
133 * Does nothing because we don't want the header from each document to crop up in the middle of a book.
134 */
135 public void body_()
136 {
137 // noop
138 }
139
140 /**
141 * Emit the start tag for the book.
142 *
143 * @see org.apache.maven.doxia.module.docbook.DocbookMarkup#BOOK_TAG
144 */
145 public void book()
146 {
147 init();
148
149 MutableAttributeSet att = writeXmlHeader( "book" );
150
151 writeStartTag( BOOK_TAG, att );
152
153 }
154
155 /**
156 * Emit the end tag for the book.
157 *
158 * @see org.apache.maven.doxia.module.docbook.DocbookMarkup#BOOK_TAG
159 */
160 public void book_()
161 {
162 writeEndTag( BOOK_TAG );
163 flush();
164 }
165
166 /** If no header matter has yet been encountered emit the book info start tag. */
167 private void bookHead()
168 {
169 if ( !hasHead )
170 {
171 writeStartTag( BOOKINFO_TAG );
172 hasHead = true;
173 }
174 }
175
176 /**
177 * If some header matter has been encountered emit the book info end tag.
178 */
179 public void bookHead_()
180 {
181 if ( hasHead )
182 {
183 writeEndTag( BOOKINFO_TAG );
184 hasHead = false;
185 }
186 }
187
188 /**
189 * Emit the title start tag for the whole book.
190 */
191 public void bookTitle()
192 {
193 bookHead();
194 writeStartTag( Tag.TITLE );
195 }
196
197 /**
198 * Emit the title end tag for the whole book.
199 */
200 public void bookTitle_()
201 {
202 super.title_();
203 }
204
205 /**
206 * Emit the author start tag for the whole book.
207 */
208 public void bookAuthor()
209 {
210 bookHead();
211 super.author();
212 }
213
214 /**
215 * Emit the author end tag for the whole book.
216 */
217 public void bookAuthor_()
218 {
219 super.author_();
220 }
221
222 /**
223 * Emit the date start tag for the whole book.
224 */
225 public void bookDate()
226 {
227 bookHead();
228 super.date();
229 }
230
231 /**
232 * Emit the date end tag for the whole book.
233 */
234 public void bookDate_()
235 {
236 super.date_();
237 }
238
239 /**
240 * Emit the chapter start tag.
241 */
242 public void chapter()
243 {
244 writeStartTag( CHAPTER_TAG );
245 }
246
247 /**
248 * Emit the chapter end tag.
249 */
250 public void chapter_()
251 {
252 writeEndTag( CHAPTER_TAG );
253 }
254
255 /**
256 * Emit the chapter title start tag.
257 */
258 public void chapterTitle()
259 {
260 writeStartTag( Tag.TITLE );
261 }
262
263 /**
264 * Emit the chapter title end tag.
265 */
266 public void chapterTitle_()
267 {
268 writeEndTag( Tag.TITLE );
269 }
270 }