/[public]/psiconv/trunk/program/psiconv/gen_xhtml.c
ViewVC logotype

Diff of /psiconv/trunk/program/psiconv/gen_xhtml.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

Revision 190 Revision 270
1/* gen_html.c - Part of psiconv, a PSION 5 file formats converter 1/* gen_html.c - Part of psiconv, a PSION 5 file formats converter
2 Copyright (c) 1999-2004 Frodo Looijaard <frodol@dds.nl> 2 Copyright (c) 1999-2004 Frodo Looijaard <frodo@frodo.looijaard.name>
3 3
4 This program is free software; you can redistribute it and/or modify 4 This program is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by 5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation; either version 2 of the License, or 6 the Free Software Foundation; either version 2 of the License, or
7 (at your option) any later version. 7 (at your option) any later version.
19#include "config.h" 19#include "config.h"
20 20
21#include <psiconv/configuration.h> 21#include <psiconv/configuration.h>
22#include <psiconv/data.h> 22#include <psiconv/data.h>
23#include "general.h" 23#include "general.h"
24#include "gen.h"
24 25
25#include <string.h> 26#include <string.h>
26#include <stdlib.h> 27#include <stdlib.h>
28#include <stdio.h>
27 29
28#ifdef DMALLOC 30#ifdef DMALLOC
29#include "dmalloc.h" 31#include "dmalloc.h"
30#endif 32#endif
31 33
32#define TEMPSTR_LEN 100 34#define TEMPSTR_LEN 100
35
36static void text(const psiconv_config config,psiconv_list list,
37 psiconv_string_t data,const encoding enc);
38static void color(const psiconv_config config, psiconv_list list,
39 psiconv_color color,int may_be_transparant, const encoding enc);
40static void border(const psiconv_config config, psiconv_list list,
41 psiconv_border_kind_t border,const encoding enc);
42static void style_name(const psiconv_config config, psiconv_list list,
43 const psiconv_string_t name,const encoding enc);
44static int character_layout_equal(const psiconv_character_layout l1,
45 const psiconv_character_layout l2);
46static void character_layout_diffs(const psiconv_config config,
47 psiconv_list list,
48 const psiconv_character_layout new,
49 const psiconv_character_layout base,
50 const encoding enc);
51static void paragraph_layout_diffs(const psiconv_config config,
52 psiconv_list list,
53 const psiconv_paragraph_layout new,
54 const psiconv_paragraph_layout base,
55 const encoding enc);
56static void style(const psiconv_config config, psiconv_list list,
57 const psiconv_word_style style,
58 const psiconv_paragraph_layout base_para,
59 const psiconv_character_layout base_char,
60 const encoding enc);
61static void styles(const psiconv_config config, psiconv_list list,
62 const psiconv_word_styles_section styles_sec,const encoding enc);
63static void header(const psiconv_config config, psiconv_list list,
64 const psiconv_word_styles_section styles_sec,const encoding enc);
65static void footer(const psiconv_config config, psiconv_list list,
66 const encoding enc);
67static void characters(const psiconv_config config, psiconv_list list,
68 const psiconv_string_t textstr,
69 const psiconv_character_layout layout,
70 const psiconv_character_layout base,
71 const encoding enc);
72static void paragraphs(const psiconv_config config, psiconv_list list,
73 psiconv_text_and_layout paragraphs,
74 const psiconv_word_styles_section styles,
75 const encoding enc);
76static void paragraph(const psiconv_config config, psiconv_list list,
77 const psiconv_paragraph para,
78 const psiconv_word_styles_section styles_sec,
79 const encoding enc);
80static void gen_word(const psiconv_config config, psiconv_list list,
81 const psiconv_word_f file, const encoding enc);
82static void gen_texted(const psiconv_config config, psiconv_list list,
83 const psiconv_texted_f file, const encoding enc);
84static int gen_xhtml(const psiconv_config config, psiconv_list list,
85 const psiconv_file file, const char *dest,
86 const encoding enc);
87
88
89
90void text(const psiconv_config config,psiconv_list list,
91 psiconv_string_t data,const encoding enc)
92{
93 int i;
94 for (i = 0; i < psiconv_unicode_strlen(data); i++) {
95 if ((data[i] == 0x06) || (data[i] == 0x07) || (data[i] == 0x08))
96 output_simple_chars(config,list,"<br/>",enc);
97 else if ((data[i] == 0x0b) || (data[i] == 0x0c))
98 output_simple_chars(config,list,"-",enc);
99 else if ((data[i] == 0x0f) || (data[i] == 0x09) || (data[i] == 0x0a))
100 output_simple_chars(config,list," ",enc);
101 else if (data[i] >= 0x20)
102 output_char(config,list,data[i],enc);
103 }
104}
33 105
34void color(const psiconv_config config, psiconv_list list, 106void color(const psiconv_config config, psiconv_list list,
35 psiconv_color color,int may_be_transparant, const encoding enc) 107 psiconv_color color,int may_be_transparant, const encoding enc)
36{ 108{
37 char tempstr[TEMPSTR_LEN]; 109 char tempstr[TEMPSTR_LEN];
47 color->blue); 119 color->blue);
48 output_simple_chars(config,list,tempstr,enc); 120 output_simple_chars(config,list,tempstr,enc);
49 } 121 }
50} 122}
51 123
124void border(const psiconv_config config, psiconv_list list,
125 psiconv_border_kind_t border,const encoding enc)
126{
127 output_simple_chars(config,list,
128 border == psiconv_border_none?"none":
129 border == psiconv_border_solid?"solid":
130 border == psiconv_border_double?"double":
131 border == psiconv_border_dotted?"dotted":
132 border == psiconv_border_dashed?"dashed":
133 border == psiconv_border_dotdashed?"dashed":
134 border == psiconv_border_dotdotdashed?"dashed":"",enc);
135}
136
52void style_name(const psiconv_config config, psiconv_list list, 137void style_name(const psiconv_config config, psiconv_list list,
53 const psiconv_string_t name,const encoding enc) 138 const psiconv_string_t name,const encoding enc)
54{ 139{
55 psiconv_string_t name_copy; 140 psiconv_string_t name_copy;
56 int i; 141 int i;
69 } 154 }
70 output_string(config,list,name_copy,enc); 155 output_string(config,list,name_copy,enc);
71 free(name_copy); 156 free(name_copy);
72} 157}
73 158
159/* Check whether the same layout information would be generated */
160int character_layout_equal(const psiconv_character_layout l1,
161 const psiconv_character_layout l2)
162{
163 return (l1 && l2 &&
164 (l1->color->red == l2->color->red) &&
165 (l1->color->green == l2->color->green) &&
166 (l1->color->blue == l2->color->blue) &&
167 (l1->back_color->red == l2->back_color->red) &&
168 (l1->back_color->green == l2->back_color->green) &&
169 (l1->back_color->blue == l2->back_color->blue) &&
170 (l1->font_size == l2->font_size) &&
171 (l1->italic == l2->italic) &&
172 (l1->bold == l2->bold) &&
173 (l1->super_sub == l2->super_sub) &&
174 (l1->underline == l2->underline) &&
175 (l1->strikethrough == l2->strikethrough) &&
176 (l1->font->screenfont == l2->font->screenfont));
177}
178
74void character_layout_diffs(const psiconv_config config, psiconv_list list, 179void character_layout_diffs(const psiconv_config config, psiconv_list list,
75 const psiconv_character_layout new, 180 const psiconv_character_layout new,
76 const psiconv_character_layout base, 181 const psiconv_character_layout base,
77 const encoding enc) 182 const encoding enc)
78{ 183{
79 char tempstr[TEMPSTR_LEN]; 184 char tempstr[TEMPSTR_LEN];
80 185
186 if (!base || (new->color->red != base->color->red) ||
187 (new->color->green != base->color->green) ||
188 (new->color->blue != base->color->blue)) {
189 output_simple_chars(config,list,"color:",enc);
190 color(config,list,new->color,0,enc);
191 output_simple_chars(config,list,";",enc);
192 }
193
194 if (!base || (new->back_color->red != base->back_color->red) ||
195 (new->back_color->green != base->back_color->green) ||
196 (new->back_color->blue != base->back_color->blue)) {
197 output_simple_chars(config,list,"background-color:",enc);
198 color(config,list,new->back_color,1,enc);
199 output_simple_chars(config,list,";",enc);
200 }
201
202 if (!base || (new->font_size != base->font_size)) {
203 output_simple_chars(config,list,"font-size:",enc);
204 snprintf(tempstr,TEMPSTR_LEN,"%f",new->font_size);
205 output_simple_chars(config,list,tempstr,enc);
206 output_simple_chars(config,list,"pt;",enc);
207 }
208
81 if (!base || (new->italic != base->italic)) { 209 if (!base || (new->italic != base->italic)) {
82 output_simple_chars(config,list,"font-style:",enc); 210 output_simple_chars(config,list,"font-style:",enc);
83 output_simple_chars(config,list,new->italic?"italic":"normal",enc); 211 output_simple_chars(config,list,new->italic?"italic":"normal",enc);
212 output_simple_chars(config,list,";",enc);
213 }
214 if (!base || (new->bold != base->bold)) {
215 output_simple_chars(config,list,"font-weight:",enc);
216 output_simple_chars(config,list,new->bold?"bold":"normal",enc);
217 output_simple_chars(config,list,";",enc);
218 }
219 if (!base || (new->super_sub != base->super_sub)) {
220 output_simple_chars(config,list,"font-style:",enc);
221 output_simple_chars(config,list,
222 new->super_sub==psiconv_superscript?"super":
223 new->super_sub==psiconv_subscript?"sub":
224 "normal",enc);
84 output_simple_chars(config,list,";",enc); 225 output_simple_chars(config,list,";",enc);
85 } 226 }
86 if (!base || (new->underline != base->underline) || 227 if (!base || (new->underline != base->underline) ||
87 (new->strikethrough != base->strikethrough)) { 228 (new->strikethrough != base->strikethrough)) {
88 output_simple_chars(config,list,"text-decoration:",enc); 229 output_simple_chars(config,list,"text-decoration:",enc);
89 output_simple_chars(config,list,new->underline?"underline": 230 output_simple_chars(config,list,new->underline?"underline":
90 new->strikethrough?"line-through": 231 new->strikethrough?"line-through":
91 "none",enc); 232 "none",enc);
92 output_simple_chars(config,list,";",enc); 233 output_simple_chars(config,list,";",enc);
93 } 234 }
94 if (!base || (new->bold != base->bold)) { 235 if (!base || (new->font->screenfont != base->font->screenfont)) {
95 output_simple_chars(config,list,"font-weight:",enc);
96 output_simple_chars(config,list,new->bold?"bold":"normal",enc);
97 output_simple_chars(config,list,";",enc);
98 }
99 if (!base || (new->super_sub != base->super_sub)) {
100 output_simple_chars(config,list,"font-style:",enc); 236 output_simple_chars(config,list,"font-family:",enc);
101 output_simple_chars(config,list, 237 output_simple_chars(config,list,
102 new->super_sub==psiconv_superscript?"super": 238 new->font->screenfont == psiconv_font_serif?"serif":
103 new->super_sub==psiconv_subscript?"sub": 239 new->font->screenfont == psiconv_font_sansserif?"sans-serif":
104 "normal",enc); 240 new->font->screenfont == psiconv_font_nonprop?"monospace":
105 output_simple_chars(config,list,";",enc); 241 new->font->screenfont == psiconv_font_misc?"fantasy":"",
106 } 242 enc);
107
108 if (!base || (new->color->red != base->color->red) ||
109 (new->color->green != base->color->green) ||
110 (new->color->blue != base->color->blue)) {
111 output_simple_chars(config,list,"color:",enc);
112 color(config,list,new->color,0,enc);
113 output_simple_chars(config,list,";",enc);
114 }
115
116 if (!base || (new->back_color->red != base->back_color->red) ||
117 (new->back_color->green != base->back_color->green) ||
118 (new->back_color->blue != base->back_color->blue)) {
119 output_simple_chars(config,list,"background-color:",enc);
120 color(config,list,new->back_color,1,enc);
121 output_simple_chars(config,list,";",enc);
122 }
123
124 if (!base || (new->font_size != base->font_size)) {
125 output_simple_chars(config,list,"font-size:",enc);
126 snprintf(tempstr,TEMPSTR_LEN,"%f",new->font_size);
127 output_simple_chars(config,list,tempstr,enc);
128 output_simple_chars(config,list,"pt;",enc);
129 } 243 }
130} 244}
131 245
132void paragraph_layout_diffs(const psiconv_config config, psiconv_list list, 246void paragraph_layout_diffs(const psiconv_config config, psiconv_list list,
133 const psiconv_paragraph_layout new, 247 const psiconv_paragraph_layout new,
134 const psiconv_paragraph_layout base, 248 const psiconv_paragraph_layout base,
135 const encoding enc) 249 const encoding enc)
136{ 250{
137 char tempstr[TEMPSTR_LEN]; 251 char tempstr[TEMPSTR_LEN];
252 float pad_left_base=0.0,pad_left_new,text_indent_base=0.0,text_indent_new;
253
254 if (new->bullet->on) {
255 pad_left_new = new->indent_left < new->indent_first?
256 new->indent_left:new->indent_first;
257 text_indent_new = 0.0;
258 } else {
259 pad_left_new = new->indent_left;
260 text_indent_new = new->indent_first;
261 }
262 if (base) {
263 if (base->bullet->on) {
264 pad_left_base = base->indent_left < base->indent_first?
265 base->indent_left:base->indent_first;
266 text_indent_base = 0.0;
267 } else {
268 pad_left_base = base->indent_left;
269 text_indent_base = base->indent_first;
270 }
271 }
272
138 273
139 if (!base || (new->back_color->red != base->back_color->red) || 274 if (!base || (new->back_color->red != base->back_color->red) ||
140 (new->back_color->green != base->back_color->green) || 275 (new->back_color->green != base->back_color->green) ||
141 (new->back_color->blue != base->back_color->blue)) { 276 (new->back_color->blue != base->back_color->blue)) {
142 output_simple_chars(config,list,"background-color:",enc); 277 output_simple_chars(config,list,"background-color:",enc);
143 color(config,list,new->back_color,1,enc); 278 color(config,list,new->back_color,1,enc);
144 output_simple_chars(config,list,";",enc); 279 output_simple_chars(config,list,";",enc);
145 } 280 }
146 281
147 if (!base || (new->indent_left != base->indent_left)) { 282 if (!base || (pad_left_new != pad_left_base)) {
148 output_simple_chars(config,list,"padding-left:",enc); 283 output_simple_chars(config,list,"padding-left:",enc);
149 snprintf(tempstr,TEMPSTR_LEN,"%f",new->indent_left); 284 snprintf(tempstr,TEMPSTR_LEN,"%f",pad_left_new);
150 output_simple_chars(config,list,tempstr,enc); 285 output_simple_chars(config,list,tempstr,enc);
151 output_simple_chars(config,list,"cm;",enc); 286 output_simple_chars(config,list,"cm;",enc);
152 } 287 }
153 288
154 if (!base || (new->indent_right != base->indent_right)) { 289 if (!base || (new->indent_right != base->indent_right)) {
156 snprintf(tempstr,TEMPSTR_LEN,"%f",new->indent_right); 291 snprintf(tempstr,TEMPSTR_LEN,"%f",new->indent_right);
157 output_simple_chars(config,list,tempstr,enc); 292 output_simple_chars(config,list,tempstr,enc);
158 output_simple_chars(config,list,"cm;",enc); 293 output_simple_chars(config,list,"cm;",enc);
159 } 294 }
160 295
161 if (!base || (new->indent_left - new->indent_first != 296 if (!base || (text_indent_new != text_indent_base)) {
162 base->indent_left - base->indent_first)) {
163 output_simple_chars(config,list,"text-indent:",enc); 297 output_simple_chars(config,list,"text-indent:",enc);
164 snprintf(tempstr,TEMPSTR_LEN,"%f",new->indent_right - new->indent_first); 298 snprintf(tempstr,TEMPSTR_LEN,"%f",text_indent_new);
165 output_simple_chars(config,list,tempstr,enc); 299 output_simple_chars(config,list,tempstr,enc);
166 output_simple_chars(config,list,"cm;",enc); 300 output_simple_chars(config,list,"cm;",enc);
167 } 301 }
168 302
169 if (!base || (new->justify_hor != base ->justify_hor)) { 303 if (!base || (new->justify_hor != base ->justify_hor)) {
175 new->justify_hor==psiconv_justify_full?"justify": 309 new->justify_hor==psiconv_justify_full?"justify":
176 "",enc); 310 "",enc);
177 output_simple_chars(config,list,";",enc); 311 output_simple_chars(config,list,";",enc);
178 } 312 }
179 313
314#if 0
315 /* This gave bad output... */
180 if (!base || (new->linespacing != base->linespacing)) { 316 if (!base || (new->linespacing != base->linespacing)) {
181 output_simple_chars(config,list,"line-height:",enc); 317 output_simple_chars(config,list,"line-height:",enc);
182 snprintf(tempstr,TEMPSTR_LEN,"%f",new->linespacing); 318 snprintf(tempstr,TEMPSTR_LEN,"%f",new->linespacing);
183 output_simple_chars(config,list,tempstr,enc); 319 output_simple_chars(config,list,tempstr,enc);
184 output_simple_chars(config,list,"pt;",enc); 320 output_simple_chars(config,list,"pt;",enc);
185 } 321 }
322#endif
186 323
187 if (!base || (new->space_above != base->space_above)) { 324 if (!base || (new->space_above != base->space_above)) {
188 output_simple_chars(config,list,"padding-top:",enc); 325 output_simple_chars(config,list,"padding-top:",enc);
189 snprintf(tempstr,TEMPSTR_LEN,"%f",new->space_above); 326 snprintf(tempstr,TEMPSTR_LEN,"%f",new->space_above);
190 output_simple_chars(config,list,tempstr,enc); 327 output_simple_chars(config,list,tempstr,enc);
195 output_simple_chars(config,list,"padding-bottom:",enc); 332 output_simple_chars(config,list,"padding-bottom:",enc);
196 snprintf(tempstr,TEMPSTR_LEN,"%f",new->space_below); 333 snprintf(tempstr,TEMPSTR_LEN,"%f",new->space_below);
197 output_simple_chars(config,list,tempstr,enc); 334 output_simple_chars(config,list,tempstr,enc);
198 output_simple_chars(config,list,"pt;",enc); 335 output_simple_chars(config,list,"pt;",enc);
199 } 336 }
200 337
338 if (!base || (new->right_border->kind != base->right_border->kind)) {
339 output_simple_chars(config,list,"border-right-style:",enc);
340 border(config,list,new->right_border->kind,enc);
341 output_simple_chars(config,list,";",enc);
342 }
343 if (!base || (new->bottom_border->kind != base->bottom_border->kind)) {
344 output_simple_chars(config,list,"border-bottom-style:",enc);
345 border(config,list,new->bottom_border->kind,enc);
346 output_simple_chars(config,list,";",enc);
347 }
348 if (!base || (new->top_border->kind != base->top_border->kind)) {
349 output_simple_chars(config,list,"border-top-style:",enc);
350 border(config,list,new->top_border->kind,enc);
351 output_simple_chars(config,list,";",enc);
352 }
353 if (!base || (new->left_border->kind != base->left_border->kind)) {
354 output_simple_chars(config,list,"border-left-style:",enc);
355 border(config,list,new->left_border->kind,enc);
356 output_simple_chars(config,list,";",enc);
357 }
358
359 if (!base ||
360 ((new->right_border->kind != psiconv_border_none) &&
361 (new->right_border->thickness != base->right_border->thickness))) {
362 output_simple_chars(config,list,"border-right-width:",enc);
363 snprintf(tempstr,TEMPSTR_LEN,"%f",new->right_border->thickness);
364 output_simple_chars(config,list,tempstr,enc);
365 output_simple_chars(config,list,"pt;",enc);
366 }
367 if (!base ||
368 ((new->bottom_border->kind != psiconv_border_none) &&
369 (new->bottom_border->thickness != base->bottom_border->thickness))) {
370 output_simple_chars(config,list,"border-bottom-width:",enc);
371 snprintf(tempstr,TEMPSTR_LEN,"%f",new->bottom_border->thickness);
372 output_simple_chars(config,list,tempstr,enc);
373 output_simple_chars(config,list,"pt;",enc);
374 }
375 if (!base ||
376 ((new->top_border->kind != psiconv_border_none) &&
377 ( new->top_border->thickness != base->top_border->thickness))) {
378 output_simple_chars(config,list,"border-top-width:",enc);
379 snprintf(tempstr,TEMPSTR_LEN,"%f",new->top_border->thickness);
380 output_simple_chars(config,list,tempstr,enc);
381 output_simple_chars(config,list,"pt;",enc);
382 }
383 if (!base ||
384 ((new->left_border->kind != psiconv_border_none) &&
385 (new->left_border->thickness != base->left_border->thickness))) {
386 output_simple_chars(config,list,"border-left-width:",enc);
387 snprintf(tempstr,TEMPSTR_LEN,"%f",new->left_border->thickness);
388 output_simple_chars(config,list,tempstr,enc);
389 output_simple_chars(config,list,"pt;",enc);
390 }
391
392 if (!base ||
393 ((new->right_border->kind != psiconv_border_none) &&
394 ((new->right_border->color->red != base->right_border->color->red) ||
395 (new->right_border->color->green != base->right_border->color->green)||
396 (new->right_border->color->blue != base->right_border->color->blue)))) {
397 output_simple_chars(config,list,"border-right-color:",enc);
398 color(config,list,new->right_border->color,0,enc);
399 output_simple_chars(config,list,";",enc);
400 }
401 if (!base ||
402 ((new->top_border->kind != psiconv_border_none) &&
403 ((new->top_border->color->red != base->top_border->color->red) ||
404 (new->top_border->color->green != base->top_border->color->green) ||
405 (new->top_border->color->blue != base->top_border->color->blue)))) {
406 output_simple_chars(config,list,"border-top-color:",enc);
407 color(config,list,new->top_border->color,0,enc);
408 output_simple_chars(config,list,";",enc);
409 }
410 if (!base ||
411 ((new->bottom_border->kind != psiconv_border_none) &&
412 ((new->bottom_border->color->red != base->bottom_border->color->red) ||
413 (new->bottom_border->color->green !=base->bottom_border->color->green)||
414 (new->bottom_border->color->blue != base->bottom_border->color->blue)))){
415 output_simple_chars(config,list,"border-bottom-color:",enc);
416 color(config,list,new->bottom_border->color,0,enc);
417 output_simple_chars(config,list,";",enc);
418 }
419 if (!base ||
420 ((new->left_border->kind != psiconv_border_none) &&
421 ((new->left_border->color->red != base->left_border->color->red) ||
422 (new->left_border->color->green != base->left_border->color->green) ||
423 (new->left_border->color->blue != base->left_border->color->blue)))) {
424 output_simple_chars(config,list,"border-left-color:",enc);
425 color(config,list,new->left_border->color,0,enc);
426 output_simple_chars(config,list,";",enc);
427 }
201} 428}
202 429
203void style(const psiconv_config config, psiconv_list list, 430void style(const psiconv_config config, psiconv_list list,
204 const psiconv_word_style style, 431 const psiconv_word_style style,
205 const psiconv_paragraph_layout base_para, 432 const psiconv_paragraph_layout base_para,
206 const psiconv_character_layout base_char, 433 const psiconv_character_layout base_char,
207 const encoding enc) 434 const encoding enc)
208{ 435{
209 output_simple_chars(config,list,"p[class=\"style_",enc); 436 output_simple_chars(config,list,"*.style_",enc);
210 style_name(config,list,style->name,enc); 437 style_name(config,list,style->name,enc);
211 output_simple_chars(config,list,"\"] {",enc); 438 output_simple_chars(config,list," {",enc);
212 paragraph_layout_diffs(config,list,style->paragraph,base_para,enc); 439 paragraph_layout_diffs(config,list,style->paragraph,base_para,enc);
213 character_layout_diffs(config,list,style->character,base_char,enc); 440 character_layout_diffs(config,list,style->character,base_char,enc);
214 output_simple_chars(config,list,"}\n",enc); 441 output_simple_chars(config,list,"}\n",enc);
215} 442}
216 443
291 output_simple_chars(config,list,"</body>\n",enc); 518 output_simple_chars(config,list,"</body>\n",enc);
292 output_simple_chars(config,list,"</html>\n",enc); 519 output_simple_chars(config,list,"</html>\n",enc);
293} 520}
294 521
295void characters(const psiconv_config config, psiconv_list list, 522void characters(const psiconv_config config, psiconv_list list,
296 const psiconv_string_t text, 523 const psiconv_string_t textstr,
297 const psiconv_character_layout layout, 524 const psiconv_character_layout layout,
298 const psiconv_character_layout base, 525 const psiconv_character_layout base,
299 const encoding enc) 526 const encoding enc)
300{ 527{
301 psiconv_list templist; 528 psiconv_list templist;
313 exit(1); 540 exit(1);
314 } 541 }
315 output_simple_chars(config,list,"\">",enc); 542 output_simple_chars(config,list,"\">",enc);
316 } 543 }
317 544
318 output_string(config,list,text,enc); 545 text(config,list,textstr,enc);
319 546
320 if (psiconv_list_length(templist)) { 547 if (psiconv_list_length(templist)) {
321 output_simple_chars(config,list,"</span>",enc); 548 output_simple_chars(config,list,"</span>",enc);
322 } 549 }
323 550
327void paragraph(const psiconv_config config, psiconv_list list, 554void paragraph(const psiconv_config config, psiconv_list list,
328 const psiconv_paragraph para, 555 const psiconv_paragraph para,
329 const psiconv_word_styles_section styles_sec, 556 const psiconv_word_styles_section styles_sec,
330 const encoding enc) 557 const encoding enc)
331{ 558{
332 int i,charnr; 559 int i,charnr,start,len;
333 psiconv_string_t text; 560 psiconv_string_t text;
334 psiconv_in_line_layout layout; 561 psiconv_in_line_layout layout,next_layout;
335 psiconv_word_style style = NULL; 562 psiconv_word_style style = NULL;
336 psiconv_paragraph_layout base_para; 563 psiconv_paragraph_layout base_para;
337 psiconv_character_layout base_char; 564 psiconv_character_layout base_char;
338 psiconv_list templist; 565 psiconv_list templist;
339 566
356 fputs("Out of memory error\n",stderr); 583 fputs("Out of memory error\n",stderr);
357 exit(1); 584 exit(1);
358 } 585 }
359 } 586 }
360 587
361 output_simple_chars(config,list,"<p ",enc); 588 output_simple_chars(config,
589 list,para->base_paragraph->bullet->on?"<ul><li ":"<p ",
590 enc);
362 591
363 if (styles_sec) { 592 if (styles_sec) {
364 output_simple_chars(config,list,"class=\"style_",enc); 593 output_simple_chars(config,list,"class=\"style_",enc);
365 style_name(config,list,style->name,enc); 594 style_name(config,list,style->name,enc);
366 output_simple_chars(config,list,"\" ",enc); 595 output_simple_chars(config,list,"\" ",enc);
378 output_simple_chars(config,list,"\"",enc); 607 output_simple_chars(config,list,"\"",enc);
379 } 608 }
380 output_simple_chars(config,list,">",enc); 609 output_simple_chars(config,list,">",enc);
381 610
382 if (psiconv_list_length(para->in_lines) == 0) { 611 if (psiconv_list_length(para->in_lines) == 0) {
612 if (psiconv_unicode_strlen(para->text))
383 characters(config,list,para->text,para->base_character, 613 characters(config,list,para->text,para->base_character,
384 para->base_character,enc); 614 para->base_character,enc);
385 } else { 615 } else {
386 charnr = 0; 616 charnr = 0;
617 start = -1;
387 for (i = 0; i < psiconv_list_length(para->in_lines); i++) { 618 for (i = 0; i < psiconv_list_length(para->in_lines); i++) {
619 if (start < 0)
620 start = charnr;
388 if (!(layout = psiconv_list_get(para->in_lines,i))) { 621 if (!(layout = psiconv_list_get(para->in_lines,i))) {
389 fputs("Internal data structures corruption\n",stderr); 622 fputs("Internal data structures corruption\n",stderr);
390 exit(1); 623 exit(1);
391 } 624 }
392 if (!(text = malloc(sizeof (*text) * (layout->length + 1)))) { 625 if (i+1 < psiconv_list_length(para->in_lines)) {
393 fputs("Out of memory error\n",stderr); 626 if (!(next_layout = psiconv_list_get(para->in_lines,i+1))) {
394 exit(1); 627 fputs("Internal data structures corruption\n",stderr);
628 exit(1);
629 }
630 } else {
631 next_layout = NULL;
395 } 632 }
633 if (next_layout &&
634 character_layout_equal(layout->layout,next_layout->layout)) {
635 charnr += layout->length;
636 continue;
637 }
638 len = charnr - start + layout->length;
639 if (len) {
640 if (!(text = malloc(sizeof (*text) * (len + 1)))) {
641 fputs("Out of memory error\n",stderr);
642 exit(1);
643 }
396 memcpy(text,para->text+charnr,layout->length * sizeof(*text)); 644 memcpy(text,para->text+start,len * sizeof(*text));
397 text[layout->length] = 0; 645 text[len] = 0;
398 characters(config,list,text,layout->layout,para->base_character,enc); 646 characters(config,list,text,layout->layout,para->base_character,enc);
399 free(text); 647 free(text);
648 }
400 charnr += layout->length; 649 charnr += layout->length;
401 } 650 start = -1;
402 } 651 }
652 }
403 output_simple_chars(config,list,"</p>\n",enc); 653 output_simple_chars(config, list,
654 para->base_paragraph->bullet->on?"</li></ul>\n":"</p>\n",
655 enc);
404 if (!styles_sec) { 656 if (!styles_sec) {
405 psiconv_free_paragraph_layout(base_para); 657 psiconv_free_paragraph_layout(base_para);
406 psiconv_free_character_layout(base_char); 658 psiconv_free_character_layout(base_char);
407 } 659 }
408 psiconv_list_free(templist); 660 psiconv_list_free(templist);
422 } 674 }
423 paragraph(config,list,para,styles,enc); 675 paragraph(config,list,para,styles,enc);
424 } 676 }
425} 677}
426 678
427void gen_html_word(const psiconv_config config, psiconv_list list, 679void gen_word(const psiconv_config config, psiconv_list list,
428 const psiconv_word_f file, const encoding enc) 680 const psiconv_word_f file, const encoding enc)
429{ 681{
430 if (!file) 682 if (!file)
431 return; 683 return;
432 684
434 paragraphs(config,list,file->paragraphs,file->styles_sec,enc); 686 paragraphs(config,list,file->paragraphs,file->styles_sec,enc);
435 footer(config,list,enc); 687 footer(config,list,enc);
436} 688}
437 689
438 690
439void gen_html_texted(const psiconv_config config, psiconv_list list, 691void gen_texted(const psiconv_config config, psiconv_list list,
440 const psiconv_texted_f file, const encoding enc) 692 const psiconv_texted_f file, const encoding enc)
441{ 693{
442 header(config,list,NULL,enc); 694 header(config,list,NULL,enc);
443 paragraphs(config,list,file->texted_sec->paragraphs,NULL,enc); 695 paragraphs(config,list,file->texted_sec->paragraphs,NULL,enc);
444 footer(config,list,enc); 696 footer(config,list,enc);
445} 697}
446 698
447int gen_html(const psiconv_config config, psiconv_list list, 699int gen_xhtml(const psiconv_config config, psiconv_list list,
448 const psiconv_file file, const char *dest, 700 const psiconv_file file, const char *dest,
449 const encoding enc) 701 const encoding enc)
450{ 702{
703 encoding enc1 = enc;
704
451 if (enc == ENCODING_PSION) { 705 if (enc == ENCODING_PSION) {
452 fputs("Unsupported encoding\n",stderr); 706 fputs("Unsupported encoding\n",stderr);
453 return -1; 707 return -1;
454 } 708 } else if (enc == ENCODING_ASCII)
709 enc1 = ENCODING_ASCII_HTML;
455 710
456 if (file->type == psiconv_word_file) { 711 if (file->type == psiconv_word_file) {
457 gen_html_word(config,list,(psiconv_word_f) file->file,enc); 712 gen_word(config,list,(psiconv_word_f) file->file,enc1);
458 return 0; 713 return 0;
459 } else if (file->type == psiconv_texted_file) { 714 } else if (file->type == psiconv_texted_file) {
460 gen_html_texted(config,list,(psiconv_texted_f) file->file,enc); 715 gen_texted(config,list,(psiconv_texted_f) file->file,enc1);
461 return 0; 716 return 0;
462 } else 717 } else
463 return -1; 718 return -1;
464} 719}
465 720
466 721
467static struct fileformat_s ffs[] = 722static struct fileformat_s fileformats[] =
468 { 723 {
469 { 724 {
470 "XHTML", 725 "XHTML",
471 "XHTML 1.0 Strict, using CSS for formatting", 726 "XHTML 1.0 Strict, using CSS for formatting",
727 FORMAT_WORD | FORMAT_TEXTED,
472 gen_html 728 gen_xhtml
473 }, 729 },
474 { 730 {
475 NULL, 731 NULL,
476 NULL, 732 NULL,
733 0,
477 NULL 734 NULL
478 } 735 }
479 }; 736 };
480 737
481 738
482void init_html(void) 739void init_xhtml(void)
483{ 740{
484 int i; 741 int i;
485 for (i = 0; ffs[i].name; i++) 742 for (i = 0; fileformats[i].name; i++)
486 psiconv_list_add(fileformat_list,ffs+i); 743 psiconv_list_add(fileformat_list,fileformats+i);
487} 744}

Legend:
Removed from v.190  
changed lines
  Added in v.270

frodo@frodo.looijaard.name
ViewVC Help
Powered by ViewVC 1.1.26