/[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 191 Revision 267
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
33 89
34void text(const psiconv_config config,psiconv_list list, 90void text(const psiconv_config config,psiconv_list list,
35 psiconv_string_t data,const encoding enc) 91 psiconv_string_t data,const encoding enc)
36{ 92{
37 int i; 93 int i;
38 for (i = 0; i < psiconv_unicode_strlen(data); i++) { 94 for (i = 0; i < psiconv_unicode_strlen(data); i++) {
39 if ((data[i] == 0x06) || (data[i] == 0x07) || (data[i] == 0x08)) 95 if ((data[i] == 0x06) || (data[i] == 0x07) || (data[i] == 0x08))
40 output_simple_chars(config,list,"<br/>",enc); 96 output_simple_chars(config,list,"<br/>",enc);
41 else if ((data[i] == 0x0b) || (data[i] == 0x0c)) 97 else if ((data[i] == 0x0b) || (data[i] == 0x0c))
42 output_simple_chars(config,list,"-",enc); 98 output_simple_chars(config,list,"-",enc);
43 else if (data[i] == 0x0f) 99 else if ((data[i] == 0x0f) || (data[i] == 0x09) || (data[i] == 0x0a))
44 output_simple_chars(config,list," ",enc); 100 output_simple_chars(config,list," ",enc);
45 else if (data[i] >= 0x20) 101 else if (data[i] >= 0x20)
46 output_char(config,list,data[i],enc); 102 output_char(config,list,data[i],enc);
47 } 103 }
48} 104}
98 } 154 }
99 output_string(config,list,name_copy,enc); 155 output_string(config,list,name_copy,enc);
100 free(name_copy); 156 free(name_copy);
101} 157}
102 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
103void character_layout_diffs(const psiconv_config config, psiconv_list list, 179void character_layout_diffs(const psiconv_config config, psiconv_list list,
104 const psiconv_character_layout new, 180 const psiconv_character_layout new,
105 const psiconv_character_layout base, 181 const psiconv_character_layout base,
106 const encoding enc) 182 const encoding enc)
107{ 183{
233 new->justify_hor==psiconv_justify_full?"justify": 309 new->justify_hor==psiconv_justify_full?"justify":
234 "",enc); 310 "",enc);
235 output_simple_chars(config,list,";",enc); 311 output_simple_chars(config,list,";",enc);
236 } 312 }
237 313
314#if 0
315 /* This gave bad output... */
238 if (!base || (new->linespacing != base->linespacing)) { 316 if (!base || (new->linespacing != base->linespacing)) {
239 output_simple_chars(config,list,"line-height:",enc); 317 output_simple_chars(config,list,"line-height:",enc);
240 snprintf(tempstr,TEMPSTR_LEN,"%f",new->linespacing); 318 snprintf(tempstr,TEMPSTR_LEN,"%f",new->linespacing);
241 output_simple_chars(config,list,tempstr,enc); 319 output_simple_chars(config,list,tempstr,enc);
242 output_simple_chars(config,list,"pt;",enc); 320 output_simple_chars(config,list,"pt;",enc);
243 } 321 }
322#endif
244 323
245 if (!base || (new->space_above != base->space_above)) { 324 if (!base || (new->space_above != base->space_above)) {
246 output_simple_chars(config,list,"padding-top:",enc); 325 output_simple_chars(config,list,"padding-top:",enc);
247 snprintf(tempstr,TEMPSTR_LEN,"%f",new->space_above); 326 snprintf(tempstr,TEMPSTR_LEN,"%f",new->space_above);
248 output_simple_chars(config,list,tempstr,enc); 327 output_simple_chars(config,list,tempstr,enc);
475void paragraph(const psiconv_config config, psiconv_list list, 554void paragraph(const psiconv_config config, psiconv_list list,
476 const psiconv_paragraph para, 555 const psiconv_paragraph para,
477 const psiconv_word_styles_section styles_sec, 556 const psiconv_word_styles_section styles_sec,
478 const encoding enc) 557 const encoding enc)
479{ 558{
480 int i,charnr; 559 int i,charnr,start,len;
481 psiconv_string_t text; 560 psiconv_string_t text;
482 psiconv_in_line_layout layout; 561 psiconv_in_line_layout layout,next_layout;
483 psiconv_word_style style = NULL; 562 psiconv_word_style style = NULL;
484 psiconv_paragraph_layout base_para; 563 psiconv_paragraph_layout base_para;
485 psiconv_character_layout base_char; 564 psiconv_character_layout base_char;
486 psiconv_list templist; 565 psiconv_list templist;
487 566
528 output_simple_chars(config,list,"\"",enc); 607 output_simple_chars(config,list,"\"",enc);
529 } 608 }
530 output_simple_chars(config,list,">",enc); 609 output_simple_chars(config,list,">",enc);
531 610
532 if (psiconv_list_length(para->in_lines) == 0) { 611 if (psiconv_list_length(para->in_lines) == 0) {
612 if (psiconv_unicode_strlen(para->text))
533 characters(config,list,para->text,para->base_character, 613 characters(config,list,para->text,para->base_character,
534 para->base_character,enc); 614 para->base_character,enc);
535 } else { 615 } else {
536 charnr = 0; 616 charnr = 0;
617 start = -1;
537 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;
538 if (!(layout = psiconv_list_get(para->in_lines,i))) { 621 if (!(layout = psiconv_list_get(para->in_lines,i))) {
539 fputs("Internal data structures corruption\n",stderr); 622 fputs("Internal data structures corruption\n",stderr);
540 exit(1); 623 exit(1);
541 } 624 }
542 if (!(text = malloc(sizeof (*text) * (layout->length + 1)))) { 625 if (i+1 < psiconv_list_length(para->in_lines)) {
543 fputs("Out of memory error\n",stderr); 626 if (!(next_layout = psiconv_list_get(para->in_lines,i+1))) {
544 exit(1); 627 fputs("Internal data structures corruption\n",stderr);
628 exit(1);
629 }
630 } else {
631 next_layout = NULL;
545 } 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 }
546 memcpy(text,para->text+charnr,layout->length * sizeof(*text)); 644 memcpy(text,para->text+start,len * sizeof(*text));
547 text[layout->length] = 0; 645 text[len] = 0;
548 characters(config,list,text,layout->layout,para->base_character,enc); 646 characters(config,list,text,layout->layout,para->base_character,enc);
549 free(text); 647 free(text);
648 }
550 charnr += layout->length; 649 charnr += layout->length;
650 start = -1;
551 } 651 }
552 } 652 }
553 output_simple_chars(config, list, 653 output_simple_chars(config, list,
554 para->base_paragraph->bullet->on?"</li></ul>\n":"<p>\n", 654 para->base_paragraph->bullet->on?"</li></ul>\n":"</p>\n",
555 enc); 655 enc);
556 if (!styles_sec) { 656 if (!styles_sec) {
557 psiconv_free_paragraph_layout(base_para); 657 psiconv_free_paragraph_layout(base_para);
558 psiconv_free_character_layout(base_char); 658 psiconv_free_character_layout(base_char);
559 } 659 }
574 } 674 }
575 paragraph(config,list,para,styles,enc); 675 paragraph(config,list,para,styles,enc);
576 } 676 }
577} 677}
578 678
579void gen_html_word(const psiconv_config config, psiconv_list list, 679void gen_word(const psiconv_config config, psiconv_list list,
580 const psiconv_word_f file, const encoding enc) 680 const psiconv_word_f file, const encoding enc)
581{ 681{
582 if (!file) 682 if (!file)
583 return; 683 return;
584 684
586 paragraphs(config,list,file->paragraphs,file->styles_sec,enc); 686 paragraphs(config,list,file->paragraphs,file->styles_sec,enc);
587 footer(config,list,enc); 687 footer(config,list,enc);
588} 688}
589 689
590 690
591void gen_html_texted(const psiconv_config config, psiconv_list list, 691void gen_texted(const psiconv_config config, psiconv_list list,
592 const psiconv_texted_f file, const encoding enc) 692 const psiconv_texted_f file, const encoding enc)
593{ 693{
594 header(config,list,NULL,enc); 694 header(config,list,NULL,enc);
595 paragraphs(config,list,file->texted_sec->paragraphs,NULL,enc); 695 paragraphs(config,list,file->texted_sec->paragraphs,NULL,enc);
596 footer(config,list,enc); 696 footer(config,list,enc);
597} 697}
598 698
599int gen_html(const psiconv_config config, psiconv_list list, 699int gen_xhtml(const psiconv_config config, psiconv_list list,
600 const psiconv_file file, const char *dest, 700 const psiconv_file file, const char *dest,
601 const encoding enc) 701 const encoding enc)
602{ 702{
703 encoding enc1 = enc;
704
603 if (enc == ENCODING_PSION) { 705 if (enc == ENCODING_PSION) {
604 fputs("Unsupported encoding\n",stderr); 706 fputs("Unsupported encoding\n",stderr);
605 return -1; 707 return -1;
606 } 708 } else if (enc == ENCODING_ASCII)
709 enc1 = ENCODING_ASCII_HTML;
607 710
608 if (file->type == psiconv_word_file) { 711 if (file->type == psiconv_word_file) {
609 gen_html_word(config,list,(psiconv_word_f) file->file,enc); 712 gen_word(config,list,(psiconv_word_f) file->file,enc1);
610 return 0; 713 return 0;
611 } else if (file->type == psiconv_texted_file) { 714 } else if (file->type == psiconv_texted_file) {
612 gen_html_texted(config,list,(psiconv_texted_f) file->file,enc); 715 gen_texted(config,list,(psiconv_texted_f) file->file,enc1);
613 return 0; 716 return 0;
614 } else 717 } else
615 return -1; 718 return -1;
616} 719}
617 720
618 721
619static struct fileformat_s ffs[] = 722static struct fileformat_s fileformats[] =
620 { 723 {
621 { 724 {
622 "XHTML", 725 "XHTML",
623 "XHTML 1.0 Strict, using CSS for formatting", 726 "XHTML 1.0 Strict, using CSS for formatting",
727 FORMAT_WORD | FORMAT_TEXTED,
624 gen_html 728 gen_xhtml
625 }, 729 },
626 { 730 {
627 NULL, 731 NULL,
628 NULL, 732 NULL,
733 0,
629 NULL 734 NULL
630 } 735 }
631 }; 736 };
632 737
633 738
634void init_html(void) 739void init_xhtml(void)
635{ 740{
636 int i; 741 int i;
637 for (i = 0; ffs[i].name; i++) 742 for (i = 0; fileformats[i].name; i++)
638 psiconv_list_add(fileformat_list,ffs+i); 743 psiconv_list_add(fileformat_list,fileformats+i);
639} 744}

Legend:
Removed from v.191  
changed lines
  Added in v.267

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