/[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 194 Revision 195
39 psiconv_color color,int may_be_transparant, const encoding enc); 39 psiconv_color color,int may_be_transparant, const encoding enc);
40static void border(const psiconv_config config, psiconv_list list, 40static void border(const psiconv_config config, psiconv_list list,
41 psiconv_border_kind_t border,const encoding enc); 41 psiconv_border_kind_t border,const encoding enc);
42static void style_name(const psiconv_config config, psiconv_list list, 42static void style_name(const psiconv_config config, psiconv_list list,
43 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);
44static void character_layout_diffs(const psiconv_config config, 46static void character_layout_diffs(const psiconv_config config,
45 psiconv_list list, 47 psiconv_list list,
46 const psiconv_character_layout new, 48 const psiconv_character_layout new,
47 const psiconv_character_layout base, 49 const psiconv_character_layout base,
48 const encoding enc); 50 const encoding enc);
152 } 154 }
153 output_string(config,list,name_copy,enc); 155 output_string(config,list,name_copy,enc);
154 free(name_copy); 156 free(name_copy);
155} 157}
156 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
157void character_layout_diffs(const psiconv_config config, psiconv_list list, 179void character_layout_diffs(const psiconv_config config, psiconv_list list,
158 const psiconv_character_layout new, 180 const psiconv_character_layout new,
159 const psiconv_character_layout base, 181 const psiconv_character_layout base,
160 const encoding enc) 182 const encoding enc)
161{ 183{
287 new->justify_hor==psiconv_justify_full?"justify": 309 new->justify_hor==psiconv_justify_full?"justify":
288 "",enc); 310 "",enc);
289 output_simple_chars(config,list,";",enc); 311 output_simple_chars(config,list,";",enc);
290 } 312 }
291 313
314#if 0
315 /* This gave bad output... */
292 if (!base || (new->linespacing != base->linespacing)) { 316 if (!base || (new->linespacing != base->linespacing)) {
293 output_simple_chars(config,list,"line-height:",enc); 317 output_simple_chars(config,list,"line-height:",enc);
294 snprintf(tempstr,TEMPSTR_LEN,"%f",new->linespacing); 318 snprintf(tempstr,TEMPSTR_LEN,"%f",new->linespacing);
295 output_simple_chars(config,list,tempstr,enc); 319 output_simple_chars(config,list,tempstr,enc);
296 output_simple_chars(config,list,"pt;",enc); 320 output_simple_chars(config,list,"pt;",enc);
297 } 321 }
322#endif
298 323
299 if (!base || (new->space_above != base->space_above)) { 324 if (!base || (new->space_above != base->space_above)) {
300 output_simple_chars(config,list,"padding-top:",enc); 325 output_simple_chars(config,list,"padding-top:",enc);
301 snprintf(tempstr,TEMPSTR_LEN,"%f",new->space_above); 326 snprintf(tempstr,TEMPSTR_LEN,"%f",new->space_above);
302 output_simple_chars(config,list,tempstr,enc); 327 output_simple_chars(config,list,tempstr,enc);
529void paragraph(const psiconv_config config, psiconv_list list, 554void paragraph(const psiconv_config config, psiconv_list list,
530 const psiconv_paragraph para, 555 const psiconv_paragraph para,
531 const psiconv_word_styles_section styles_sec, 556 const psiconv_word_styles_section styles_sec,
532 const encoding enc) 557 const encoding enc)
533{ 558{
534 int i,charnr; 559 int i,charnr,start,len;
535 psiconv_string_t text; 560 psiconv_string_t text;
536 psiconv_in_line_layout layout; 561 psiconv_in_line_layout layout,next_layout;
537 psiconv_word_style style = NULL; 562 psiconv_word_style style = NULL;
538 psiconv_paragraph_layout base_para; 563 psiconv_paragraph_layout base_para;
539 psiconv_character_layout base_char; 564 psiconv_character_layout base_char;
540 psiconv_list templist; 565 psiconv_list templist;
541 566
582 output_simple_chars(config,list,"\"",enc); 607 output_simple_chars(config,list,"\"",enc);
583 } 608 }
584 output_simple_chars(config,list,">",enc); 609 output_simple_chars(config,list,">",enc);
585 610
586 if (psiconv_list_length(para->in_lines) == 0) { 611 if (psiconv_list_length(para->in_lines) == 0) {
612 if (psiconv_unicode_strlen(para->text))
587 characters(config,list,para->text,para->base_character, 613 characters(config,list,para->text,para->base_character,
588 para->base_character,enc); 614 para->base_character,enc);
589 } else { 615 } else {
590 charnr = 0; 616 charnr = 0;
617 start = -1;
591 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;
592 if (!(layout = psiconv_list_get(para->in_lines,i))) { 621 if (!(layout = psiconv_list_get(para->in_lines,i))) {
593 fputs("Internal data structures corruption\n",stderr); 622 fputs("Internal data structures corruption\n",stderr);
594 exit(1); 623 exit(1);
595 } 624 }
596 if (!(text = malloc(sizeof (*text) * (layout->length + 1)))) { 625 if (i+1 < psiconv_list_length(para->in_lines)) {
597 fputs("Out of memory error\n",stderr); 626 if (!(next_layout = psiconv_list_get(para->in_lines,i+1))) {
598 exit(1); 627 fputs("Internal data structures corruption\n",stderr);
628 exit(1);
629 }
630 } else {
631 next_layout = NULL;
599 } 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 }
600 memcpy(text,para->text+charnr,layout->length * sizeof(*text)); 644 memcpy(text,para->text+start,len * sizeof(*text));
601 text[layout->length] = 0; 645 text[len] = 0;
602 characters(config,list,text,layout->layout,para->base_character,enc); 646 characters(config,list,text,layout->layout,para->base_character,enc);
603 free(text); 647 free(text);
648 }
604 charnr += layout->length; 649 charnr += layout->length;
650 start = -1;
605 } 651 }
606 } 652 }
607 output_simple_chars(config, list, 653 output_simple_chars(config, list,
608 para->base_paragraph->bullet->on?"</li></ul>\n":"</p>\n", 654 para->base_paragraph->bullet->on?"</li></ul>\n":"</p>\n",
609 enc); 655 enc);

Legend:
Removed from v.194  
changed lines
  Added in v.195

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