1 package org.apache.maven.doxia.module.docbook;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 import java.io.PrintWriter;
23 import java.io.StringWriter;
24 import java.io.Writer;
25 import java.util.HashMap;
26 import java.util.Locale;
27 import java.util.Map;
28 import java.util.Set;
29 import java.util.StringTokenizer;
30 import java.util.TreeSet;
31
32 import javax.swing.text.MutableAttributeSet;
33 import javax.swing.text.SimpleAttributeSet;
34
35 import org.apache.maven.doxia.sink.AbstractXmlSink;
36 import org.apache.maven.doxia.sink.SinkEventAttributes;
37 import org.apache.maven.doxia.sink.Sink;
38 import org.apache.maven.doxia.util.DoxiaUtils;
39 import org.apache.maven.doxia.util.HtmlTools;
40
41 import org.codehaus.plexus.util.FileUtils;
42 import org.codehaus.plexus.util.StringUtils;
43
44
45
46
47
48
49
50
51
52
53 public class DocBookSink
54 extends AbstractXmlSink
55 implements DocbookMarkup, SimplifiedDocbookMarkup
56 {
57
58
59 public static final String DEFAULT_SGML_PUBLIC_ID = DocbookMarkup.DEFAULT_SGML_PUBLIC_ID;
60
61
62
63 public static final String DEFAULT_XML_PUBLIC_ID = DocbookMarkup.DEFAULT_XML_PUBLIC_ID;
64
65
66
67 public static final String DEFAULT_XML_SYSTEM_ID = DocbookMarkup.DEFAULT_XML_SYSTEM_ID;
68
69
70
71 public static final String DEFAULT_SGML_SYSTEM_ID = DocbookMarkup.DEFAULT_SGML_SYSTEM_ID;
72
73
74 private PrintWriter out;
75
76
77 private boolean xmlMode = false;
78
79
80 private String styleSheet = null;
81
82
83 private String lang = null;
84
85
86 private String publicId = null;
87
88
89 private String systemId = null;
90
91
92 private String italicBeginTag;
93
94
95 private String italicEndTag;
96
97
98 private String boldBeginTag;
99
100
101 private String boldEndTag;
102
103
104 private String monospacedBeginTag;
105
106
107 private String monospacedEndTag;
108
109
110 private String horizontalRuleElement;
111
112
113 private String pageBreakElement;
114
115
116 private String lineBreakElement;
117
118
119 private String graphicsFileName;
120
121
122 private boolean hasTitle;
123
124
125 private boolean authorDateFlag;
126
127
128 private boolean verbatimFlag;
129
130
131 private boolean externalLinkFlag;
132
133
134 private boolean tableHasCaption;
135
136
137 private PrintWriter savedOut;
138
139
140 private String tableRows;
141
142
143 private StringWriter tableRowsWriter;
144
145
146 private boolean tableHasGrid;
147
148 private boolean skip;
149
150 private boolean paragraph;
151
152 private String encoding;
153
154
155
156 private Map<String, Set<String>> warnMessages;
157
158
159
160
161
162
163
164 protected DocBookSink( Writer writer )
165 {
166 this( writer, null );
167 }
168
169
170
171
172
173
174
175
176 protected DocBookSink( Writer writer, String encoding )
177 {
178 this.out = new PrintWriter( writer );
179 this.encoding = encoding;
180
181 setItalicElement( "<emphasis>" );
182 setBoldElement( "<emphasis role=\"bold\">" );
183 setMonospacedElement( "<literal>" );
184 setHorizontalRuleElement( "<!-- HR -->" );
185 setPageBreakElement( "<!-- PB -->" );
186 setLineBreakElement( "<!-- LB -->" );
187 }
188
189
190
191
192
193
194
195
196
197
198
199
200 protected DocBookSink( Writer writer, String encoding, String languageId )
201 {
202 this( writer, encoding );
203
204 this.lang = languageId;
205 }
206
207
208
209
210
211
212
213
214
215 public static final String escapeSGML( String text, boolean xmlMode )
216 {
217 return HtmlTools.escapeHTML( text, xmlMode );
218 }
219
220
221
222
223
224
225
226 public void setXMLMode( boolean mode )
227 {
228 this.xmlMode = mode;
229 }
230
231
232
233
234
235
236
237 public boolean isXMLMode()
238 {
239 return xmlMode;
240 }
241
242
243
244
245
246
247
248 public void setEncoding( String enc )
249 {
250 encoding = enc;
251 }
252
253
254
255
256
257
258 public String getEncoding()
259 {
260 return encoding;
261 }
262
263
264
265
266
267
268 public void setStyleSheet( String sheet )
269 {
270 this.styleSheet = sheet;
271 }
272
273
274
275
276
277
278 public String getStyleSheet()
279 {
280 return styleSheet;
281 }
282
283
284
285
286
287
288 public void setPublicId( String id )
289 {
290 this.publicId = id;
291 }
292
293
294
295
296
297
298 public String getPublicId()
299 {
300 return publicId;
301 }
302
303
304
305
306
307
308 public void setSystemId( String id )
309 {
310 this.systemId = id;
311 }
312
313
314
315
316
317
318 public String getSystemId()
319 {
320 return systemId;
321 }
322
323
324
325
326
327
328 public void setLanguage( String language )
329 {
330 this.lang = language;
331 }
332
333
334
335
336
337
338 public String getLanguage()
339 {
340 return lang;
341 }
342
343
344
345
346
347
348 public void setItalicElement( String tag )
349 {
350 if ( tag == null )
351 {
352 tag = "";
353 }
354 this.italicBeginTag = tag;
355 italicEndTag = makeEndTag( italicBeginTag );
356 }
357
358
359
360
361
362
363
364 private String makeEndTag( String beginTag )
365 {
366 int length = beginTag.length();
367 if ( length == 0 )
368 {
369 return "";
370 }
371
372 if ( beginTag.charAt( 0 ) != '<' || beginTag.charAt( length - 1 ) != '>' )
373 {
374 throw new IllegalArgumentException( "'" + beginTag + "', not a tag" );
375 }
376
377 StringTokenizer tokens = new StringTokenizer( beginTag, "<> \t\n\r\f" );
378 if ( !tokens.hasMoreTokens() )
379 {
380 throw new IllegalArgumentException( "'" + beginTag + "', invalid tag" );
381 }
382
383 return "</" + tokens.nextToken() + ">";
384 }
385
386
387
388
389
390
391 public String getItalicElement()
392 {
393 return italicBeginTag;
394 }
395
396
397
398
399
400
401 public void setBoldElement( String tag )
402 {
403 if ( tag == null )
404 {
405 tag = "";
406 }
407 this.boldBeginTag = tag;
408 boldEndTag = makeEndTag( boldBeginTag );
409 }
410
411
412
413
414
415
416 public String getBoldElement()
417 {
418 return boldBeginTag;
419 }
420
421
422
423
424
425
426 public void setMonospacedElement( String tag )
427 {
428 if ( tag == null )
429 {
430 tag = "";
431 }
432 this.monospacedBeginTag = tag;
433 monospacedEndTag = makeEndTag( monospacedBeginTag );
434 }
435
436
437
438
439
440
441 public String getMonospacedElement()
442 {
443 return monospacedBeginTag;
444 }
445
446
447
448
449
450
451 public void setHorizontalRuleElement( String element )
452 {
453 this.horizontalRuleElement = element;
454 }
455
456
457
458
459
460
461 public String getHorizontalRuleElement()
462 {
463 return horizontalRuleElement;
464 }
465
466
467
468
469
470
471 public void setPageBreakElement( String element )
472 {
473 this.pageBreakElement = element;
474 }
475
476
477
478
479
480
481 public String getPageBreakElement()
482 {
483 return pageBreakElement;
484 }
485
486
487
488
489
490
491 public void setLineBreakElement( String element )
492 {
493 this.lineBreakElement = element;
494 }
495
496
497
498
499
500
501 public String getLineBreakElement()
502 {
503 return lineBreakElement;
504 }
505
506
507
508
509
510
511 protected void resetState()
512 {
513 init();
514 }
515
516
517 protected void init()
518 {
519 hasTitle = false;
520 authorDateFlag = false;
521 verbatimFlag = false;
522 externalLinkFlag = false;
523 graphicsFileName = null;
524 tableHasCaption = false;
525 savedOut = null;
526 tableRows = null;
527 tableHasGrid = false;
528 }
529
530
531
532
533
534
535
536
537
538
539
540 public void head()
541 {
542 init();
543
544 MutableAttributeSet att = writeXmlHeader( "article" );
545
546 writeStartTag( SimplifiedDocbookMarkup.ARTICLE_TAG, att );
547 }
548
549
550
551
552
553
554
555
556
557
558
559 protected MutableAttributeSet writeXmlHeader( String root )
560 {
561 markup( "<?xml version=\"1.0\"" );
562 if ( encoding != null )
563 {
564 markup( " encoding=\"" + encoding + "\"" );
565 }
566 markup( "?>" );
567
568 if ( styleSheet != null )
569 {
570 markup( "<?xml-stylesheet type=\"text/css\" href=\"" + styleSheet + "\" ?>" );
571 }
572
573 String pubId;
574 markup( "<!DOCTYPE " + root + " PUBLIC" );
575
576 if ( publicId == null )
577 {
578 pubId = SimplifiedDocbookMarkup.DEFAULT_XML_PUBLIC_ID;
579 }
580 else
581 {
582 pubId = publicId;
583 }
584 markup( " \"" + pubId + "\"" );
585 String sysId = systemId;
586 if ( sysId == null )
587 {
588 sysId = SimplifiedDocbookMarkup.DEFAULT_XML_SYSTEM_ID;
589 }
590 markup( " \"" + sysId + "\">" );
591
592 MutableAttributeSet att = new SimpleAttributeSet();
593 if ( lang != null )
594 {
595 att.addAttribute( LANG_ATTRIBUTE, lang );
596 }
597 return att;
598 }
599
600
601
602
603
604 public void head_()
605 {
606 if ( hasTitle )
607 {
608 writeEndTag( SimplifiedDocbookMarkup.ARTICLEINFO_TAG );
609 hasTitle = false;
610 }
611 }
612
613
614
615
616
617
618 public void title()
619 {
620 writeStartTag( SimplifiedDocbookMarkup.ARTICLEINFO_TAG );
621 writeStartTag( SimplifiedDocbookMarkup.TITLE_TAG );
622 hasTitle = true;
623 }
624
625
626
627
628
629 public void title_()
630 {
631 writeEndTag( SimplifiedDocbookMarkup.TITLE_TAG );
632 }
633
634
635
636
637
638 public void author()
639 {
640 authorDateFlag = true;
641 writeStartTag( SimplifiedDocbookMarkup.CORPAUTHOR_TAG );
642 }
643
644
645
646
647
648 public void author_()
649 {
650 writeEndTag( SimplifiedDocbookMarkup.CORPAUTHOR_TAG );
651 authorDateFlag = false;
652 }
653
654
655
656
657
658 public void date()
659 {
660 authorDateFlag = true;
661 writeStartTag( SimplifiedDocbookMarkup.DATE_TAG );
662 }
663
664
665
666
667
668 public void date_()
669 {
670 writeEndTag( SimplifiedDocbookMarkup.DATE_TAG );
671 authorDateFlag = false;
672 }
673
674
675
676
677
678 public void body_()
679 {
680 writeEndTag( SimplifiedDocbookMarkup.ARTICLE_TAG );
681 out.flush();
682 init();
683 }
684
685
686
687
688
689 public void section1()
690 {
691 writeStartTag( SimplifiedDocbookMarkup.SECTION_TAG );
692 }
693
694
695
696
697
698 public void section1_()
699 {
700 writeEndTag( SimplifiedDocbookMarkup.SECTION_TAG );
701 }
702
703
704
705
706
707 public void section2()
708 {
709 writeStartTag( SimplifiedDocbookMarkup.SECTION_TAG );
710 }
711
712
713
714
715
716 public void section2_()
717 {
718 writeEndTag( SimplifiedDocbookMarkup.SECTION_TAG );
719 }
720
721
722
723
724
725 public void section3()
726 {
727 writeStartTag( SimplifiedDocbookMarkup.SECTION_TAG );
728 }
729
730
731
732
733
734 public void section3_()
735 {
736 writeEndTag( SimplifiedDocbookMarkup.SECTION_TAG );
737 }
738
739
740
741
742
743 public void section4()
744 {
745 writeStartTag( SimplifiedDocbookMarkup.SECTION_TAG );
746 }
747
748
749
750
751
752 public void section4_()
753 {
754 writeEndTag( SimplifiedDocbookMarkup.SECTION_TAG );
755 }
756
757
758
759
760
761 public void section5()
762 {
763 writeStartTag( SimplifiedDocbookMarkup.SECTION_TAG );
764 }
765
766
767
768
769
770 public void section5_()
771 {
772 writeEndTag( SimplifiedDocbookMarkup.SECTION_TAG );
773 }
774
775
776
777
778
779 public void sectionTitle()
780 {
781 writeStartTag( SimplifiedDocbookMarkup.TITLE_TAG );
782 }
783
784
785
786
787
788 public void sectionTitle_()
789 {
790 writeEndTag( SimplifiedDocbookMarkup.TITLE_TAG );
791 }
792
793
794
795
796
797 public void sectionTitle1()
798 {
799 writeStartTag( SimplifiedDocbookMarkup.TITLE_TAG );
800 }
801
802
803
804
805
806 public void sectionTitle1_()
807 {
808 writeEndTag( SimplifiedDocbookMarkup.TITLE_TAG );
809 }
810
811
812
813
814
815 public void sectionTitle2()
816 {
817 writeStartTag( SimplifiedDocbookMarkup.TITLE_TAG );
818 }
819
820
821
822
823
824 public void sectionTitle2_()
825 {
826 writeEndTag( SimplifiedDocbookMarkup.TITLE_TAG );
827 }
828
829
830
831
832
833 public void sectionTitle3()
834 {
835 writeStartTag( SimplifiedDocbookMarkup.TITLE_TAG );
836 }
837
838
839
840
841
842 public void sectionTitle3_()
843 {
844 writeEndTag( SimplifiedDocbookMarkup.TITLE_TAG );
845 }
846
847
848
849
850
851 public void sectionTitle4()
852 {
853 writeStartTag( SimplifiedDocbookMarkup.TITLE_TAG );
854 }
855
856
857
858
859
860 public void sectionTitle4_()
861 {
862 writeEndTag( SimplifiedDocbookMarkup.TITLE_TAG );
863 }
864
865
866
867
868
869 public void sectionTitle5()
870 {
871 writeStartTag( SimplifiedDocbookMarkup.TITLE_TAG );
872 }
873
874
875
876
877
878 public void sectionTitle5_()
879 {
880 writeEndTag( SimplifiedDocbookMarkup.TITLE_TAG );
881 }
882
883
884
885
886
887 public void list()
888 {
889 paragraph_();
890 writeStartTag( SimplifiedDocbookMarkup.ITEMIZEDLIST_TAG );
891 }
892
893
894
895
896
897 public void list_()
898 {
899 writeEndTag( SimplifiedDocbookMarkup.ITEMIZEDLIST_TAG );
900 }
901
902
903
904
905
906 public void listItem()
907 {
908 writeStartTag( SimplifiedDocbookMarkup.LISTITEM_TAG );
909 paragraph();
910 }
911
912
913
914
915
916 public void listItem_()
917 {
918 paragraph_();
919 writeEndTag( SimplifiedDocbookMarkup.LISTITEM_TAG );
920 }
921
922
923
924
925
926
927 public void numberedList( int numbering )
928 {
929 String numeration = DocbookUtils.docbookListNumbering( numbering );
930
931 paragraph_();
932
933 MutableAttributeSet att = new SimpleAttributeSet();
934 att.addAttribute( SimplifiedDocbookMarkup.NUMERATION_ATTRIBUTE, numeration );
935
936 writeStartTag( SimplifiedDocbookMarkup.ORDEREDLIST_TAG, att );
937 }
938
939
940
941
942
943 public void numberedList_()
944 {
945 writeEndTag( SimplifiedDocbookMarkup.ORDEREDLIST_TAG );
946 }
947
948
949
950
951
952 public void numberedListItem()
953 {
954 writeStartTag( SimplifiedDocbookMarkup.LISTITEM_TAG );
955 paragraph();
956 }
957
958
959
960
961
962 public void numberedListItem_()
963 {
964 paragraph_();
965 writeEndTag( SimplifiedDocbookMarkup.LISTITEM_TAG );
966 }
967
968
969
970
971
972 public void definitionList()
973 {
974 paragraph_();
975 writeStartTag( SimplifiedDocbookMarkup.VARIABLELIST_TAG );
976 }
977
978
979
980
981
982 public void definitionList_()
983 {
984 writeEndTag( SimplifiedDocbookMarkup.VARIABLELIST_TAG );
985 }
986
987
988
989
990
991 public void definitionListItem()
992 {
993 writeStartTag( SimplifiedDocbookMarkup.VARLISTENTRY_TAG );
994 }
995
996
997
998
999
1000 public void definitionListItem_()
1001 {
1002 writeEndTag( SimplifiedDocbookMarkup.VARLISTENTRY_TAG );
1003 }
1004
1005
1006
1007
1008
1009 public void definedTerm()
1010 {
1011 writeStartTag( SimplifiedDocbookMarkup.TERM_TAG );
1012 }
1013
1014
1015
1016
1017
1018 public void definedTerm_()
1019 {
1020 writeEndTag( SimplifiedDocbookMarkup.TERM_TAG );
1021 }
1022
1023
1024
1025
1026
1027 public void definition()
1028 {
1029 writeStartTag( SimplifiedDocbookMarkup.LISTITEM_TAG );
1030 paragraph();
1031 }
1032
1033
1034
1035
1036
1037 public void definition_()
1038 {
1039 paragraph_();
1040 writeEndTag( SimplifiedDocbookMarkup.LISTITEM_TAG );
1041 }
1042
1043
1044
1045
1046
1047 public void paragraph()
1048 {
1049 if ( !paragraph )
1050 {
1051 writeStartTag( SimplifiedDocbookMarkup.PARA_TAG );
1052 paragraph = true;
1053 }
1054 }
1055
1056
1057
1058
1059
1060 public void paragraph_()
1061 {
1062 if ( paragraph )
1063 {
1064 writeEndTag( SimplifiedDocbookMarkup.PARA_TAG );
1065 paragraph = false;
1066 }
1067 }
1068
1069
1070
1071
1072
1073 public void verbatim( boolean boxed )
1074 {
1075 verbatimFlag = true;
1076 paragraph_();
1077 writeStartTag( SimplifiedDocbookMarkup.PROGRAMLISTING_TAG );
1078 }
1079
1080
1081
1082
1083
1084 public void verbatim_()
1085 {
1086 writeEndTag( SimplifiedDocbookMarkup.PROGRAMLISTING_TAG );
1087 verbatimFlag = false;
1088 }
1089
1090
1091 public void horizontalRule()
1092 {
1093 markup( horizontalRuleElement );
1094 }
1095
1096
1097 public void pageBreak()
1098 {
1099 markup( pageBreakElement );
1100 }
1101
1102
1103 public void figure()
1104 {
1105 writeStartTag( SimplifiedDocbookMarkup.MEDIAOBJECT_TAG );
1106 }
1107
1108
1109 public void figure_()
1110 {
1111 writeEndTag( SimplifiedDocbookMarkup.MEDIAOBJECT_TAG );
1112 }
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124 protected void graphicElement()
1125 {
1126 if ( graphicsFileName != null )
1127 {
1128 String format = FileUtils.extension( graphicsFileName ).toUpperCase( Locale.ENGLISH );
1129 if ( format.length() == 0 )
1130 {
1131 format = "JPEG";
1132 }
1133
1134 writeStartTag( SimplifiedDocbookMarkup.MEDIAOBJECT_TAG );
1135 writeStartTag( SimplifiedDocbookMarkup.IMAGEOBJECT_TAG );
1136
1137 MutableAttributeSet att = new SimpleAttributeSet();
1138 att.addAttribute( SimplifiedDocbookMarkup.FORMAT_ATTRIBUTE, format );
1139 att.addAttribute( SimplifiedDocbookMarkup.FILEREF_ATTRIBUTE,
1140 HtmlTools.escapeHTML( graphicsFileName, true ) );
1141
1142 writeSimpleTag( SimplifiedDocbookMarkup.IMAGEDATA_TAG, att );
1143
1144 writeEndTag( SimplifiedDocbookMarkup.IMAGEOBJECT_TAG );
1145 writeEndTag( SimplifiedDocbookMarkup.MEDIAOBJECT_TAG );
1146 graphicsFileName = null;
1147 }
1148 }
1149
1150
1151 public void figureGraphics( String name )
1152 {
1153 String format = FileUtils.extension( name ).toUpperCase( Locale.ENGLISH );
1154
1155 writeStartTag( SimplifiedDocbookMarkup.IMAGEOBJECT_TAG );
1156
1157 MutableAttributeSet att = new SimpleAttributeSet();
1158 att.addAttribute( SimplifiedDocbookMarkup.FORMAT_ATTRIBUTE, format );
1159 att.addAttribute( SimplifiedDocbookMarkup.FILEREF_ATTRIBUTE, HtmlTools.escapeHTML( name, true ) );
1160
1161 writeSimpleTag( SimplifiedDocbookMarkup.IMAGEDATA_TAG, att );
1162
1163 writeEndTag( SimplifiedDocbookMarkup.IMAGEOBJECT_TAG );
1164 }
1165
1166
1167
1168
1169
1170
1171 public void figureCaption()
1172 {
1173 writeStartTag( SimplifiedDocbookMarkup.CAPTION_TAG );
1174 writeStartTag( SimplifiedDocbookMarkup.PARA_TAG );
1175 }
1176
1177
1178
1179
1180
1181
1182 public void figureCaption_()
1183 {
1184 writeEndTag( SimplifiedDocbookMarkup.PARA_TAG );
1185 writeEndTag( SimplifiedDocbookMarkup.CAPTION_TAG );
1186 }
1187
1188
1189 public void table()
1190 {
1191 tableHasCaption = false;
1192 }
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202 public void table_()
1203 {
1204 if ( tableHasCaption )
1205 {
1206 tableHasCaption = false;
1207
1208
1209 out.write( tableRows );
1210 writeEndTag( TABLE_TAG );
1211 }
1212 else
1213 {
1214 String frame = "none";
1215 String sep = "0";
1216 if ( tableHasGrid )
1217 {
1218 frame = "all";
1219 sep = "1";
1220 }
1221
1222 MutableAttributeSet att = new SimpleAttributeSet();
1223 att.addAttribute( SimplifiedDocbookMarkup.FRAME_ATTRIBUTE, frame );
1224 att.addAttribute( SimplifiedDocbookMarkup.ROWSEP_ATTRIBUTE, sep );
1225 att.addAttribute( SimplifiedDocbookMarkup.COLSEP_ATTRIBUTE, sep );
1226
1227 writeStartTag( SimplifiedDocbookMarkup.INFORMALTABLE_TAG, att );
1228
1229 out.write( tableRows );
1230
1231 writeEndTag( SimplifiedDocbookMarkup.INFORMALTABLE_TAG );
1232 }
1233
1234 tableRows = null;
1235 tableHasGrid = false;
1236 }
1237
1238
1239
1240
1241
1242
1243
1244 public void tableRows( int[] justification, boolean grid )
1245 {
1246 tableHasGrid = grid;
1247
1248
1249 out.flush();
1250 savedOut = out;
1251 tableRowsWriter = new StringWriter();
1252 out = new PrintWriter( tableRowsWriter );
1253
1254 MutableAttributeSet att = new SimpleAttributeSet();
1255 att.addAttribute( SimplifiedDocbookMarkup.COLS_ATTRIBUTE, String.valueOf( justification.length ) );
1256
1257 writeStartTag( SimplifiedDocbookMarkup.TGROUP_TAG, att );
1258
1259 for ( int i = 0; i < justification.length; ++i )
1260 {
1261 String justif;
1262 switch ( justification[i] )
1263 {
1264 case Sink.JUSTIFY_LEFT:
1265 justif = "left";
1266 break;
1267 case Sink.JUSTIFY_RIGHT:
1268 justif = "right";
1269 break;
1270 case Sink.JUSTIFY_CENTER:
1271 default:
1272 justif = "center";
1273 break;
1274 }
1275
1276 att = new SimpleAttributeSet();
1277 att.addAttribute( "align", justif );
1278
1279 writeSimpleTag( SimplifiedDocbookMarkup.COLSPEC_TAG, att );
1280 }
1281
1282 writeStartTag( SimplifiedDocbookMarkup.TBODY_TAG );
1283 }
1284
1285
1286
1287
1288
1289
1290 public void tableRows_()
1291 {
1292 writeEndTag( SimplifiedDocbookMarkup.TBODY_TAG );
1293 writeEndTag( SimplifiedDocbookMarkup.TGROUP_TAG );
1294
1295
1296 out.flush();
1297 if ( tableRowsWriter == null )
1298 {
1299 throw new IllegalArgumentException( "tableRows( int[] justification, boolean grid )"
1300 + " was not called before." );
1301 }
1302
1303 tableRows = tableRowsWriter.toString();
1304 tableRowsWriter = null;
1305 out = savedOut;
1306 }
1307
1308
1309
1310
1311
1312 public void tableRow()
1313 {
1314 writeStartTag( SimplifiedDocbookMarkup.ROW_TAG );
1315 }
1316
1317
1318
1319
1320
1321 public void tableRow_()
1322 {
1323 writeEndTag( SimplifiedDocbookMarkup.ROW_TAG );
1324 }
1325
1326
1327
1328
1329
1330 public void tableCell()
1331 {
1332 writeStartTag( SimplifiedDocbookMarkup.ENTRY_TAG );
1333 }
1334
1335
1336
1337
1338
1339 public void tableCell_()
1340 {
1341 writeEndTag( SimplifiedDocbookMarkup.ENTRY_TAG );
1342 }
1343
1344
1345
1346
1347
1348 public void tableHeaderCell()
1349 {
1350 writeStartTag( SimplifiedDocbookMarkup.ENTRY_TAG );
1351 }
1352
1353
1354
1355
1356
1357 public void tableHeaderCell_()
1358 {
1359 writeEndTag( SimplifiedDocbookMarkup.ENTRY_TAG );
1360 }
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370 public void tableCaption()
1371 {
1372 tableHasCaption = true;
1373
1374 String frame;
1375 int sep;
1376 if ( tableHasGrid )
1377 {
1378 frame = "all";
1379 sep = 1;
1380 }
1381 else
1382 {
1383 frame = "none";
1384 sep = 0;
1385 }
1386
1387 MutableAttributeSet att = new SimpleAttributeSet();
1388 att.addAttribute( SimplifiedDocbookMarkup.FRAME_ATTRIBUTE, frame );
1389 att.addAttribute( SimplifiedDocbookMarkup.ROWSEP_ATTRIBUTE, String.valueOf( sep ) );
1390 att.addAttribute( SimplifiedDocbookMarkup.COLSEP_ATTRIBUTE, String.valueOf( sep ) );
1391
1392 writeStartTag( TABLE_TAG, att );
1393
1394 writeStartTag( SimplifiedDocbookMarkup.TITLE_TAG );
1395 }
1396
1397
1398
1399
1400
1401 public void tableCaption_()
1402 {
1403 writeEndTag( SimplifiedDocbookMarkup.TITLE_TAG );
1404 }
1405
1406
1407
1408
1409
1410 public void anchor( String name )
1411 {
1412 if ( name == null )
1413 {
1414 throw new NullPointerException( "Anchor name cannot be null!" );
1415 }
1416
1417 if ( authorDateFlag )
1418 {
1419 return;
1420 }
1421
1422 String id = name;
1423
1424 if ( !DoxiaUtils.isValidId( id ) )
1425 {
1426 id = DoxiaUtils.encodeId( name, true );
1427
1428 String msg = "Modified invalid anchor name: '" + name + "' to '" + id + "'";
1429 logMessage( "modifiedLink", msg );
1430 }
1431
1432 MutableAttributeSet att = new SimpleAttributeSet();
1433 att.addAttribute( ID_ATTRIBUTE, id );
1434
1435 writeSimpleTag( SimplifiedDocbookMarkup.ANCHOR_TAG, att );
1436 }
1437
1438
1439
1440
1441
1442 public void anchor_()
1443 {
1444 comment( "anchor_end" );
1445 }
1446
1447
1448
1449
1450
1451
1452
1453
1454 public void link( String name )
1455 {
1456 if ( name == null )
1457 {
1458 throw new NullPointerException( "Link name cannot be null!" );
1459 }
1460
1461 if ( DoxiaUtils.isInternalLink( name ) )
1462 {
1463 String linkend = name.substring( 1 );
1464 MutableAttributeSet att = new SimpleAttributeSet();
1465 att.addAttribute( SimplifiedDocbookMarkup.LINKEND_ATTRIBUTE, HtmlTools.escapeHTML( linkend ) );
1466
1467 writeStartTag( SimplifiedDocbookMarkup.LINK_TAG, att );
1468 }
1469 else
1470 {
1471 externalLinkFlag = true;
1472 MutableAttributeSet att = new SimpleAttributeSet();
1473 att.addAttribute( SimplifiedDocbookMarkup.URL_ATTRIBUTE, HtmlTools.escapeHTML( name, true ) );
1474
1475 writeStartTag( SimplifiedDocbookMarkup.ULINK_TAG, att );
1476 }
1477 }
1478
1479
1480
1481
1482
1483
1484 public void link_()
1485 {
1486 if ( externalLinkFlag )
1487 {
1488 writeEndTag( SimplifiedDocbookMarkup.ULINK_TAG );
1489 externalLinkFlag = false;
1490 }
1491 else
1492 {
1493 writeEndTag( SimplifiedDocbookMarkup.LINK_TAG );
1494 }
1495 }
1496
1497
1498 public void italic()
1499 {
1500 markup( italicBeginTag );
1501 }
1502
1503
1504 public void italic_()
1505 {
1506 markup( italicEndTag );
1507 }
1508
1509
1510 public void bold()
1511 {
1512 markup( boldBeginTag );
1513 }
1514
1515
1516 public void bold_()
1517 {
1518 markup( boldEndTag );
1519 }
1520
1521
1522 public void monospaced()
1523 {
1524 if ( !authorDateFlag )
1525 {
1526 markup( monospacedBeginTag );
1527 }
1528 }
1529
1530
1531 public void monospaced_()
1532 {
1533 if ( !authorDateFlag )
1534 {
1535 markup( monospacedEndTag );
1536 }
1537 }
1538
1539
1540 public void lineBreak()
1541 {
1542 markup( lineBreakElement );
1543 }
1544
1545
1546 public void nonBreakingSpace()
1547 {
1548 markup( " " );
1549
1550 }
1551
1552
1553 public void text( String text )
1554 {
1555 if ( verbatimFlag )
1556 {
1557 verbatimContent( text );
1558 }
1559 else
1560 {
1561 content( text );
1562 }
1563 }
1564
1565
1566 public void comment( String comment )
1567 {
1568 if ( StringUtils.isNotEmpty( comment ) && comment.indexOf( "--" ) != -1 )
1569 {
1570 String originalComment = comment;
1571
1572 while ( comment.indexOf( "--" ) != -1 )
1573 {
1574 comment = StringUtils.replace( comment, "--", "- -" );
1575 }
1576
1577 String msg = "Modified invalid comment: '" + originalComment + "' to '" + comment + "'";
1578 logMessage( "modifiedComment", msg );
1579 }
1580
1581 StringBuilder buffer = new StringBuilder( comment.length() + 9 );
1582
1583 buffer.append( LESS_THAN ).append( BANG ).append( MINUS ).append( MINUS ).append( SPACE );
1584 buffer.append( comment );
1585 buffer.append( SPACE ).append( MINUS ).append( MINUS ).append( GREATER_THAN );
1586
1587 markup( buffer.toString() );
1588 }
1589
1590
1591
1592
1593
1594
1595
1596 public void unknown( String name, Object[] requiredParams, SinkEventAttributes attributes )
1597 {
1598 String msg = "Unknown Sink event: '" + name + "', ignoring!";
1599 logMessage( "unknownEvent", msg );
1600 }
1601
1602
1603
1604
1605
1606
1607
1608
1609 protected void markup( String text )
1610 {
1611 if ( !skip )
1612 {
1613 out.write( text );
1614 }
1615 }
1616
1617
1618
1619
1620
1621
1622 protected void content( String text )
1623 {
1624 if ( !skip )
1625 {
1626 out.write( HtmlTools.escapeHTML( text, true ) );
1627 }
1628 }
1629
1630
1631
1632
1633
1634
1635 protected void verbatimContent( String text )
1636 {
1637 if ( !skip )
1638 {
1639 out.write( HtmlTools.escapeHTML( text, true ) );
1640 }
1641 }
1642
1643
1644
1645
1646 public void flush()
1647 {
1648 out.flush();
1649 }
1650
1651
1652 public void close()
1653 {
1654 out.close();
1655
1656 if ( getLog().isWarnEnabled() && this.warnMessages != null )
1657 {
1658 for ( Map.Entry<String, Set<String>> entry : this.warnMessages.entrySet() )
1659 {
1660 for ( String msg : entry.getValue() )
1661 {
1662 getLog().warn( msg );
1663 }
1664 }
1665
1666 this.warnMessages = null;
1667 }
1668 }
1669
1670
1671 protected void write( String text )
1672 {
1673 markup( unifyEOLs( text ) );
1674 }
1675
1676
1677
1678
1679
1680
1681
1682 public void setSkip( boolean skip )
1683 {
1684 this.skip = skip;
1685 }
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695 private void logMessage( String key, String msg )
1696 {
1697 msg = "[Docbook Sink] " + msg;
1698 if ( getLog().isDebugEnabled() )
1699 {
1700 getLog().debug( msg );
1701
1702 return;
1703 }
1704
1705 if ( warnMessages == null )
1706 {
1707 warnMessages = new HashMap<String, Set<String>>();
1708 }
1709
1710 Set<String> set = warnMessages.get( key );
1711 if ( set == null )
1712 {
1713 set = new TreeSet<String>();
1714 }
1715 set.add( msg );
1716 warnMessages.put( key, set );
1717 }
1718 }