/[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 192 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
37 psiconv_color color,int may_be_transparant, const encoding enc); 39 psiconv_color color,int may_be_transparant, const encoding enc);
38static void border(const psiconv_config config, psiconv_list list, 40static void border(const psiconv_config config, psiconv_list list,
39 psiconv_border_kind_t border,const encoding enc); 41 psiconv_border_kind_t border,const encoding enc);
40static void style_name(const psiconv_config config, psiconv_list list, 42static void style_name(const psiconv_config config, psiconv_list list,
41 const psiconv_string_t name,const encoding enc); 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);
42static void character_layout_diffs(const psiconv_config config, 46static void character_layout_diffs(const psiconv_config config,
43 psiconv_list list, 47 psiconv_list list,
44 const psiconv_character_layout new, 48 const psiconv_character_layout new,
45 const psiconv_character_layout base, 49 const psiconv_character_layout base,
46 const encoding enc); 50 const encoding enc);
63static void characters(const psiconv_config config, psiconv_list list, 67static void characters(const psiconv_config config, psiconv_list list,
64 const psiconv_string_t textstr, 68 const psiconv_string_t textstr,
65 const psiconv_character_layout layout, 69 const psiconv_character_layout layout,
66 const psiconv_character_layout base, 70 const psiconv_character_layout base,
67 const encoding enc); 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);
68static void paragraph(const psiconv_config config, psiconv_list list, 76static void paragraph(const psiconv_config config, psiconv_list list,
69 const psiconv_paragraph para, 77 const psiconv_paragraph para,
70 const psiconv_word_styles_section styles_sec, 78 const psiconv_word_styles_section styles_sec,
71 const encoding enc); 79 const encoding enc);
72static void gen_word(const psiconv_config config, psiconv_list list, 80static void gen_word(const psiconv_config config, psiconv_list list,
73 const psiconv_word_f file, const encoding enc); 81 const psiconv_word_f file, const encoding enc);
74static void gen_texted(const psiconv_config config, psiconv_list list, 82static void gen_texted(const psiconv_config config, psiconv_list list,
75 const psiconv_texted_f file, const encoding enc); 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);
76 87
77 88
78 89
79void text(const psiconv_config config,psiconv_list list, 90void text(const psiconv_config config,psiconv_list list,
80 psiconv_string_t data,const encoding enc) 91 psiconv_string_t data,const encoding enc)
83 for (i = 0; i < psiconv_unicode_strlen(data); i++) { 94 for (i = 0; i < psiconv_unicode_strlen(data); i++) {
84 if ((data[i] == 0x06) || (data[i] == 0x07) || (data[i] == 0x08)) 95 if ((data[i] == 0x06) || (data[i] == 0x07) || (data[i] == 0x08))
85 output_simple_chars(config,list,"<br/>",enc); 96 output_simple_chars(config,list,"<br/>",enc);
86 else if ((data[i] == 0x0b) || (data[i] == 0x0c)) 97 else if ((data[i] == 0x0b) || (data[i] == 0x0c))
87 output_simple_chars(config,list,"-",enc); 98 output_simple_chars(config,list,"-",enc);
88 else if (data[i] == 0x0f) 99 else if ((data[i] == 0x0f) || (data[i] == 0x09) || (data[i] == 0x0a))
89 output_simple_chars(config,list," ",enc); 100 output_simple_chars(config,list," ",enc);
90 else if (data[i] >= 0x20) 101 else if (data[i] >= 0x20)
91 output_char(config,list,data[i],enc); 102 output_char(config,list,data[i],enc);
92 } 103 }
93} 104}
143 } 154 }
144 output_string(config,list,name_copy,enc); 155 output_string(config,list,name_copy,enc);
145 free(name_copy); 156 free(name_copy);
146} 157}
147 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
148void character_layout_diffs(const psiconv_config config, psiconv_list list, 179void character_layout_diffs(const psiconv_config config, psiconv_list list,
149 const psiconv_character_layout new, 180 const psiconv_character_layout new,
150 const psiconv_character_layout base, 181 const psiconv_character_layout base,
151 const encoding enc) 182 const encoding enc)
152{ 183{
278 new->justify_hor==psiconv_justify_full?"justify": 309 new->justify_hor==psiconv_justify_full?"justify":
279 "",enc); 310 "",enc);
280 output_simple_chars(config,list,";",enc); 311 output_simple_chars(config,list,";",enc);
281 } 312 }
282 313
314#if 0
315 /* This gave bad output... */
283 if (!base || (new->linespacing != base->linespacing)) { 316 if (!base || (new->linespacing != base->linespacing)) {
284 output_simple_chars(config,list,"line-height:",enc); 317 output_simple_chars(config,list,"line-height:",enc);
285 snprintf(tempstr,TEMPSTR_LEN,"%f",new->linespacing); 318 snprintf(tempstr,TEMPSTR_LEN,"%f",new->linespacing);
286 output_simple_chars(config,list,tempstr,enc); 319 output_simple_chars(config,list,tempstr,enc);
287 output_simple_chars(config,list,"pt;",enc); 320 output_simple_chars(config,list,"pt;",enc);
288 } 321 }
322#endif
289 323
290 if (!base || (new->space_above != base->space_above)) { 324 if (!base || (new->space_above != base->space_above)) {
291 output_simple_chars(config,list,"padding-top:",enc); 325 output_simple_chars(config,list,"padding-top:",enc);
292 snprintf(tempstr,TEMPSTR_LEN,"%f",new->space_above); 326 snprintf(tempstr,TEMPSTR_LEN,"%f",new->space_above);
293 output_simple_chars(config,list,tempstr,enc); 327 output_simple_chars(config,list,tempstr,enc);
520void paragraph(const psiconv_config config, psiconv_list list, 554void paragraph(const psiconv_config config, psiconv_list list,
521 const psiconv_paragraph para, 555 const psiconv_paragraph para,
522 const psiconv_word_styles_section styles_sec, 556 const psiconv_word_styles_section styles_sec,
523 const encoding enc) 557 const encoding enc)
524{ 558{
525 int i,charnr; 559 int i,charnr,start,len;
526 psiconv_string_t text; 560 psiconv_string_t text;
527 psiconv_in_line_layout layout; 561 psiconv_in_line_layout layout,next_layout;
528 psiconv_word_style style = NULL; 562 psiconv_word_style style = NULL;
529 psiconv_paragraph_layout base_para; 563 psiconv_paragraph_layout base_para;
530 psiconv_character_layout base_char; 564 psiconv_character_layout base_char;
531 psiconv_list templist; 565 psiconv_list templist;
532 566
573 output_simple_chars(config,list,"\"",enc); 607 output_simple_chars(config,list,"\"",enc);
574 } 608 }
575 output_simple_chars(config,list,">",enc); 609 output_simple_chars(config,list,">",enc);
576 610
577 if (psiconv_list_length(para->in_lines) == 0) { 611 if (psiconv_list_length(para->in_lines) == 0) {
612 if (psiconv_unicode_strlen(para->text))
578 characters(config,list,para->text,para->base_character, 613 characters(config,list,para->text,para->base_character,
579 para->base_character,enc); 614 para->base_character,enc);
580 } else { 615 } else {
581 charnr = 0; 616 charnr = 0;
617 start = -1;
582 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;
583 if (!(layout = psiconv_list_get(para->in_lines,i))) { 621 if (!(layout = psiconv_list_get(para->in_lines,i))) {
584 fputs("Internal data structures corruption\n",stderr); 622 fputs("Internal data structures corruption\n",stderr);
585 exit(1); 623 exit(1);
586 } 624 }
587 if (!(text = malloc(sizeof (*text) * (layout->length + 1)))) { 625 if (i+1 < psiconv_list_length(para->in_lines)) {
588 fputs("Out of memory error\n",stderr); 626 if (!(next_layout = psiconv_list_get(para->in_lines,i+1))) {
589 exit(1); 627 fputs("Internal data structures corruption\n",stderr);
628 exit(1);
629 }
630 } else {
631 next_layout = NULL;
590 } 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 }
591 memcpy(text,para->text+charnr,layout->length * sizeof(*text)); 644 memcpy(text,para->text+start,len * sizeof(*text));
592 text[layout->length] = 0; 645 text[len] = 0;
593 characters(config,list,text,layout->layout,para->base_character,enc); 646 characters(config,list,text,layout->layout,para->base_character,enc);
594 free(text); 647 free(text);
648 }
595 charnr += layout->length; 649 charnr += layout->length;
650 start = -1;
596 } 651 }
597 } 652 }
598 output_simple_chars(config, list, 653 output_simple_chars(config, list,
599 para->base_paragraph->bullet->on?"</li></ul>\n":"</p>\n", 654 para->base_paragraph->bullet->on?"</li></ul>\n":"</p>\n",
600 enc); 655 enc);
662 } else 717 } else
663 return -1; 718 return -1;
664} 719}
665 720
666 721
667static struct fileformat_s ffs[] = 722static struct fileformat_s fileformats[] =
668 { 723 {
669 { 724 {
670 "XHTML", 725 "XHTML",
671 "XHTML 1.0 Strict, using CSS for formatting", 726 "XHTML 1.0 Strict, using CSS for formatting",
672 FORMAT_WORD | FORMAT_TEXTED, 727 FORMAT_WORD | FORMAT_TEXTED,
682 737
683 738
684void init_xhtml(void) 739void init_xhtml(void)
685{ 740{
686 int i; 741 int i;
687 for (i = 0; ffs[i].name; i++) 742 for (i = 0; fileformats[i].name; i++)
688 psiconv_list_add(fileformat_list,ffs+i); 743 psiconv_list_add(fileformat_list,fileformats+i);
689} 744}

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

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