Line data Source code
1 : /* File: document_element_writer.c; Copyright and License: see below */
2 :
3 : #include "document/document_element_writer.h"
4 : #include "utf8stringbuf/utf8string.h"
5 : #include "entity/data_id.h"
6 : #include "u8/u8_trace.h"
7 : #include "u8/u8_log.h"
8 : #include <stdio.h>
9 : #include <stdbool.h>
10 : #include <assert.h>
11 :
12 : /* GENERAL STRUCTURE */
13 :
14 : /*
15 : * <THING>_START
16 : * <THING>_MIDDLE #optional, if dynamic content needs to be added to the start
17 : * <THING>_TITLE_START #alternative to TITLE: NAME
18 : * <THING>_TITLE_END #alternative to TITLE: NAME
19 : * ... #optional text
20 : * <THING>_<OTHERSUB>_START #optional if there ore other sub-things
21 : * <THING>_<OTHERSUB>_END #optional if there ore other sub-things
22 : * <THING>_END
23 : */
24 :
25 : /* IO_FILE_FORMAT_DOCBOOK */
26 :
27 : #define DOCUMENT_ELEMENT_WRITER_LEFT_POINTING_GUILLEMENTS "\xc2\xab"
28 : #define DOCUMENT_ELEMENT_WRITER_RIGHT_POINTING_GUILLEMENTS "\xc2\xbb"
29 : #define DOCUMENT_ELEMENT_WRITER_NON_BREAKING_SPACE "\xc2\xa0"
30 :
31 : static const char DOCBOOK_ENC[]
32 : = "<?xml version=\"1.0\" encoding=\"utf-8\"?>";
33 : static const char DOCBOOK_DOC_START[]
34 : = "\n<book xmlns=\"http://docbook.org/ns/docbook\" version=\"5.0\" xml:lang=\"en\">";
35 : static const char DOCBOOK_DOC_TITLE_START[]
36 : = "\n<title>";
37 : static const char DOCBOOK_DOC_TITLE_END[]
38 : = "</title>";
39 : static const char DOCBOOK_DOC_END[]
40 : = "\n</book>\n";
41 :
42 : static const char DOCBOOK_TOP_DIAGRAM_START[]
43 : = "\n<chapter xml:id=\"";
44 : static const char DOCBOOK_TOP_DIAGRAM_MIDDLE[]
45 : = "\">";
46 : static const char DOCBOOK_TOP_DIAGRAM_END[]
47 : = "\n</chapter>";
48 : static const char DOCBOOK_DIAGRAM_START[]
49 : = "\n<section xml:id=\"";
50 : static const char DOCBOOK_DIAGRAM_MIDDLE[]
51 : = "\">";
52 : static const char DOCBOOK_DIAGRAM_TITLE_START[]
53 : = "\n<title>";
54 : static const char DOCBOOK_DIAGRAM_TITLE_END[]
55 : = "</title>";
56 : static const char DOCBOOK_DIAGRAM_IMG_START[]
57 : = "\n<para>"
58 : "\n <mediaobject>"
59 : "\n <imageobject><imagedata fileref=\"";
60 : static const char DOCBOOK_DIAGRAM_IMG_MIDDLE[]
61 : = ".pdf\" width=\"12cm\"/></imageobject>"
62 : "\n <imageobject><imagedata fileref=\"";
63 : static const char DOCBOOK_DIAGRAM_IMG_END[]
64 : = ".png\"/></imageobject>"
65 : "\n </mediaobject>"
66 : "\n</para>";
67 : static const char DOCBOOK_DIAGRAM_END[]
68 : = "\n</section>";
69 :
70 : static const char DOCBOOK_CONTENT_START[]
71 : = "\n<para>";
72 : static const char DOCBOOK_CONTENT_END[]
73 : = "\n</para>";
74 :
75 : static const char DOCBOOK_DESCRIPTION_START[]
76 : = "\n<para role=\"description\">";
77 : static const char DOCBOOK_DESCRIPTION_MIDDLE[] /* optional */
78 : = "\n</para>"
79 : "\n<para role=\"description\">";
80 : static const char DOCBOOK_DESCRIPTION_END[]
81 : = "\n</para>";
82 : static const char DOCBOOK_DESCRIPTION_XREF_START[]
83 : = "<xref linkend=\"";
84 : static const char DOCBOOK_DESCRIPTION_XREF_MIDDLE[]
85 : = "\"/>: ";
86 : static const char DOCBOOK_DESCRIPTION_XREF_END[]
87 : = "";
88 :
89 : static const char DOCBOOK_ELEMENT_LIST_START[]
90 : = "\n<variablelist>";
91 : static const char DOCBOOK_ELEMENT_START_DIAGRAM[]
92 : = "\n<varlistentry role=\"diagram\">";
93 : static const char DOCBOOK_ELEMENT_START_CLASSIFIER[]
94 : = "\n<varlistentry role=\"classifier\">";
95 : static const char DOCBOOK_ELEMENT_START_FEATURE[]
96 : = "\n<varlistentry role=\"feature\">";
97 : static const char DOCBOOK_ELEMENT_START_RELATIONSHIP[]
98 : = "\n<varlistentry role=\"relationship\">";
99 : static const char DOCBOOK_ELEMENT_NAME_START[]
100 : = "\n<term>";
101 : static const char DOCBOOK_ELEMENT_NAME_END[]
102 : = "</term>"
103 : "\n<listitem>";
104 : static const char DOCBOOK_ELEMENT_ATTRIBUTES_START[]
105 : = "\n<para>";
106 : static const char DOCBOOK_ELEMENT_STEREO_START[]
107 : = "\n" DOCUMENT_ELEMENT_WRITER_LEFT_POINTING_GUILLEMENTS;
108 : static const char DOCBOOK_ELEMENT_STEREO_END[]
109 : = DOCUMENT_ELEMENT_WRITER_RIGHT_POINTING_GUILLEMENTS;
110 : static const char DOCBOOK_ELEMENT_ID_START[]
111 : = "\n<token role=\"id\">";
112 : static const char DOCBOOK_ELEMENT_ID_END[]
113 : = "</token>";
114 : static const char DOCBOOK_ELEMENT_TYPE_TOKEN_START[]
115 : = "\n<token role=\"type\">";
116 : static const char DOCBOOK_ELEMENT_TYPE_TOKEN_END[]
117 : = "</token>";
118 : static const char DOCBOOK_ELEMENT_SEE_START[] = "\n<emphasis>(appears in ";
119 : static const char DOCBOOK_ELEMENT_SEE_NEXT[] = ",\n";
120 : static const char DOCBOOK_ELEMENT_SEE_END[] = ")\n</emphasis>";
121 : static const char DOCBOOK_ELEMENT_ATTRIBUTES_END[]
122 : = "\n</para>";
123 : static const char DOCBOOK_ELEMENT_DESCR_START[] /* optional */
124 : = "\n<para role=\"description\">";
125 : static const char DOCBOOK_ELEMENT_DESCR_END[] /* optional */
126 : = "\n</para>";
127 : static const char DOCBOOK_ELEMENT_END[]
128 : = "\n </listitem>"
129 : "\n</varlistentry>";
130 : static const char DOCBOOK_ELEMENT_LIST_END[]
131 : = "\n</variablelist>";
132 : static const char DOCBOOK_ELEMENT_DUMMY[] /* to avoid empty lists */
133 : = "\n<varlistentry role=\"dummy\"><term></term><listitem><para></para></listitem></varlistentry>";
134 : static const char DOCBOOK_INDENT[]
135 : = "<token role=\"indent\">-<![CDATA[" DOCUMENT_ELEMENT_WRITER_NON_BREAKING_SPACE
136 : DOCUMENT_ELEMENT_WRITER_NON_BREAKING_SPACE DOCUMENT_ELEMENT_WRITER_NON_BREAKING_SPACE
137 : DOCUMENT_ELEMENT_WRITER_NON_BREAKING_SPACE DOCUMENT_ELEMENT_WRITER_NON_BREAKING_SPACE
138 : DOCUMENT_ELEMENT_WRITER_NON_BREAKING_SPACE DOCUMENT_ELEMENT_WRITER_NON_BREAKING_SPACE "]]> </token>";
139 :
140 : /* IO_FILE_FORMAT_HTML */
141 :
142 : enum HTML_DIAGRAM_MAX { HTML_DIAGRAM_MAX_DEPTH = 6, };
143 : static const char HTML_DTD[]
144 : = "<!DOCTYPE html>";
145 : static const char HTML_DOC_START[]
146 : = "\n<html>";
147 : static const char HTML_HEAD_START[]
148 : = "\n<head>"
149 : "\n <meta charset=\"UTF-8\" />";
150 : /* "\n <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />"; < old */
151 : static const char HTML_HEAD_TITLE_START[]
152 : = "\n<title>";
153 : static const char HTML_HEAD_TITLE_END[]
154 : = "</title>";
155 : static const char HTML_HEAD_CSS_START[]
156 : = "\n<link rel=\"stylesheet\" type=\"text/css\" href=\"";
157 : static const char HTML_HEAD_CSS_END[]
158 : = ".css\" />";
159 : static const char HTML_HEAD_END[]
160 : = "\n</head>";
161 : static const char HTML_BODY_START[]
162 : = "\n<body>";
163 : static const char HTML_HEADER[]
164 : = "\n<header></header>";
165 : static const char HTML_NAV_START[]
166 : = "\n<nav>";
167 : static const char HTML_NAV_END[]
168 : = "\n</nav>";
169 : static const char HTML_ARTICLE_START[]
170 : = "\n<main>"
171 : "\n<article>";
172 : static const char HTML_ARTICLE_END[]
173 : = "\n</article>"
174 : "\n</main>";
175 : static const char HTML_FOOTER[]
176 : = "\n<footer></footer>";
177 : static const char HTML_BODY_END[]
178 : = "\n</body>";
179 : static const char HTML_DOC_END[]
180 : = "\n</html>\n";
181 : static const char HTML_TOC_SUBLIST_START[]
182 : = "\n<ul class=\"toc\">";
183 : static const char *HTML_TOC_SUBLIST_ENTRY_START[HTML_DIAGRAM_MAX_DEPTH]
184 : = {
185 : "\n<li class=\"toc1\">",
186 : "\n<li class=\"toc2\">",
187 : "\n<li class=\"toc3\">",
188 : "\n<li class=\"toc4\">",
189 : "\n<li class=\"toc5\">",
190 : "\n<li class=\"toc6\">"
191 : };
192 : static const char HTML_TOC_SUBLIST_ENTRY_TITLE_START[]
193 : = "\n<a href=\"#";
194 : static const char HTML_TOC_SUBLIST_ENTRY_TITLE_MIDDLE[]
195 : = "\">";
196 : static const char HTML_TOC_SUBLIST_ENTRY_TITLE_END[]
197 : = "</a>";
198 : static const char HTML_TOC_SUBLIST_ENTRY_END[]
199 : = "\n</li>";
200 : static const char HTML_TOC_SUBLIST_END[]
201 : = "\n</ul>";
202 :
203 : static const char *HTML_DIAGRAM_TITLE_START[HTML_DIAGRAM_MAX_DEPTH]
204 : = {
205 : "\n\n<h1 id=\"",
206 : "\n\n<h2 id=\"",
207 : "\n\n<h3 id=\"",
208 : "\n\n<h4 id=\"",
209 : "\n\n<h5 id=\"",
210 : "\n\n<h6 id=\""
211 : };
212 : static const char HTML_DIAGRAM_TITLE_MIDDLE[]
213 : = "\" class=\"diag-title\">";
214 : static const char *HTML_DIAGRAM_TITLE_END[HTML_DIAGRAM_MAX_DEPTH]
215 : = {
216 : "</h1>",
217 : "</h2>",
218 : "</h3>",
219 : "</h4>",
220 : "</h5>",
221 : "</h6>"
222 : };
223 : static const char HTML_DIAGRAM_IMG_START[]
224 : = "\n<div class=\"mediaobject\"><img src=\"";
225 : static const char HTML_DIAGRAM_IMG_END[]
226 : = ".png\" width=\"840\" alt=\"\" /></div>";
227 :
228 : static const char HTML_ANY_DESCR_NEWLINE[]
229 : = "\n<br />\n";
230 : static const char HTML_ANY_DESCR_XREF_START[]
231 : = "<a href=\"#";
232 : static const char HTML_ANY_DESCR_XREF_MIDDLE[]
233 : = "\">";
234 : static const char HTML_ANY_DESCR_XREF_END[]
235 : = "</a>";
236 :
237 : static const char HTML_DIAG_START[] = "\n<div class=\"diag\">";
238 : static const char HTML_DIAG_HEAD_START[] = "\n<p>";
239 : static const char HTML_DIAG_NAME_START[] = "\n<strong class=\"diag-name\">";
240 : static const char HTML_DIAG_NAME_END[] = "</strong>";
241 : static const char HTML_DIAG_STEREO_START[] = "\n<em class=\"diag-stereo\">";
242 : static const char HTML_DIAG_STEREO_END[] = "</em>";
243 : static const char HTML_DIAG_TYPE_START[] = "\n<em class=\"diag-type\">";
244 : static const char HTML_DIAG_TYPE_END[] = "</em>";
245 : static const char HTML_DIAG_ID_START[] = "\n<em class=\"diag-id\">";
246 : static const char HTML_DIAG_ID_END[] = "</em>";
247 : static const char HTML_DIAG_HEAD_END[] = "\n</p>";
248 : static const char HTML_DIAG_DESCR_START[] = "\n<p class=\"diag-descr\">\n";
249 : static const char HTML_DIAG_DESCR_END[] = "\n</p>";
250 : static const char HTML_DIAG_END[] = "\n</div>";
251 :
252 : static const char HTML_CLAS_START[] = "\n<div class=\"clas\">";
253 : static const char HTML_CLAS_HEAD_START[] = "\n<p>";
254 : static const char HTML_CLAS_NAME_START[] = "\n<strong class=\"clas-name\">";
255 : static const char HTML_CLAS_NAME_END[] = "</strong>";
256 : static const char HTML_CLAS_STEREO_START[] = "\n<em class=\"clas-stereo\">";
257 : static const char HTML_CLAS_STEREO_END[] = "</em>";
258 : static const char HTML_CLAS_TYPE_START[] = "\n<em class=\"clas-type\">";
259 : static const char HTML_CLAS_TYPE_END[] = "</em>";
260 : static const char HTML_CLAS_ID_START[] = "\n<em class=\"clas-id\">";
261 : static const char HTML_CLAS_ID_END[] = "</em>";
262 : static const char HTML_CLAS_HEAD_END[] = "\n</p>";
263 : static const char HTML_CLAS_SEE_START[] = "\n<p class=\"clas-see\">\n";
264 : static const char HTML_CLAS_SEE_NEXT[] = ",\n";
265 : static const char HTML_CLAS_SEE_END[] = "\n</p>";
266 : static const char HTML_CLAS_DESCR_START[] = "\n<p class=\"clas-descr\">\n";
267 : static const char HTML_CLAS_DESCR_END[] = "\n</p>";
268 : static const char HTML_CLAS_END[] = "\n</div>";
269 :
270 : static const char HTML_FEAT_START[] = "\n<div class=\"feat\">";
271 : static const char HTML_FEAT_HEAD_START[] = "\n<p>";
272 : static const char HTML_FEAT_NAME_START[] = "\n<strong class=\"feat-name\">";
273 : static const char HTML_FEAT_NAME_END[] = "</strong>";
274 : static const char HTML_FEAT_STEREO_START[] = "\n<em class=\"feat-stereo\">";
275 : static const char HTML_FEAT_STEREO_END[] = "</em>";
276 : static const char HTML_FEAT_VALUE_START[] = "\n<em class=\"feat-value\">";
277 : static const char HTML_FEAT_VALUE_END[] = "</em>";
278 : static const char HTML_FEAT_TYPE_START[] = "\n<em class=\"feat-type\">";
279 : static const char HTML_FEAT_TYPE_END[] = "</em>";
280 : static const char HTML_FEAT_ID_START[] = "\n<em class=\"feat-id\">";
281 : static const char HTML_FEAT_ID_END[] = "</em>";
282 : static const char HTML_FEAT_HEAD_END[] = "\n</p>";
283 : static const char HTML_FEAT_DESCR_START[] = "\n<p class=\"feat-descr\">\n";
284 : static const char HTML_FEAT_DESCR_END[] = "\n</p>";
285 : static const char HTML_FEAT_END[] = "\n</div>";
286 :
287 : static const char HTML_REL_START[] = "\n<div class=\"rel\">";
288 : static const char HTML_REL_HEAD_START[] = "\n<p>";
289 : static const char HTML_REL_NAME_START[] = "\n<strong class=\"rel-name\">";
290 : static const char HTML_REL_NAME_END[] = "</strong>";
291 : static const char HTML_REL_DEST_START[] = "\n<strong class=\"rel-dest\">";
292 : static const char HTML_REL_DEST_END[] = "</strong>";
293 : static const char HTML_REL_STEREO_START[] = "\n<em class=\"rel-stereo\">";
294 : static const char HTML_REL_STEREO_END[] = "</em>";
295 : static const char HTML_REL_TYPE_START[] = "\n<em class=\"rel-type\">";
296 : static const char HTML_REL_TYPE_END[] = "</em>";
297 : static const char HTML_REL_ID_START[] = "\n<em class=\"rel-id\">";
298 : static const char HTML_REL_ID_END[] = "</em>";
299 : static const char HTML_REL_HEAD_END[] = "\n</p>";
300 : static const char HTML_REL_DESCR_START[] = "\n<p class=\"rel-descr\">\n";
301 : static const char HTML_REL_DESCR_END[] = "\n</p>";
302 : static const char HTML_REL_END[] = "\n</div>";
303 :
304 : /* IO_FILE_FORMAT_TXT */
305 :
306 : static const int TXT_ID_ALIGN_COLUMN = 80; /* the alignment column of the id in export mode txt */
307 : static const char TXT_NEWLINE[] = "\n";
308 : static const char TXT_NO_INDENT[] = "";
309 : static const char TXT_FEAT_INDENT[] = "+ ";
310 : static const char TXT_REL_INDENT[] = "* ";
311 : static const char TXT_CONTINUE_INDENT[] = " ";
312 : static const char TXT_COLON_SPACE[] = ": ";
313 : static const char TXT_SPACE[] = " ";
314 : static const char TXT_CODE_START[] = "`";
315 : static const char TXT_CODE_END[] = "`";
316 : static const char TXT_DIAG_UNDERLINE = '='; /* underline character for diagram names */
317 : static const char TXT_CLAS_UNDERLINE = '-'; /* underline character for classifier names */
318 :
319 : #define io_element_writer_impl_t document_element_writer_t
320 : /*!
321 : * \brief A struct of function pointers which is the interface of an io_element_writer
322 : *
323 : * To avoid typecasts, this struct provides function pointers with the exact right signatures
324 : * provided via io_element_writer_impl_t
325 : */
326 : struct document_element_writer_io_element_writer_if_struct {
327 : #include "io_element_writer_if.inl"
328 : };
329 : #undef io_element_writer_impl_t
330 :
331 : /* the vmt implementing the interface */
332 : static const struct document_element_writer_io_element_writer_if_struct document_element_writer_private_io_element_writer_if
333 : = {
334 : .write_header = &document_element_writer_write_header,
335 : .start_main = &document_element_writer_start_main,
336 : .can_classifier_nest_classifier = &document_element_writer_can_classifier_nest_classifier,
337 : .can_classifier_nest_relationship = &document_element_writer_can_classifier_nest_relationship,
338 : .start_classifier = &document_element_writer_start_classifier,
339 : .assemble_classifier = &document_element_writer_assemble_classifier,
340 : .end_classifier = &document_element_writer_end_classifier,
341 : .start_feature = &document_element_writer_start_feature,
342 : .assemble_feature = &document_element_writer_assemble_feature,
343 : .end_feature = &document_element_writer_end_feature,
344 : .start_relationship = &document_element_writer_start_relationship,
345 : .assemble_relationship = &document_element_writer_assemble_relationship,
346 : .end_relationship = &document_element_writer_end_relationship,
347 : .start_diagram = &document_element_writer_start_diagram,
348 : .assemble_diagram = &document_element_writer_assemble_diagram,
349 : .descend_diagram = &document_element_writer_descend_diagram,
350 : .end_diagram = &document_element_writer_end_diagram,
351 : .start_diagramelement = &document_element_writer_start_diagramelement,
352 : .assemble_diagramelement = &document_element_writer_assemble_diagramelement,
353 : .end_diagramelement = &document_element_writer_end_diagramelement,
354 : .end_main = &document_element_writer_end_main,
355 : .write_footer = &document_element_writer_write_footer
356 : };
357 :
358 0 : void document_element_writer_init ( document_element_writer_t *this_,
359 : data_database_reader_t *db_reader,
360 : io_file_format_t export_type,
361 : data_stat_t *io_export_stat,
362 : universal_output_stream_t *output )
363 : {
364 0 : U8_TRACE_BEGIN();
365 0 : assert( NULL != output );
366 0 : assert( NULL != io_export_stat );
367 0 : assert( NULL != db_reader );
368 :
369 0 : io_element_writer_private_init( &((*this_).element_writer),
370 : (io_element_writer_if_t*) &document_element_writer_private_io_element_writer_if,
371 : this_
372 : );
373 0 : (*this_).export_stat = io_export_stat;
374 :
375 0 : (*this_).export_type = export_type;
376 0 : (*this_).current_tree_depth = 0;
377 :
378 0 : json_type_name_map_init( &((*this_).type_map) );
379 0 : data_rules_init( &((*this_).data_rules) );
380 0 : io_txt_icon_init( &((*this_).txt_icon) );
381 :
382 0 : io_txt_writer_init( &((*this_).txt_writer), output );
383 0 : io_xml_writer_init( &((*this_).xml_writer), output );
384 :
385 0 : switch ( (*this_).export_type )
386 : {
387 0 : case IO_FILE_FORMAT_DOCBOOK:
388 : {
389 0 : document_link_provider_init( &((*this_).link_provider),
390 : db_reader,
391 : DOCBOOK_ELEMENT_SEE_NEXT,
392 : DOCBOOK_DESCRIPTION_XREF_START,
393 : DOCBOOK_DESCRIPTION_XREF_MIDDLE,
394 : DOCBOOK_DESCRIPTION_XREF_END,
395 : &((*this_).xml_writer)
396 : );
397 0 : io_md_writer_init( &((*this_).md_writer),
398 : db_reader,
399 : DOCBOOK_DESCRIPTION_MIDDLE,
400 : DOCBOOK_DESCRIPTION_XREF_START,
401 : DOCBOOK_DESCRIPTION_XREF_MIDDLE,
402 : DOCBOOK_DESCRIPTION_XREF_END,
403 : &((*this_).xml_writer)
404 : );
405 : }
406 0 : break;
407 :
408 0 : case IO_FILE_FORMAT_HTML:
409 : {
410 0 : document_link_provider_init( &((*this_).link_provider),
411 : db_reader,
412 : HTML_CLAS_SEE_NEXT,
413 : HTML_ANY_DESCR_XREF_START,
414 : HTML_ANY_DESCR_XREF_MIDDLE,
415 : HTML_ANY_DESCR_XREF_END,
416 : &((*this_).xml_writer)
417 : );
418 0 : io_md_writer_init( &((*this_).md_writer),
419 : db_reader,
420 : HTML_ANY_DESCR_NEWLINE,
421 : HTML_ANY_DESCR_XREF_START,
422 : HTML_ANY_DESCR_XREF_MIDDLE,
423 : HTML_ANY_DESCR_XREF_END,
424 : &((*this_).xml_writer)
425 : );
426 : }
427 0 : break;
428 :
429 0 : case IO_FILE_FORMAT_TXT:
430 : {
431 0 : document_link_provider_init( &((*this_).link_provider),
432 : db_reader,
433 : ", ",
434 : "",
435 : ": ",
436 : "",
437 : &((*this_).xml_writer)
438 : );
439 0 : io_md_writer_init( &((*this_).md_writer), db_reader, "\n", "", ": ", "", &((*this_).xml_writer) );
440 : }
441 0 : break;
442 :
443 0 : default:
444 : {
445 0 : U8_LOG_ERROR("error: unknown_format.");
446 0 : assert(false); /* use another io_element_writer instead */
447 : document_link_provider_init( &((*this_).link_provider),
448 : db_reader,
449 : ", ",
450 : "",
451 : ": ",
452 : "",
453 : &((*this_).xml_writer)
454 : );
455 : io_md_writer_init( &((*this_).md_writer), db_reader, "\n", "", ": ", "", &((*this_).xml_writer) );
456 : }
457 : break;
458 : }
459 :
460 0 : U8_TRACE_END();
461 0 : }
462 :
463 0 : void document_element_writer_destroy( document_element_writer_t *this_ )
464 : {
465 0 : U8_TRACE_BEGIN();
466 :
467 0 : io_md_writer_destroy( &((*this_).md_writer) );
468 0 : document_link_provider_destroy( &((*this_).link_provider) );
469 0 : io_xml_writer_destroy( &((*this_).xml_writer) );
470 0 : io_txt_writer_destroy( &((*this_).txt_writer) );
471 :
472 0 : io_txt_icon_destroy( &((*this_).txt_icon) );
473 0 : data_rules_destroy( &((*this_).data_rules) );
474 0 : json_type_name_map_destroy( &((*this_).type_map) );
475 :
476 0 : (*this_).export_stat = NULL;
477 :
478 0 : io_element_writer_private_destroy( &((*this_).element_writer) );
479 :
480 0 : U8_TRACE_END();
481 0 : }
482 :
483 0 : io_element_writer_t * document_element_writer_get_element_writer( document_element_writer_t *this_ )
484 : {
485 0 : U8_TRACE_BEGIN();
486 :
487 0 : io_element_writer_t * base = &((*this_).element_writer);
488 :
489 0 : U8_TRACE_END();
490 0 : return base;
491 : }
492 :
493 0 : u8_error_t document_element_writer_write_header( document_element_writer_t *this_, const char *document_title )
494 : {
495 0 : U8_TRACE_BEGIN();
496 0 : assert ( NULL != document_title );
497 0 : u8_error_t export_err = U8_ERROR_NONE;
498 :
499 0 : io_xml_writer_reset_indent ( &((*this_).xml_writer) );
500 :
501 0 : switch ( (*this_).export_type )
502 : {
503 0 : case IO_FILE_FORMAT_DOCBOOK:
504 : {
505 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), DOCBOOK_ENC );
506 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), DOCBOOK_DOC_START );
507 0 : io_xml_writer_increase_indent ( &((*this_).xml_writer) );
508 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), DOCBOOK_DOC_TITLE_START );
509 0 : export_err |= io_xml_writer_write_xml_enc ( &((*this_).xml_writer), document_title );
510 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), DOCBOOK_DOC_TITLE_END );
511 : }
512 0 : break;
513 :
514 0 : case IO_FILE_FORMAT_HTML:
515 : {
516 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), HTML_DTD );
517 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), HTML_DOC_START );
518 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), HTML_HEAD_START );
519 0 : io_xml_writer_increase_indent ( &((*this_).xml_writer) );
520 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), HTML_HEAD_TITLE_START );
521 0 : export_err |= io_xml_writer_write_xml_enc ( &((*this_).xml_writer), document_title );
522 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), HTML_HEAD_TITLE_END );
523 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), HTML_HEAD_CSS_START );
524 0 : export_err |= io_xml_writer_write_xml_enc ( &((*this_).xml_writer), document_title );
525 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), HTML_HEAD_CSS_END );
526 0 : io_xml_writer_decrease_indent ( &((*this_).xml_writer) );
527 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), HTML_HEAD_END );
528 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), HTML_BODY_START );
529 0 : io_xml_writer_increase_indent ( &((*this_).xml_writer) );
530 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), HTML_HEADER );
531 : }
532 0 : break;
533 :
534 0 : case IO_FILE_FORMAT_TXT:
535 : {
536 : /* no header */
537 : }
538 0 : break;
539 :
540 0 : default:
541 : {
542 0 : U8_LOG_ERROR("error: unknown_format.");
543 0 : export_err = U8_ERROR_CONFIG_OUT_OF_RANGE;
544 : }
545 0 : break;
546 : }
547 :
548 0 : U8_TRACE_END_ERR( export_err );
549 0 : return export_err;
550 : }
551 :
552 0 : u8_error_t document_element_writer_start_main( document_element_writer_t *this_, const char *document_title )
553 : {
554 0 : U8_TRACE_BEGIN();
555 0 : assert( document_title != NULL );
556 0 : u8_error_t export_err = U8_ERROR_NONE;
557 :
558 0 : switch ( (*this_).export_type )
559 : {
560 0 : case IO_FILE_FORMAT_DOCBOOK:
561 : {
562 : /* no main start */
563 : }
564 0 : break;
565 :
566 0 : case IO_FILE_FORMAT_HTML:
567 : {
568 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), HTML_ARTICLE_START );
569 0 : io_xml_writer_increase_indent ( &((*this_).xml_writer) );
570 : }
571 0 : break;
572 :
573 0 : case IO_FILE_FORMAT_TXT:
574 : {
575 : /* no main start */
576 : }
577 0 : break;
578 :
579 0 : default:
580 : {
581 0 : U8_LOG_ERROR("error: unknown_format.");
582 0 : export_err = U8_ERROR_CONFIG_OUT_OF_RANGE;
583 : }
584 0 : break;
585 : }
586 :
587 0 : U8_TRACE_END_ERR(export_err);
588 0 : return export_err;
589 : }
590 :
591 0 : bool document_element_writer_can_classifier_nest_classifier( document_element_writer_t *this_,
592 : data_classifier_type_t host_type,
593 : data_classifier_type_t child_type )
594 : {
595 0 : U8_TRACE_BEGIN();
596 0 : const bool can_nest = false;
597 0 : U8_TRACE_END();
598 0 : return can_nest;
599 : }
600 :
601 0 : bool document_element_writer_can_classifier_nest_relationship( document_element_writer_t *this_,
602 : data_classifier_type_t host_type,
603 : data_relationship_type_t child_type )
604 : {
605 0 : U8_TRACE_BEGIN();
606 0 : const bool can_nest = true;
607 0 : U8_TRACE_END();
608 0 : return can_nest;
609 : }
610 :
611 0 : u8_error_t document_element_writer_start_toc ( document_element_writer_t *this_ )
612 : {
613 0 : U8_TRACE_BEGIN();
614 0 : u8_error_t export_err = U8_ERROR_NONE;
615 :
616 0 : switch ( (*this_).export_type )
617 : {
618 0 : case IO_FILE_FORMAT_HTML:
619 : {
620 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), HTML_NAV_START );
621 0 : io_xml_writer_increase_indent ( &((*this_).xml_writer) );
622 : }
623 0 : break;
624 :
625 0 : default:
626 : {
627 : /* nothing to do, only html provides a table of contents */
628 : }
629 0 : break;
630 : }
631 :
632 0 : U8_TRACE_END_ERR( export_err );
633 0 : return export_err;
634 : }
635 :
636 0 : u8_error_t document_element_writer_start_toc_sublist ( document_element_writer_t *this_ )
637 : {
638 0 : U8_TRACE_BEGIN();
639 0 : u8_error_t export_err = U8_ERROR_NONE;
640 :
641 : /* increase tree depth */
642 0 : (*this_).current_tree_depth ++;
643 :
644 0 : switch ( (*this_).export_type )
645 : {
646 0 : case IO_FILE_FORMAT_HTML:
647 : {
648 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), HTML_TOC_SUBLIST_START );
649 0 : io_xml_writer_increase_indent ( &((*this_).xml_writer) );
650 : }
651 0 : break;
652 :
653 0 : default:
654 : {
655 : /* nothing to do, only html provides a table of contents */
656 : }
657 0 : break;
658 : }
659 :
660 0 : U8_TRACE_END_ERR( export_err );
661 0 : return export_err;
662 : }
663 :
664 0 : u8_error_t document_element_writer_start_toc_entry ( document_element_writer_t *this_ )
665 : {
666 0 : U8_TRACE_BEGIN();
667 0 : u8_error_t export_err = U8_ERROR_NONE;
668 :
669 0 : switch ( (*this_).export_type )
670 : {
671 0 : case IO_FILE_FORMAT_HTML:
672 : {
673 0 : const unsigned int index_of_depth = ((*this_).current_tree_depth > HTML_DIAGRAM_MAX_DEPTH)
674 : ? (HTML_DIAGRAM_MAX_DEPTH-1)
675 0 : : ((*this_).current_tree_depth-1);
676 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), HTML_TOC_SUBLIST_ENTRY_START[index_of_depth] );
677 0 : io_xml_writer_increase_indent ( &((*this_).xml_writer) );
678 : }
679 0 : break;
680 :
681 0 : default:
682 : {
683 : /* nothing to do, only html provides a table of contents */
684 : }
685 0 : break;
686 : }
687 :
688 0 : U8_TRACE_END_ERR( export_err );
689 0 : return export_err;
690 : }
691 :
692 0 : u8_error_t document_element_writer_write_toc_entry ( document_element_writer_t *this_, const data_diagram_t *diag_ptr )
693 : {
694 0 : U8_TRACE_BEGIN();
695 0 : assert ( NULL != diag_ptr );
696 0 : u8_error_t export_err = U8_ERROR_NONE;
697 :
698 0 : switch ( (*this_).export_type )
699 : {
700 0 : case IO_FILE_FORMAT_HTML:
701 : {
702 0 : const char *const diag_name = data_diagram_get_name_const(diag_ptr);
703 0 : const data_id_t diag_id = data_diagram_get_data_id(diag_ptr);
704 :
705 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), HTML_TOC_SUBLIST_ENTRY_TITLE_START );
706 0 : export_err |= io_xml_writer_write_plain_id ( &((*this_).xml_writer), diag_id );
707 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), HTML_TOC_SUBLIST_ENTRY_TITLE_MIDDLE );
708 0 : export_err |= io_xml_writer_write_xml_enc ( &((*this_).xml_writer), diag_name );
709 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), HTML_TOC_SUBLIST_ENTRY_TITLE_END );
710 : }
711 0 : break;
712 :
713 :
714 0 : default:
715 : {
716 : /* nothing to do, only html provides a table of contents */
717 : }
718 0 : break;
719 : }
720 :
721 0 : U8_TRACE_END_ERR( export_err );
722 0 : return export_err;
723 : }
724 :
725 0 : u8_error_t document_element_writer_end_toc_entry ( document_element_writer_t *this_ )
726 : {
727 0 : U8_TRACE_BEGIN();
728 0 : u8_error_t export_err = U8_ERROR_NONE;
729 :
730 0 : switch ( (*this_).export_type )
731 : {
732 0 : case IO_FILE_FORMAT_HTML:
733 : {
734 0 : io_xml_writer_decrease_indent ( &((*this_).xml_writer) );
735 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), HTML_TOC_SUBLIST_ENTRY_END );
736 : }
737 0 : break;
738 :
739 0 : default:
740 : {
741 : /* nothing to do, only html provides a table of contents */
742 : }
743 0 : break;
744 : }
745 :
746 0 : U8_TRACE_END_ERR( export_err );
747 0 : return export_err;
748 : }
749 :
750 0 : u8_error_t document_element_writer_end_toc_sublist ( document_element_writer_t *this_ )
751 : {
752 0 : U8_TRACE_BEGIN();
753 0 : u8_error_t export_err = U8_ERROR_NONE;
754 :
755 0 : switch ( (*this_).export_type )
756 : {
757 0 : case IO_FILE_FORMAT_HTML:
758 : {
759 0 : io_xml_writer_decrease_indent ( &((*this_).xml_writer) );
760 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), HTML_TOC_SUBLIST_END );
761 : }
762 0 : break;
763 :
764 0 : default:
765 : {
766 : /* nothing to do, only html provides a table of contents */
767 : }
768 0 : break;
769 : }
770 :
771 : /* decrease tree depth */
772 0 : (*this_).current_tree_depth --;
773 :
774 0 : U8_TRACE_END_ERR( export_err );
775 0 : return export_err;
776 : }
777 :
778 0 : u8_error_t document_element_writer_end_toc ( document_element_writer_t *this_ )
779 : {
780 0 : U8_TRACE_BEGIN();
781 0 : u8_error_t export_err = U8_ERROR_NONE;
782 :
783 0 : switch ( (*this_).export_type )
784 : {
785 0 : case IO_FILE_FORMAT_HTML:
786 : {
787 0 : io_xml_writer_decrease_indent ( &((*this_).xml_writer) );
788 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), HTML_NAV_END );
789 : }
790 0 : break;
791 :
792 0 : default:
793 : {
794 : /* nothing to do, only html provides a table of contents */
795 : }
796 0 : break;
797 : }
798 :
799 0 : U8_TRACE_END_ERR( export_err );
800 0 : return export_err;
801 : }
802 :
803 0 : u8_error_t document_element_writer_start_classifier( document_element_writer_t *this_,
804 : data_classifier_type_t host_type,
805 : const data_classifier_t *classifier_ptr )
806 : {
807 0 : U8_TRACE_BEGIN();
808 0 : assert ( NULL != classifier_ptr );
809 0 : u8_error_t export_err = U8_ERROR_NONE;
810 :
811 0 : switch ( (*this_).export_type )
812 : {
813 0 : case IO_FILE_FORMAT_DOCBOOK:
814 : {
815 : }
816 0 : break;
817 :
818 0 : case IO_FILE_FORMAT_HTML:
819 : {
820 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), HTML_CLAS_START );
821 0 : io_xml_writer_increase_indent ( &((*this_).xml_writer) );
822 : }
823 0 : break;
824 :
825 0 : case IO_FILE_FORMAT_TXT:
826 : {
827 0 : export_err |= io_txt_writer_write_plain ( &((*this_).txt_writer), TXT_NEWLINE );
828 : }
829 0 : break;
830 :
831 0 : default:
832 : {
833 0 : U8_LOG_ERROR("error: unknown_format.");
834 0 : export_err = U8_ERROR_CONFIG_OUT_OF_RANGE;
835 : }
836 0 : break;
837 : }
838 :
839 0 : U8_TRACE_END_ERR( export_err );
840 0 : return export_err;
841 : }
842 :
843 0 : u8_error_t document_element_writer_assemble_classifier( document_element_writer_t *this_,
844 : data_classifier_type_t host_type,
845 : const data_classifier_t *classifier_ptr )
846 : {
847 0 : U8_TRACE_BEGIN();
848 0 : assert ( NULL != classifier_ptr );
849 0 : u8_error_t export_err = U8_ERROR_NONE;
850 :
851 0 : const char *const classifier_name = data_classifier_get_name_const(classifier_ptr);
852 0 : const char *const classifier_descr = data_classifier_get_description_const(classifier_ptr);
853 0 : const size_t classifier_descr_len = utf8string_get_length(classifier_descr);
854 0 : const data_id_t classifier_id = data_classifier_get_data_id(classifier_ptr);
855 : const char *const classifier_type_name
856 0 : = json_type_name_map_get_classifier_type( &((*this_).type_map),
857 : data_classifier_get_main_type( classifier_ptr )
858 : );
859 0 : const char *const classifier_stereotype = data_classifier_get_stereotype_const( classifier_ptr );
860 :
861 0 : switch ( (*this_).export_type )
862 : {
863 0 : case IO_FILE_FORMAT_DOCBOOK:
864 : {
865 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), DOCBOOK_ELEMENT_START_CLASSIFIER );
866 0 : io_xml_writer_increase_indent ( &((*this_).xml_writer) );
867 :
868 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), DOCBOOK_ELEMENT_NAME_START );
869 0 : export_err |= io_xml_writer_write_xml_enc ( &((*this_).xml_writer), classifier_name );
870 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), DOCBOOK_ELEMENT_NAME_END );
871 :
872 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), DOCBOOK_ELEMENT_ATTRIBUTES_START );
873 0 : io_xml_writer_increase_indent ( &((*this_).xml_writer) );
874 0 : if ( 0 != utf8string_get_length( classifier_stereotype ) )
875 : {
876 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), DOCBOOK_ELEMENT_STEREO_START );
877 0 : export_err |= io_xml_writer_write_xml_enc ( &((*this_).xml_writer), classifier_stereotype );
878 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), DOCBOOK_ELEMENT_STEREO_END );
879 : }
880 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), DOCBOOK_ELEMENT_ID_START );
881 0 : export_err |= io_xml_writer_write_plain_id( &((*this_).xml_writer), classifier_id );
882 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), DOCBOOK_ELEMENT_ID_END );
883 : /* unconditional: Every classifier shoud be contained in at least 1 diagram */
884 : {
885 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), DOCBOOK_ELEMENT_SEE_START );
886 0 : export_err |= document_link_provider_write_occurrences( &((*this_).link_provider), classifier_id );
887 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), DOCBOOK_ELEMENT_SEE_END );
888 : }
889 :
890 0 : io_xml_writer_decrease_indent ( &((*this_).xml_writer) );
891 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), DOCBOOK_ELEMENT_ATTRIBUTES_END );
892 :
893 0 : if ( 0 != classifier_descr_len )
894 : {
895 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), DOCBOOK_ELEMENT_DESCR_START );
896 0 : export_err |= io_md_writer_transform ( &((*this_).md_writer), classifier_descr );
897 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), DOCBOOK_ELEMENT_DESCR_END );
898 : }
899 :
900 0 : io_xml_writer_decrease_indent ( &((*this_).xml_writer) );
901 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), DOCBOOK_ELEMENT_END );
902 : }
903 0 : break;
904 :
905 0 : case IO_FILE_FORMAT_HTML:
906 : {
907 : /* unconditional: Every classifier shoud be contained in at least 1 diagram */
908 : {
909 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), HTML_CLAS_SEE_START );
910 0 : export_err |= document_link_provider_write_occurrences( &((*this_).link_provider), classifier_id );
911 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), HTML_CLAS_SEE_END );
912 : }
913 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), HTML_CLAS_HEAD_START );
914 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), HTML_CLAS_NAME_START );
915 0 : export_err |= io_xml_writer_write_xml_enc ( &((*this_).xml_writer), classifier_name );
916 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), HTML_CLAS_NAME_END );
917 0 : if ( 0 != utf8string_get_length( classifier_stereotype ) )
918 : {
919 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), HTML_CLAS_STEREO_START );
920 0 : export_err |= io_xml_writer_write_xml_enc ( &((*this_).xml_writer), classifier_stereotype );
921 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), HTML_CLAS_STEREO_END );
922 : }
923 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), HTML_CLAS_TYPE_START );
924 0 : export_err |= io_xml_writer_write_xml_enc( &((*this_).xml_writer), classifier_type_name );
925 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), HTML_CLAS_TYPE_END );
926 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), HTML_CLAS_ID_START );
927 0 : export_err |= io_xml_writer_write_plain_id( &((*this_).xml_writer), classifier_id );
928 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), HTML_CLAS_ID_END );
929 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), HTML_CLAS_HEAD_END );
930 :
931 0 : if ( 0 != classifier_descr_len )
932 : {
933 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), HTML_CLAS_DESCR_START );
934 0 : export_err |= io_md_writer_transform ( &((*this_).md_writer), classifier_descr );
935 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), HTML_CLAS_DESCR_END );
936 : }
937 : }
938 0 : break;
939 :
940 0 : case IO_FILE_FORMAT_TXT:
941 : {
942 0 : export_err |= io_txt_writer_write_plain ( &((*this_).txt_writer), TXT_NEWLINE );
943 0 : export_err |= io_txt_writer_write_plain ( &((*this_).txt_writer), classifier_name );
944 0 : const utf8stringview_t classifier_name_view = UTF8STRINGVIEW_STR( classifier_name );
945 0 : const size_t clas_codepoint = utf8stringview_count_codepoints( &classifier_name_view );
946 0 : export_err |= io_txt_writer_write_aligned_id( &((*this_).txt_writer),
947 0 : TXT_ID_ALIGN_COLUMN - clas_codepoint,
948 : classifier_id
949 : );
950 0 : export_err |= io_txt_writer_write_plain ( &((*this_).txt_writer), TXT_NEWLINE );
951 0 : export_err |= io_txt_writer_fill ( &((*this_).txt_writer), TXT_CLAS_UNDERLINE, clas_codepoint );
952 0 : export_err |= io_txt_writer_write_plain ( &((*this_).txt_writer), TXT_NEWLINE );
953 0 : export_err |= io_txt_writer_write_indent_multiline_string( &((*this_).txt_writer),
954 : TXT_NO_INDENT,
955 : classifier_descr
956 : );
957 0 : export_err |= io_txt_writer_write_plain ( &((*this_).txt_writer), TXT_NEWLINE );
958 : }
959 0 : break;
960 :
961 0 : default:
962 : {
963 0 : U8_LOG_ERROR("error: unknown_format.");
964 0 : export_err = U8_ERROR_CONFIG_OUT_OF_RANGE;
965 : }
966 0 : break;
967 : }
968 :
969 : /* update export statistics */
970 0 : data_stat_inc_count ( (*this_).export_stat, DATA_STAT_TABLE_CLASSIFIER, DATA_STAT_SERIES_EXPORTED );
971 :
972 0 : U8_TRACE_END_ERR( export_err );
973 0 : return export_err;
974 : }
975 :
976 0 : u8_error_t document_element_writer_end_classifier( document_element_writer_t *this_,
977 : data_classifier_type_t host_type,
978 : const data_classifier_t *classifier_ptr )
979 : {
980 0 : U8_TRACE_BEGIN();
981 0 : assert ( NULL != classifier_ptr );
982 0 : u8_error_t export_err = U8_ERROR_NONE;
983 :
984 0 : switch ( (*this_).export_type )
985 : {
986 0 : case IO_FILE_FORMAT_DOCBOOK:
987 : {
988 : }
989 0 : break;
990 :
991 0 : case IO_FILE_FORMAT_HTML:
992 : {
993 0 : io_xml_writer_decrease_indent ( &((*this_).xml_writer) );
994 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), HTML_CLAS_END );
995 : }
996 0 : break;
997 :
998 0 : case IO_FILE_FORMAT_TXT:
999 : {
1000 : /* no end classifier tags */
1001 : }
1002 0 : break;
1003 :
1004 0 : default:
1005 : {
1006 0 : U8_LOG_ERROR("error: unknown_format.");
1007 0 : export_err = U8_ERROR_CONFIG_OUT_OF_RANGE;
1008 : }
1009 0 : break;
1010 : }
1011 :
1012 0 : U8_TRACE_END_ERR( export_err );
1013 0 : return export_err;
1014 : }
1015 :
1016 0 : u8_error_t document_element_writer_start_feature( document_element_writer_t *this_,
1017 : data_classifier_type_t parent_type,
1018 : const data_feature_t *feature_ptr)
1019 : {
1020 0 : U8_TRACE_BEGIN();
1021 0 : assert( feature_ptr != NULL );
1022 0 : u8_error_t export_err = U8_ERROR_NONE;
1023 :
1024 0 : switch ( (*this_).export_type )
1025 : {
1026 0 : case IO_FILE_FORMAT_HTML:
1027 : {
1028 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), HTML_FEAT_START );
1029 0 : io_xml_writer_increase_indent ( &((*this_).xml_writer) );
1030 : }
1031 0 : break;
1032 :
1033 0 : default:
1034 : {
1035 : }
1036 0 : break;
1037 : }
1038 :
1039 0 : U8_TRACE_END_ERR(export_err);
1040 0 : return export_err;
1041 : }
1042 :
1043 0 : u8_error_t document_element_writer_assemble_feature( document_element_writer_t *this_,
1044 : const data_classifier_t *parent,
1045 : const data_feature_t *feature_ptr )
1046 : {
1047 0 : U8_TRACE_BEGIN();
1048 0 : assert ( NULL != feature_ptr );
1049 0 : assert( parent != NULL );
1050 0 : u8_error_t export_err = U8_ERROR_NONE;
1051 :
1052 0 : const char *const feature_key = data_feature_get_key_const( feature_ptr );
1053 0 : const char *const feature_value = data_feature_get_value_const( feature_ptr );
1054 0 : const size_t feature_value_len = utf8string_get_length(feature_value);
1055 0 : const char *const feature_descr = data_feature_get_description_const( feature_ptr );
1056 0 : const size_t feature_descr_len = utf8string_get_length(feature_descr);
1057 0 : const data_id_t feature_id = data_feature_get_data_id( feature_ptr );
1058 0 : const data_feature_type_t feature_type = data_feature_get_main_type( feature_ptr );
1059 : const char *const feature_type_name
1060 0 : = json_type_name_map_get_feature_type( &((*this_).type_map), feature_type );
1061 0 : const bool has_stereotype = data_rules_feature_value_is_stereotype( &((*this_).data_rules), feature_type );
1062 :
1063 0 : switch ( (*this_).export_type )
1064 : {
1065 0 : case IO_FILE_FORMAT_DOCBOOK:
1066 : {
1067 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), DOCBOOK_ELEMENT_START_FEATURE );
1068 0 : io_xml_writer_increase_indent ( &((*this_).xml_writer) );
1069 :
1070 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), DOCBOOK_ELEMENT_NAME_START );
1071 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), DOCBOOK_INDENT );
1072 0 : export_err |= io_xml_writer_write_xml_enc ( &((*this_).xml_writer), feature_key );
1073 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), DOCBOOK_ELEMENT_NAME_END );
1074 :
1075 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), DOCBOOK_ELEMENT_ATTRIBUTES_START );
1076 0 : io_xml_writer_increase_indent ( &((*this_).xml_writer) );
1077 0 : if ( 0 != feature_value_len )
1078 : {
1079 0 : if ( has_stereotype )
1080 : {
1081 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), DOCBOOK_ELEMENT_STEREO_START );
1082 0 : export_err |= io_xml_writer_write_xml_enc ( &((*this_).xml_writer), feature_value );
1083 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), DOCBOOK_ELEMENT_STEREO_END );
1084 : }
1085 : else
1086 : {
1087 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), TXT_COLON_SPACE );
1088 0 : export_err |= io_xml_writer_write_xml_enc ( &((*this_).xml_writer), feature_value );
1089 : }
1090 : }
1091 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), DOCBOOK_ELEMENT_ID_START );
1092 0 : export_err |= io_xml_writer_write_plain_id( &((*this_).xml_writer), feature_id );
1093 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), DOCBOOK_ELEMENT_ID_END );
1094 0 : io_xml_writer_decrease_indent ( &((*this_).xml_writer) );
1095 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), DOCBOOK_ELEMENT_ATTRIBUTES_END );
1096 :
1097 0 : if ( 0 != feature_descr_len )
1098 : {
1099 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), DOCBOOK_ELEMENT_DESCR_START );
1100 0 : export_err |= io_md_writer_transform ( &((*this_).md_writer), feature_descr );
1101 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), DOCBOOK_ELEMENT_DESCR_END );
1102 : }
1103 :
1104 0 : io_xml_writer_decrease_indent ( &((*this_).xml_writer) );
1105 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), DOCBOOK_ELEMENT_END );
1106 : }
1107 0 : break;
1108 :
1109 0 : case IO_FILE_FORMAT_HTML:
1110 : {
1111 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), HTML_FEAT_HEAD_START );
1112 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), HTML_FEAT_NAME_START );
1113 0 : export_err |= io_xml_writer_write_xml_enc ( &((*this_).xml_writer), feature_key );
1114 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), HTML_FEAT_NAME_END );
1115 0 : if ( 0 != feature_value_len )
1116 : {
1117 0 : if ( has_stereotype )
1118 : {
1119 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), HTML_FEAT_STEREO_START );
1120 0 : export_err |= io_xml_writer_write_xml_enc ( &((*this_).xml_writer), feature_value );
1121 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), HTML_FEAT_STEREO_END );
1122 : }
1123 : else
1124 : {
1125 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), TXT_COLON_SPACE );
1126 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), HTML_FEAT_VALUE_START );
1127 0 : export_err |= io_xml_writer_write_xml_enc ( &((*this_).xml_writer), feature_value );
1128 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), HTML_FEAT_VALUE_END );
1129 : }
1130 : }
1131 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), HTML_FEAT_TYPE_START );
1132 0 : export_err |= io_xml_writer_write_xml_enc( &((*this_).xml_writer), feature_type_name );
1133 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), HTML_FEAT_TYPE_END );
1134 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), HTML_FEAT_ID_START );
1135 0 : export_err |= io_xml_writer_write_plain_id( &((*this_).xml_writer), feature_id );
1136 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), HTML_FEAT_ID_END );
1137 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), HTML_FEAT_HEAD_END );
1138 0 : if ( 0 != feature_descr_len )
1139 : {
1140 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), HTML_FEAT_DESCR_START );
1141 0 : export_err |= io_md_writer_transform ( &((*this_).md_writer), feature_descr );
1142 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), HTML_FEAT_DESCR_END );
1143 : }
1144 : }
1145 0 : break;
1146 :
1147 0 : case IO_FILE_FORMAT_TXT:
1148 : {
1149 0 : export_err |= io_txt_writer_write_plain ( &((*this_).txt_writer), TXT_FEAT_INDENT );
1150 0 : export_err |= io_txt_writer_write_plain ( &((*this_).txt_writer), feature_key );
1151 0 : if ( 0 != feature_value_len )
1152 : {
1153 0 : export_err |= io_txt_writer_write_plain ( &((*this_).txt_writer), TXT_COLON_SPACE );
1154 0 : export_err |= io_txt_writer_write_plain ( &((*this_).txt_writer), feature_value );
1155 : }
1156 :
1157 0 : const utf8stringview_t feature_key_view = UTF8STRINGVIEW_STR( feature_key );
1158 0 : const utf8stringview_t feature_value_view = UTF8STRINGVIEW_STR( feature_value );
1159 0 : const size_t feat_key_codepoint = utf8stringview_count_codepoints( &feature_key_view );
1160 0 : const size_t feat_value_codepoint = utf8stringview_count_codepoints( &feature_value_view );
1161 0 : int id_indent_width = TXT_ID_ALIGN_COLUMN - utf8string_get_length(TXT_FEAT_INDENT) - feat_key_codepoint
1162 0 : - ((feature_value_len==0)?0:(feat_value_codepoint+utf8string_get_length(TXT_COLON_SPACE)));
1163 0 : export_err |= io_txt_writer_write_aligned_id( &((*this_).txt_writer),
1164 : id_indent_width,
1165 : feature_id
1166 : );
1167 0 : export_err |= io_txt_writer_write_plain ( &((*this_).txt_writer), TXT_NEWLINE );
1168 0 : export_err |= io_txt_writer_write_indent_multiline_string( &((*this_).txt_writer),
1169 : TXT_CONTINUE_INDENT,
1170 : feature_descr
1171 : );
1172 : }
1173 0 : break;
1174 :
1175 0 : default:
1176 : {
1177 0 : U8_LOG_ERROR("error: unknown_format.");
1178 0 : export_err = U8_ERROR_CONFIG_OUT_OF_RANGE;
1179 : }
1180 0 : break;
1181 : }
1182 :
1183 : /* update export statistics */
1184 0 : const data_feature_type_t feat_type = data_feature_get_main_type( feature_ptr );
1185 0 : const data_stat_table_t feat_or_lifeline
1186 0 : = ( feat_type == DATA_FEATURE_TYPE_LIFELINE ) ? DATA_STAT_TABLE_LIFELINE : DATA_STAT_TABLE_FEATURE;
1187 0 : data_stat_inc_count ( (*this_).export_stat, feat_or_lifeline, DATA_STAT_SERIES_EXPORTED );
1188 :
1189 0 : U8_TRACE_END_ERR( export_err );
1190 0 : return export_err;
1191 : }
1192 :
1193 0 : u8_error_t document_element_writer_end_feature( document_element_writer_t *this_,
1194 : data_classifier_type_t parent_type,
1195 : const data_feature_t *feature_ptr)
1196 : {
1197 0 : U8_TRACE_BEGIN();
1198 0 : assert( feature_ptr != NULL );
1199 0 : u8_error_t export_err = U8_ERROR_NONE;
1200 :
1201 0 : switch ( (*this_).export_type )
1202 : {
1203 0 : case IO_FILE_FORMAT_HTML:
1204 : {
1205 0 : io_xml_writer_decrease_indent ( &((*this_).xml_writer) );
1206 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), HTML_FEAT_END );
1207 : }
1208 0 : break;
1209 :
1210 0 : default:
1211 : {
1212 : }
1213 0 : break;
1214 : }
1215 :
1216 0 : U8_TRACE_END_ERR(export_err);
1217 0 : return export_err;
1218 : }
1219 :
1220 0 : u8_error_t document_element_writer_start_relationship( document_element_writer_t *this_,
1221 : data_classifier_type_t host_type,
1222 : const data_relationship_t *relation_ptr)
1223 : {
1224 0 : U8_TRACE_BEGIN();
1225 0 : assert( relation_ptr != NULL );
1226 0 : u8_error_t export_err = U8_ERROR_NONE;
1227 :
1228 0 : switch ( (*this_).export_type )
1229 : {
1230 0 : case IO_FILE_FORMAT_HTML:
1231 : {
1232 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), HTML_REL_START );
1233 0 : io_xml_writer_increase_indent ( &((*this_).xml_writer) );
1234 : }
1235 0 : break;
1236 :
1237 0 : default:
1238 : {
1239 : }
1240 0 : break;
1241 : }
1242 :
1243 0 : U8_TRACE_END_ERR(export_err);
1244 0 : return export_err;
1245 : }
1246 :
1247 0 : u8_error_t document_element_writer_assemble_relationship( document_element_writer_t *this_,
1248 : const data_classifier_t *host,
1249 : const data_relationship_t *relation_ptr,
1250 : const data_classifier_t *from_c,
1251 : const data_feature_t *from_f,
1252 : const data_classifier_t *to_c,
1253 : const data_feature_t *to_f )
1254 : {
1255 0 : U8_TRACE_BEGIN();
1256 0 : assert ( NULL != relation_ptr );
1257 : /* NULL is allowed here: dest_classifier_ptr */
1258 0 : u8_error_t export_err = U8_ERROR_NONE;
1259 :
1260 0 : const char *const relation_name = data_relationship_get_name_const( relation_ptr );
1261 0 : const data_id_t relation_id = data_relationship_get_data_id( relation_ptr );
1262 0 : const char *const relation_descr = data_relationship_get_description_const( relation_ptr );
1263 0 : const size_t relation_descr_len = utf8string_get_length(relation_descr);
1264 0 : const data_relationship_type_t relation_type = data_relationship_get_main_type( relation_ptr );
1265 0 : const char *const dest_classifier_name
1266 : = (NULL != to_c)
1267 0 : ? data_classifier_get_name_const( to_c )
1268 0 : : "";
1269 : const char *const relation_type_name
1270 0 : = json_type_name_map_get_relationship_type( &((*this_).type_map), relation_type );
1271 0 : const char*const relation_txticon = io_txt_icon_get_relationship ( &((*this_).txt_icon), relation_type );
1272 :
1273 0 : const char *const relation_stereotype = data_relationship_get_stereotype_const( relation_ptr );
1274 :
1275 0 : switch ( (*this_).export_type )
1276 : {
1277 0 : case IO_FILE_FORMAT_DOCBOOK:
1278 : {
1279 : /* list element start */
1280 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), DOCBOOK_ELEMENT_START_RELATIONSHIP );
1281 0 : io_xml_writer_increase_indent ( &((*this_).xml_writer) );
1282 :
1283 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), DOCBOOK_ELEMENT_NAME_START );
1284 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), DOCBOOK_INDENT );
1285 0 : export_err |= io_xml_writer_write_xml_enc ( &((*this_).xml_writer), relation_name );
1286 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), DOCBOOK_ELEMENT_NAME_END );
1287 :
1288 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), DOCBOOK_ELEMENT_ATTRIBUTES_START );
1289 0 : io_xml_writer_increase_indent ( &((*this_).xml_writer) );
1290 0 : if ( 0 != utf8string_get_length( relation_stereotype ) )
1291 : {
1292 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), DOCBOOK_ELEMENT_STEREO_START );
1293 0 : export_err |= io_xml_writer_write_xml_enc ( &((*this_).xml_writer), relation_stereotype );
1294 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), DOCBOOK_ELEMENT_STEREO_END );
1295 : }
1296 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), TXT_SPACE );
1297 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), DOCBOOK_ELEMENT_TYPE_TOKEN_START );
1298 0 : export_err |= io_xml_writer_write_xml_enc ( &((*this_).xml_writer), relation_txticon );
1299 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), DOCBOOK_ELEMENT_TYPE_TOKEN_END );
1300 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), TXT_SPACE );
1301 0 : export_err |= io_xml_writer_write_xml_enc ( &((*this_).xml_writer), dest_classifier_name );
1302 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), DOCBOOK_ELEMENT_ID_START );
1303 0 : export_err |= io_xml_writer_write_plain_id( &((*this_).xml_writer), relation_id );
1304 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), DOCBOOK_ELEMENT_ID_END );
1305 0 : io_xml_writer_decrease_indent ( &((*this_).xml_writer) );
1306 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), DOCBOOK_ELEMENT_ATTRIBUTES_END );
1307 :
1308 0 : if ( 0 != relation_descr_len )
1309 : {
1310 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), DOCBOOK_ELEMENT_DESCR_START );
1311 0 : export_err |= io_md_writer_transform ( &((*this_).md_writer), relation_descr );
1312 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), DOCBOOK_ELEMENT_DESCR_END );
1313 : }
1314 :
1315 : /* list element end */
1316 0 : io_xml_writer_decrease_indent ( &((*this_).xml_writer) );
1317 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), DOCBOOK_ELEMENT_END );
1318 : }
1319 0 : break;
1320 :
1321 0 : case IO_FILE_FORMAT_HTML:
1322 : {
1323 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), HTML_REL_HEAD_START );
1324 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), HTML_REL_NAME_START );
1325 0 : export_err |= io_xml_writer_write_xml_enc ( &((*this_).xml_writer), relation_name );
1326 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), HTML_REL_NAME_END );
1327 0 : if ( 0 != utf8string_get_length( relation_stereotype ) )
1328 : {
1329 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), HTML_REL_STEREO_START );
1330 0 : export_err |= io_xml_writer_write_xml_enc ( &((*this_).xml_writer), relation_stereotype );
1331 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), HTML_REL_STEREO_END );
1332 : }
1333 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), TXT_SPACE );
1334 0 : export_err |= io_xml_writer_write_xml_enc ( &((*this_).xml_writer), relation_txticon );
1335 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), TXT_SPACE );
1336 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), HTML_REL_DEST_START );
1337 0 : export_err |= io_xml_writer_write_xml_enc ( &((*this_).xml_writer), dest_classifier_name );
1338 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), HTML_REL_DEST_END );
1339 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), HTML_REL_TYPE_START );
1340 0 : export_err |= io_xml_writer_write_xml_enc( &((*this_).xml_writer), relation_type_name );
1341 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), HTML_REL_TYPE_END );
1342 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), HTML_REL_ID_START );
1343 0 : export_err |= io_xml_writer_write_plain_id( &((*this_).xml_writer), relation_id );
1344 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), HTML_REL_ID_END );
1345 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), HTML_REL_HEAD_END );
1346 0 : if ( 0 != relation_descr_len )
1347 : {
1348 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), HTML_REL_DESCR_START );
1349 0 : export_err |= io_md_writer_transform ( &((*this_).md_writer), relation_descr );
1350 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), HTML_REL_DESCR_END );
1351 : }
1352 : }
1353 0 : break;
1354 :
1355 0 : case IO_FILE_FORMAT_TXT:
1356 : {
1357 0 : export_err |= io_txt_writer_write_plain ( &((*this_).txt_writer), TXT_REL_INDENT );
1358 :
1359 0 : size_t relation_name_len = utf8string_get_length(relation_name);
1360 : /* print arrow */
1361 0 : if ( relation_name_len != 0 )
1362 : {
1363 0 : export_err |= io_txt_writer_write_plain ( &((*this_).txt_writer), relation_name );
1364 0 : export_err |= io_txt_writer_write_plain ( &((*this_).txt_writer), TXT_SPACE );
1365 : }
1366 0 : export_err |= io_txt_writer_write_plain ( &((*this_).txt_writer), TXT_CODE_START );
1367 0 : export_err |= io_txt_writer_write_plain ( &((*this_).txt_writer), relation_txticon );
1368 0 : export_err |= io_txt_writer_write_plain ( &((*this_).txt_writer), TXT_CODE_END );
1369 0 : export_err |= io_txt_writer_write_plain ( &((*this_).txt_writer), TXT_SPACE );
1370 :
1371 0 : export_err |= io_txt_writer_write_plain ( &((*this_).txt_writer), dest_classifier_name );
1372 :
1373 : /* print id */
1374 0 : const utf8stringview_t relation_name_view = UTF8STRINGVIEW_STR( relation_name );
1375 0 : const utf8stringview_t relation_txticon_view = UTF8STRINGVIEW_STR( relation_txticon );
1376 0 : const utf8stringview_t dest_classifier_name_view = UTF8STRINGVIEW_STR( dest_classifier_name );
1377 0 : const size_t rel_name_codepoint = utf8stringview_count_codepoints( &relation_name_view);
1378 0 : const size_t rel_icon_codepoint = utf8stringview_count_codepoints( &relation_txticon_view );
1379 0 : const size_t rel_dest_codepoint = utf8stringview_count_codepoints( &dest_classifier_name_view );
1380 0 : int id_indent_width
1381 : = TXT_ID_ALIGN_COLUMN
1382 0 : - utf8string_get_length(TXT_REL_INDENT)
1383 0 : - ((relation_name_len==0)?0:(rel_name_codepoint+utf8string_get_length(TXT_SPACE)))
1384 0 : - utf8string_get_length(TXT_CODE_START)
1385 0 : - rel_icon_codepoint
1386 0 : - utf8string_get_length(TXT_CODE_END)
1387 0 : - utf8string_get_length(TXT_SPACE)
1388 0 : - rel_dest_codepoint;
1389 0 : export_err |= io_txt_writer_write_aligned_id( &((*this_).txt_writer),
1390 : id_indent_width,
1391 : relation_id
1392 : );
1393 :
1394 0 : export_err |= io_txt_writer_write_plain ( &((*this_).txt_writer), TXT_NEWLINE );
1395 0 : export_err |= io_txt_writer_write_indent_multiline_string( &((*this_).txt_writer),
1396 : TXT_CONTINUE_INDENT,
1397 : relation_descr
1398 : );
1399 : }
1400 0 : break;
1401 :
1402 0 : default:
1403 : {
1404 0 : U8_LOG_ERROR("error: unknown_format.");
1405 0 : export_err = U8_ERROR_CONFIG_OUT_OF_RANGE;
1406 : }
1407 0 : break;
1408 : }
1409 :
1410 : /* update export statistics */
1411 0 : data_stat_inc_count ( (*this_).export_stat, DATA_STAT_TABLE_RELATIONSHIP, DATA_STAT_SERIES_EXPORTED );
1412 :
1413 0 : U8_TRACE_END_ERR( export_err );
1414 0 : return export_err;
1415 : }
1416 :
1417 0 : u8_error_t document_element_writer_end_relationship( document_element_writer_t *this_,
1418 : data_classifier_type_t host_type,
1419 : const data_relationship_t *relation_ptr)
1420 : {
1421 0 : U8_TRACE_BEGIN();
1422 0 : assert( relation_ptr != NULL );
1423 0 : u8_error_t export_err = U8_ERROR_NONE;
1424 :
1425 0 : switch ( (*this_).export_type )
1426 : {
1427 0 : case IO_FILE_FORMAT_HTML:
1428 : {
1429 0 : io_xml_writer_decrease_indent ( &((*this_).xml_writer) );
1430 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), HTML_REL_END );
1431 : }
1432 0 : break;
1433 :
1434 0 : default:
1435 : {
1436 : }
1437 0 : break;
1438 : }
1439 :
1440 0 : U8_TRACE_END_ERR(export_err);
1441 0 : return export_err;
1442 : }
1443 :
1444 0 : u8_error_t document_element_writer_start_diagram( document_element_writer_t *this_, const data_diagram_t *diag_ptr )
1445 : {
1446 0 : U8_TRACE_BEGIN();
1447 0 : assert ( NULL != diag_ptr );
1448 0 : u8_error_t export_err = U8_ERROR_NONE;
1449 :
1450 0 : const data_id_t diag_id = data_diagram_get_data_id(diag_ptr);
1451 0 : const char *const diag_name = data_diagram_get_name_const( diag_ptr );
1452 :
1453 : /* increase tree depth */
1454 0 : (*this_).current_tree_depth ++;
1455 :
1456 0 : switch ( (*this_).export_type )
1457 : {
1458 0 : case IO_FILE_FORMAT_DOCBOOK:
1459 : {
1460 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), ((*this_).current_tree_depth==1) ? DOCBOOK_TOP_DIAGRAM_START : DOCBOOK_DIAGRAM_START );
1461 0 : export_err |= io_xml_writer_write_plain_id ( &((*this_).xml_writer), diag_id );
1462 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), ((*this_).current_tree_depth==1) ? DOCBOOK_TOP_DIAGRAM_MIDDLE : DOCBOOK_DIAGRAM_MIDDLE );
1463 0 : io_xml_writer_increase_indent ( &((*this_).xml_writer) );
1464 : }
1465 0 : break;
1466 :
1467 0 : case IO_FILE_FORMAT_HTML:
1468 : {
1469 0 : const unsigned int index_of_depth = ((*this_).current_tree_depth > HTML_DIAGRAM_MAX_DEPTH)
1470 : ? (HTML_DIAGRAM_MAX_DEPTH-1)
1471 0 : : ((*this_).current_tree_depth-1);
1472 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), HTML_DIAGRAM_TITLE_START[index_of_depth] );
1473 0 : export_err |= io_xml_writer_write_plain_id( &((*this_).xml_writer), diag_id );
1474 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), HTML_DIAGRAM_TITLE_MIDDLE );
1475 0 : export_err |= io_xml_writer_write_xml_enc ( &((*this_).xml_writer), diag_name );
1476 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), HTML_DIAGRAM_TITLE_END[index_of_depth] );
1477 : }
1478 0 : break;
1479 :
1480 0 : case IO_FILE_FORMAT_TXT:
1481 : {
1482 : /* no start diagram tags */
1483 : }
1484 0 : break;
1485 :
1486 0 : default:
1487 : {
1488 0 : U8_LOG_ERROR("error: unknown_format.");
1489 0 : export_err = U8_ERROR_CONFIG_OUT_OF_RANGE;
1490 : }
1491 0 : break;
1492 : }
1493 0 : if ( export_err != 0 )
1494 : {
1495 0 : U8_LOG_ERROR( "not all bytes could be written" );
1496 : }
1497 :
1498 : /* inform the link provider on current diagram id: */
1499 0 : document_link_provider_set_current_diagram( &((*this_).link_provider), &diag_id );
1500 :
1501 0 : U8_TRACE_END_ERR( export_err );
1502 0 : return export_err;
1503 : }
1504 :
1505 0 : u8_error_t document_element_writer_assemble_diagram( document_element_writer_t *this_,
1506 : const data_diagram_t *parent,
1507 : const data_diagram_t *diag_ptr,
1508 : const char *diagram_file_base_name )
1509 : {
1510 0 : U8_TRACE_BEGIN();
1511 : /* parent may be NULL */
1512 0 : assert ( NULL != diag_ptr );
1513 0 : assert ( NULL != diagram_file_base_name );
1514 0 : u8_error_t export_err = U8_ERROR_NONE;
1515 :
1516 0 : const char *const diag_name = data_diagram_get_name_const( diag_ptr );
1517 0 : const char *const diag_description = data_diagram_get_description_const( diag_ptr );
1518 0 : const data_id_t diag_id = data_diagram_get_data_id(diag_ptr);
1519 : const char *const diag_type_name
1520 0 : = json_type_name_map_get_diagram_type( &((*this_).type_map),
1521 : data_diagram_get_diagram_type( diag_ptr )
1522 : );
1523 0 : const char *const diag_stereotype = data_diagram_get_stereotype_const( diag_ptr );
1524 :
1525 0 : switch ( (*this_).export_type )
1526 : {
1527 0 : case IO_FILE_FORMAT_DOCBOOK:
1528 : {
1529 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), DOCBOOK_DIAGRAM_TITLE_START );
1530 0 : export_err |= io_xml_writer_write_xml_enc ( &((*this_).xml_writer), diag_name );
1531 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), DOCBOOK_DIAGRAM_TITLE_END );
1532 :
1533 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), DOCBOOK_CONTENT_START );
1534 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), DOCBOOK_ELEMENT_LIST_START );
1535 0 : io_xml_writer_increase_indent ( &((*this_).xml_writer) );
1536 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), DOCBOOK_ELEMENT_START_DIAGRAM );
1537 0 : io_xml_writer_increase_indent ( &((*this_).xml_writer) );
1538 :
1539 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), DOCBOOK_ELEMENT_NAME_START );
1540 0 : export_err |= io_xml_writer_write_xml_enc ( &((*this_).xml_writer), diag_name );
1541 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), DOCBOOK_ELEMENT_NAME_END );
1542 :
1543 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), DOCBOOK_ELEMENT_ATTRIBUTES_START );
1544 0 : io_xml_writer_increase_indent ( &((*this_).xml_writer) );
1545 0 : if ( 0 != utf8string_get_length( diag_stereotype ) )
1546 : {
1547 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), DOCBOOK_ELEMENT_STEREO_START );
1548 0 : export_err |= io_xml_writer_write_xml_enc ( &((*this_).xml_writer), diag_stereotype );
1549 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), DOCBOOK_ELEMENT_STEREO_END );
1550 : }
1551 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), DOCBOOK_ELEMENT_ID_START );
1552 0 : export_err |= io_xml_writer_write_plain_id( &((*this_).xml_writer), diag_id );
1553 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), DOCBOOK_ELEMENT_ID_END );
1554 0 : io_xml_writer_decrease_indent ( &((*this_).xml_writer) );
1555 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), DOCBOOK_ELEMENT_ATTRIBUTES_END );
1556 :
1557 0 : io_xml_writer_decrease_indent ( &((*this_).xml_writer) );
1558 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), DOCBOOK_ELEMENT_END );
1559 0 : io_xml_writer_decrease_indent ( &((*this_).xml_writer) );
1560 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), DOCBOOK_ELEMENT_LIST_END );
1561 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), DOCBOOK_CONTENT_END );
1562 :
1563 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), DOCBOOK_DESCRIPTION_START );
1564 0 : export_err |= io_md_writer_transform ( &((*this_).md_writer), diag_description );
1565 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), DOCBOOK_DESCRIPTION_END );
1566 :
1567 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), DOCBOOK_DIAGRAM_IMG_START );
1568 0 : export_err |= io_xml_writer_write_xml_enc ( &((*this_).xml_writer), diagram_file_base_name );
1569 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), DOCBOOK_DIAGRAM_IMG_MIDDLE );
1570 0 : export_err |= io_xml_writer_write_xml_enc ( &((*this_).xml_writer), diagram_file_base_name );
1571 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), DOCBOOK_DIAGRAM_IMG_END );
1572 :
1573 : /* start a para and a varlist */
1574 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), DOCBOOK_CONTENT_START );
1575 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), DOCBOOK_ELEMENT_LIST_START );
1576 0 : io_xml_writer_increase_indent ( &((*this_).xml_writer) );
1577 : }
1578 0 : break;
1579 :
1580 0 : case IO_FILE_FORMAT_HTML:
1581 : {
1582 : /* diagram start */
1583 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), HTML_DIAG_START );
1584 0 : io_xml_writer_increase_indent ( &((*this_).xml_writer) );
1585 :
1586 : /* diagram contents */
1587 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), HTML_DIAG_HEAD_START );
1588 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), HTML_DIAG_NAME_START );
1589 0 : export_err |= io_xml_writer_write_xml_enc ( &((*this_).xml_writer), diag_name );
1590 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), HTML_DIAG_NAME_END );
1591 0 : if ( 0 != utf8string_get_length( diag_stereotype ) )
1592 : {
1593 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), HTML_DIAG_STEREO_START );
1594 0 : export_err |= io_xml_writer_write_xml_enc ( &((*this_).xml_writer), diag_stereotype );
1595 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), HTML_DIAG_STEREO_END );
1596 : }
1597 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), HTML_DIAG_TYPE_START );
1598 0 : export_err |= io_xml_writer_write_xml_enc( &((*this_).xml_writer), diag_type_name );
1599 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), HTML_DIAG_TYPE_END );
1600 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), HTML_DIAG_ID_START );
1601 0 : export_err |= io_xml_writer_write_plain_id( &((*this_).xml_writer), diag_id );
1602 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), HTML_DIAG_ID_END );
1603 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), HTML_DIAG_HEAD_END );
1604 0 : if ( 0 != utf8string_get_length( diag_description ) )
1605 : {
1606 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), HTML_DIAG_DESCR_START );
1607 0 : export_err |= io_md_writer_transform ( &((*this_).md_writer), diag_description );
1608 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), HTML_DIAG_DESCR_END );
1609 : }
1610 :
1611 : /* diagram end happens here to avoid recursion to child diagrams before the end */
1612 0 : io_xml_writer_decrease_indent ( &((*this_).xml_writer) );
1613 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), HTML_DIAG_END );
1614 :
1615 : /* show the diagram-picture */
1616 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), HTML_DIAGRAM_IMG_START );
1617 0 : export_err |= io_xml_writer_write_xml_enc ( &((*this_).xml_writer), diagram_file_base_name );
1618 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), HTML_DIAGRAM_IMG_END );
1619 : }
1620 0 : break;
1621 :
1622 0 : case IO_FILE_FORMAT_TXT:
1623 : {
1624 0 : export_err |= io_txt_writer_write_plain ( &((*this_).txt_writer), diag_name );
1625 0 : const utf8stringview_t diag_name_view = UTF8STRINGVIEW_STR( diag_name );
1626 0 : const size_t diag_name_codepoint = utf8stringview_count_codepoints( &diag_name_view );
1627 0 : export_err |= io_txt_writer_write_aligned_id( &((*this_).txt_writer),
1628 0 : TXT_ID_ALIGN_COLUMN - diag_name_codepoint,
1629 : diag_id
1630 : );
1631 0 : export_err |= io_txt_writer_write_plain ( &((*this_).txt_writer), TXT_NEWLINE );
1632 0 : export_err |= io_txt_writer_fill ( &((*this_).txt_writer), TXT_DIAG_UNDERLINE, diag_name_codepoint );
1633 0 : export_err |= io_txt_writer_write_plain ( &((*this_).txt_writer), TXT_NEWLINE );
1634 0 : export_err |= io_txt_writer_write_indent_multiline_string( &((*this_).txt_writer),
1635 : TXT_NO_INDENT,
1636 : diag_description
1637 : );
1638 : }
1639 0 : break;
1640 :
1641 0 : default:
1642 : {
1643 0 : U8_LOG_ERROR("error: unknown_format.");
1644 0 : export_err = U8_ERROR_CONFIG_OUT_OF_RANGE;
1645 : }
1646 0 : break;
1647 : }
1648 :
1649 : /* update export statistics */
1650 0 : data_stat_inc_count ( (*this_).export_stat, DATA_STAT_TABLE_DIAGRAM, DATA_STAT_SERIES_EXPORTED );
1651 :
1652 0 : U8_TRACE_END_ERR( export_err );
1653 0 : return export_err;
1654 : }
1655 :
1656 0 : u8_error_t document_element_writer_descend_diagram( document_element_writer_t *this_, const data_diagram_t *diag_ptr )
1657 : {
1658 0 : U8_TRACE_BEGIN();
1659 0 : assert ( NULL != diag_ptr );
1660 0 : u8_error_t export_err = U8_ERROR_NONE;
1661 :
1662 0 : switch ( (*this_).export_type )
1663 : {
1664 0 : case IO_FILE_FORMAT_DOCBOOK:
1665 : {
1666 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), DOCBOOK_ELEMENT_DUMMY );
1667 :
1668 : /* end a varlist and a para */
1669 0 : io_xml_writer_decrease_indent ( &((*this_).xml_writer) );
1670 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), DOCBOOK_ELEMENT_LIST_END );
1671 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), DOCBOOK_CONTENT_END );
1672 : }
1673 0 : break;
1674 :
1675 0 : case IO_FILE_FORMAT_HTML:
1676 : {
1677 : }
1678 0 : break;
1679 :
1680 0 : case IO_FILE_FORMAT_TXT:
1681 : {
1682 : /* no end diagram tags */
1683 : }
1684 0 : break;
1685 :
1686 0 : default:
1687 : {
1688 0 : U8_LOG_ERROR("error: unknown_format.");
1689 0 : export_err = U8_ERROR_CONFIG_OUT_OF_RANGE;
1690 : }
1691 0 : break;
1692 : }
1693 :
1694 0 : U8_TRACE_END_ERR( export_err );
1695 0 : return export_err;
1696 : }
1697 :
1698 0 : u8_error_t document_element_writer_end_diagram( document_element_writer_t *this_, const data_diagram_t *diag_ptr )
1699 : {
1700 0 : U8_TRACE_BEGIN();
1701 0 : assert ( NULL != diag_ptr );
1702 0 : u8_error_t export_err = U8_ERROR_NONE;
1703 :
1704 0 : switch ( (*this_).export_type )
1705 : {
1706 0 : case IO_FILE_FORMAT_DOCBOOK:
1707 : {
1708 0 : io_xml_writer_decrease_indent ( &((*this_).xml_writer) );
1709 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), ((*this_).current_tree_depth==1) ? DOCBOOK_TOP_DIAGRAM_END : DOCBOOK_DIAGRAM_END );
1710 : }
1711 0 : break;
1712 :
1713 0 : case IO_FILE_FORMAT_HTML:
1714 : {
1715 : }
1716 0 : break;
1717 :
1718 0 : case IO_FILE_FORMAT_TXT:
1719 : {
1720 : /* no end diagram tags */
1721 : }
1722 0 : break;
1723 :
1724 0 : default:
1725 : {
1726 0 : U8_LOG_ERROR("error: unknown_format.");
1727 0 : export_err = U8_ERROR_CONFIG_OUT_OF_RANGE;
1728 : }
1729 0 : break;
1730 : }
1731 :
1732 : /* decrease tree depth */
1733 0 : (*this_).current_tree_depth --;
1734 :
1735 0 : U8_TRACE_END_ERR( export_err );
1736 0 : return export_err;
1737 : }
1738 :
1739 0 : u8_error_t document_element_writer_start_diagramelement( document_element_writer_t *this_,
1740 : const data_diagram_t *parent,
1741 : const data_diagramelement_t *diagramelement_ptr )
1742 : {
1743 0 : U8_TRACE_BEGIN();
1744 0 : assert( diagramelement_ptr != NULL );
1745 0 : assert( parent != NULL );
1746 0 : u8_error_t write_error = U8_ERROR_NONE;
1747 :
1748 0 : U8_TRACE_END_ERR(write_error);
1749 0 : return write_error;
1750 : }
1751 :
1752 0 : u8_error_t document_element_writer_assemble_diagramelement( document_element_writer_t *this_,
1753 : const data_diagram_t *parent,
1754 : const data_diagramelement_t *diagramelement_ptr,
1755 : const data_classifier_t *occurrence,
1756 : const data_feature_t *feat_occur )
1757 : {
1758 0 : U8_TRACE_BEGIN();
1759 0 : assert( diagramelement_ptr != NULL );
1760 0 : assert( parent != NULL );
1761 0 : assert( occurrence != NULL );
1762 : /* NULL is allowed here: feat_occur */
1763 0 : u8_error_t write_error = U8_ERROR_NONE;
1764 :
1765 0 : U8_TRACE_END_ERR(write_error);
1766 0 : return write_error;
1767 : }
1768 :
1769 0 : u8_error_t document_element_writer_end_diagramelement( document_element_writer_t *this_,
1770 : const data_diagram_t *parent,
1771 : const data_diagramelement_t *diagramelement_ptr )
1772 : {
1773 0 : U8_TRACE_BEGIN();
1774 0 : assert( diagramelement_ptr != NULL );
1775 0 : assert( parent != NULL );
1776 0 : u8_error_t write_error = U8_ERROR_NONE;
1777 :
1778 0 : U8_TRACE_END_ERR(write_error);
1779 0 : return write_error;
1780 : }
1781 :
1782 0 : u8_error_t document_element_writer_end_main( document_element_writer_t *this_ )
1783 : {
1784 0 : U8_TRACE_BEGIN();
1785 0 : u8_error_t export_err = U8_ERROR_NONE;
1786 :
1787 0 : switch ( (*this_).export_type )
1788 : {
1789 0 : case IO_FILE_FORMAT_DOCBOOK:
1790 : {
1791 : /* no main end */
1792 : }
1793 0 : break;
1794 :
1795 0 : case IO_FILE_FORMAT_HTML:
1796 : {
1797 0 : io_xml_writer_decrease_indent ( &((*this_).xml_writer) );
1798 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), HTML_ARTICLE_END );
1799 : }
1800 0 : break;
1801 :
1802 0 : case IO_FILE_FORMAT_TXT:
1803 : {
1804 : /* no main end */
1805 : }
1806 0 : break;
1807 :
1808 0 : default:
1809 : {
1810 0 : U8_LOG_ERROR("error: unknown_format.");
1811 0 : export_err = U8_ERROR_CONFIG_OUT_OF_RANGE;
1812 : }
1813 0 : break;
1814 : }
1815 :
1816 0 : U8_TRACE_END_ERR(export_err);
1817 0 : return export_err;
1818 : }
1819 :
1820 0 : u8_error_t document_element_writer_write_footer( document_element_writer_t *this_ )
1821 : {
1822 0 : U8_TRACE_BEGIN();
1823 0 : u8_error_t export_err = U8_ERROR_NONE;
1824 :
1825 0 : switch ( (*this_).export_type )
1826 : {
1827 0 : case IO_FILE_FORMAT_DOCBOOK:
1828 : {
1829 0 : io_xml_writer_decrease_indent ( &((*this_).xml_writer) );
1830 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), DOCBOOK_DOC_END );
1831 : }
1832 0 : break;
1833 :
1834 0 : case IO_FILE_FORMAT_HTML:
1835 : {
1836 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), HTML_FOOTER );
1837 0 : io_xml_writer_decrease_indent ( &((*this_).xml_writer) );
1838 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), HTML_BODY_END );
1839 0 : export_err |= io_xml_writer_write_plain ( &((*this_).xml_writer), HTML_DOC_END );
1840 : }
1841 0 : break;
1842 :
1843 0 : case IO_FILE_FORMAT_TXT:
1844 : {
1845 : /* no footer */
1846 : }
1847 0 : break;
1848 :
1849 0 : default:
1850 : {
1851 0 : U8_LOG_ERROR("error: unknown_format.");
1852 0 : export_err = U8_ERROR_CONFIG_OUT_OF_RANGE;
1853 : }
1854 0 : break;
1855 : }
1856 :
1857 0 : U8_TRACE_END_ERR( export_err );
1858 0 : return export_err;
1859 : }
1860 :
1861 :
1862 : /*
1863 : Copyright 2017-2025 Andreas Warnke
1864 :
1865 : Licensed under the Apache License, Version 2.0 (the "License");
1866 : you may not use this file except in compliance with the License.
1867 : You may obtain a copy of the License at
1868 :
1869 : http://www.apache.org/licenses/LICENSE-2.0
1870 :
1871 : Unless required by applicable law or agreed to in writing, software
1872 : distributed under the License is distributed on an "AS IS" BASIS,
1873 : WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1874 : See the License for the specific language governing permissions and
1875 : limitations under the License.
1876 : */
|