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

Annotation of /psiconv/trunk/program/psiconv/gen_html4.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 192 - (hide annotations)
Mon Feb 2 20:43:04 2004 UTC (20 years, 1 month ago) by frodo
File MIME type: text/plain
File size: 10265 byte(s)
(Frodo) Psiconv program update
  * Created html4 target
  * Update of xhtml target (print entities if ASCII, and others)
  * Made everything static that should not be exported
  * Renamed stuff to xhtml were appropriate
  * The fileformat data does now contain the supported Psion files to convert
  * This is also printed in the help text
  * ENCODING_ASCII_HTML introduced (only used internally)
  * Replaced debug, silent, verbose options with noise option
  * Default targets are XHTML and TIFF

1 frodo 192 /* gen_html.c - Part of psiconv, a PSION 5 file formats converter
2     Copyright (c) 1999-2004 Frodo Looijaard <frodol@dds.nl>
3    
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
6     the Free Software Foundation; either version 2 of the License, or
7     (at your option) any later version.
8    
9     This program is distributed in the hope that it will be useful,
10     but WITHOUT ANY WARRANTY; without even the implied warranty of
11     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12     GNU General Public License for more details.
13    
14     You should have received a copy of the GNU General Public License
15     along with this program; if not, write to the Free Software
16     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
17     */
18 frodo 14
19 frodo 192 #include "config.h"
20 frodo 147
21 frodo 192 #include <psiconv/configuration.h>
22     #include <psiconv/data.h>
23     #include "general.h"
24 frodo 147
25 frodo 14 #include <string.h>
26     #include <stdlib.h>
27    
28 frodo 142 #ifdef DMALLOC
29     #include "dmalloc.h"
30     #endif
31    
32 frodo 192 #define TEMPSTR_LEN 100
33 frodo 14
34 frodo 192 static void text(const psiconv_config config,psiconv_list list,
35     psiconv_string_t data,const encoding enc);
36     static void header(const psiconv_config config, psiconv_list list,
37     const encoding enc);
38     static void footer(const psiconv_config config, psiconv_list list,
39     const encoding enc);
40     static void characters(const psiconv_config config, psiconv_list list,
41     const psiconv_string_t textstr,
42     const psiconv_character_layout layout,const encoding enc);
43     static void paragraph(const psiconv_config config, psiconv_list list,
44     psiconv_paragraph para, const encoding enc);
45     static void paragraphs(const psiconv_config config, psiconv_list list,
46     psiconv_text_and_layout paragraphs, const encoding enc);
47     static void gen_word(const psiconv_config config, psiconv_list list,
48     const psiconv_word_f file, const encoding enc);
49     static void gen_texted(const psiconv_config config, psiconv_list list,
50     const psiconv_texted_f file, const encoding enc);
51 frodo 14
52 frodo 147
53 frodo 192 void text(const psiconv_config config,psiconv_list list,
54     psiconv_string_t data,const encoding enc)
55     {
56     int i;
57     for (i = 0; i < psiconv_unicode_strlen(data); i++) {
58     if ((data[i] == 0x06) || (data[i] == 0x07) || (data[i] == 0x08))
59     output_simple_chars(config,list,"<BR>",enc);
60     else if ((data[i] == 0x0b) || (data[i] == 0x0c))
61     output_simple_chars(config,list,"-",enc);
62     else if (data[i] == 0x0f)
63     output_simple_chars(config,list," ",enc);
64     else if (data[i] >= 0x20)
65     output_char(config,list,data[i],enc);
66     }
67     }
68 frodo 147
69 frodo 192 void header(const psiconv_config config, psiconv_list list, const encoding enc)
70     {
71     output_simple_chars(config,list,"<!DOCTYPE html PUBLIC "
72     "\"-//W3C//DTD HTML 4.01 Transitional//EN\" "
73     "\"http://www.w3.org/TR/html4/loose.dtd\">\n",
74     enc);
75     output_simple_chars(config,list,"<HTML>\n",enc);
76     output_simple_chars(config,list,"<HEAD>\n",enc);
77     output_simple_chars(config,list,"<META HTTP-EQUIV=\"Content-Type\" "
78     "CONTENT=\"text/html; charset=",enc);
79     output_simple_chars(config,list,enc==ENCODING_UTF8?"UTF-8":
80     enc==ENCODING_UCS2?"UTF-16BE":
81     enc==ENCODING_ASCII?"US-ASCII":
82     "",enc);
83     output_simple_chars(config,list,"\">\n",enc);
84     output_simple_chars(config,list,"<TITLE>EPOC32 file "
85     "converted by psiconv</TITLE>\n",enc);
86     output_simple_chars(config,list,"</HEAD>\n",enc);
87     output_simple_chars(config,list,"<BODY>\n",enc);
88     }
89 frodo 147
90 frodo 192 void footer(const psiconv_config config, psiconv_list list, const encoding enc)
91     {
92     output_simple_chars(config,list,"</BODY>\n",enc);
93     output_simple_chars(config,list,"</HTML>\n",enc);
94     }
95 frodo 14
96    
97 frodo 192 void characters(const psiconv_config config, psiconv_list list,
98     const psiconv_string_t textstr,
99     const psiconv_character_layout layout,const encoding enc)
100     {
101     char tempstr[TEMPSTR_LEN];
102 frodo 14
103 frodo 192 output_simple_chars(config,list,"<FONT face=\"",enc);
104     output_simple_chars(config,list,
105     layout->font->screenfont == psiconv_font_serif?"serif":
106     layout->font->screenfont == psiconv_font_sansserif?"sans-serif":
107     layout->font->screenfont == psiconv_font_nonprop?"monospace":
108     layout->font->screenfont == psiconv_font_misc?"fantasy":"",
109     enc);
110     output_simple_chars(config,list,"\"",enc);
111    
112     if ((layout->font_size < 10) || (layout->font_size >= 13)) {
113     output_simple_chars(config,list," size=",enc);
114     output_simple_chars(config,list,
115     layout->font_size < 8 ?"1":
116     layout->font_size < 10 ?"2":
117     layout->font_size < 13 ?"3":
118     layout->font_size < 17 ?"4":
119     layout->font_size < 24 ?"5":
120     layout->font_size < 36 ?"6":"7",enc);
121     }
122     if ((layout->color->red != 0) || (layout->color->green != 0) ||
123     (layout->color->blue != 0)) {
124     snprintf(tempstr,TEMPSTR_LEN,"%02x%02x%02x",
125     layout->color->red,layout->color->green,layout->color->blue);
126     output_simple_chars(config,list," color=#",enc);
127     output_simple_chars(config,list,tempstr,enc);
128     }
129     output_simple_chars(config,list,">",enc);
130 frodo 14
131    
132 frodo 192 if (layout->italic)
133     output_simple_chars(config,list,"<I>",enc);
134     if (layout->bold)
135     output_simple_chars(config,list,"<B>",enc);
136     if (layout->super_sub != psiconv_normalscript)
137     output_simple_chars(config,list,
138     layout->super_sub == psiconv_superscript?"<SUP>":
139     layout->super_sub == psiconv_subscript?"<SUB>":
140     "",enc);
141     if (layout->strikethrough)
142     output_simple_chars(config,list,"<S>",enc);
143     if (layout->underline)
144     output_simple_chars(config,list,"<U>",enc);
145 frodo 14
146 frodo 192 text(config,list,textstr,enc);
147    
148     if (layout->underline)
149     output_simple_chars(config,list,"</U>",enc);
150     if (layout->strikethrough)
151     output_simple_chars(config,list,"</S>",enc);
152     if (layout->super_sub != psiconv_normalscript)
153     output_simple_chars(config,list,
154     layout->super_sub == psiconv_superscript?"</SUP>":
155     layout->super_sub == psiconv_subscript?"</SUB>":
156     "",enc);
157     if (layout->bold)
158     output_simple_chars(config,list,"</B>",enc);
159     if (layout->italic)
160     output_simple_chars(config,list,"</I>",enc);
161     output_simple_chars(config,list,"</FONT>",enc);
162 frodo 14 }
163    
164 frodo 192 void paragraph(const psiconv_config config, psiconv_list list,
165     psiconv_paragraph para, const encoding enc)
166 frodo 14 {
167 frodo 192 int i,charnr;
168     psiconv_string_t text;
169     psiconv_in_line_layout layout;
170 frodo 14
171    
172 frodo 192 output_simple_chars(config,list,
173     para->base_paragraph->bullet->on?"<UL><LI":"<P",enc);
174 frodo 14
175 frodo 192 if (para->base_paragraph->justify_hor == psiconv_justify_centre)
176     output_simple_chars(config,list," align=center",enc);
177     else if (para->base_paragraph->justify_hor == psiconv_justify_right)
178     output_simple_chars(config,list," align=right",enc);
179     else if (para->base_paragraph->justify_hor == psiconv_justify_full)
180     output_simple_chars(config,list," align=justify",enc);
181 frodo 14
182 frodo 192 output_simple_chars(config,list,">",enc);
183 frodo 14
184 frodo 192 if (psiconv_list_length(para->in_lines) == 0) {
185     characters(config,list,para->text,para->base_character,enc);
186     } else {
187     charnr = 0;
188     for (i = 0; i < psiconv_list_length(para->in_lines); i++) {
189     if (!(layout = psiconv_list_get(para->in_lines,i))) {
190     fputs("Internal data structures corruption\n",stderr);
191     exit(1);
192     }
193     if (!(text = malloc(sizeof (*text) * (layout->length + 1)))) {
194     fputs("Out of memory error\n",stderr);
195     exit(1);
196     }
197     memcpy(text,para->text+charnr,layout->length * sizeof(*text));
198     text[layout->length] = 0;
199     characters(config,list,text,layout->layout,enc);
200     free(text);
201     charnr += layout->length;
202 frodo 14 }
203 frodo 192 }
204     output_simple_chars(config, list,
205     para->base_paragraph->bullet->on?"</UL>\n":"\n",enc);
206 frodo 14 }
207    
208 frodo 192 void paragraphs(const psiconv_config config, psiconv_list list,
209     psiconv_text_and_layout paragraphs, const encoding enc)
210 frodo 14 {
211 frodo 192 int i;
212     psiconv_paragraph para;
213     for (i = 0; i < psiconv_list_length(paragraphs); i++) {
214     if (!(para = psiconv_list_get(paragraphs,i))) {
215     fputs("Internal datastructure corruption\n",stderr);
216     exit(1);
217 frodo 14 }
218 frodo 192 paragraph(config,list,para,enc);
219     }
220 frodo 14 }
221    
222 frodo 192 void gen_word(const psiconv_config config, psiconv_list list,
223     const psiconv_word_f file, const encoding enc)
224 frodo 14 {
225 frodo 192 if (!file)
226     return;
227 frodo 14
228 frodo 192 header(config,list,enc);
229     paragraphs(config,list,file->paragraphs,enc);
230     footer(config,list,enc);
231 frodo 14 }
232    
233    
234 frodo 192 void gen_texted(const psiconv_config config, psiconv_list list,
235     const psiconv_texted_f file, const encoding enc)
236 frodo 14 {
237 frodo 192 header(config,list,enc);
238     paragraphs(config,list,file->texted_sec->paragraphs,enc);
239     footer(config,list,enc);
240 frodo 14 }
241    
242 frodo 192 int gen_html4(const psiconv_config config, psiconv_list list,
243     const psiconv_file file, const char *dest,
244     const encoding enc)
245 frodo 14 {
246 frodo 192 encoding enc1 = enc;
247 frodo 14
248 frodo 192 if (enc == ENCODING_PSION) {
249     fputs("Unsupported encoding\n",stderr);
250     return -1;
251     } else if (enc == ENCODING_ASCII)
252     enc1 = ENCODING_ASCII_HTML;
253 frodo 14
254 frodo 192 if (file->type == psiconv_word_file) {
255     gen_word(config,list,(psiconv_word_f) file->file,enc1);
256     return 0;
257     } else if (file->type == psiconv_texted_file) {
258     gen_texted(config,list,(psiconv_texted_f) file->file,enc1);
259     return 0;
260     } else
261     return -1;
262 frodo 14 }
263 frodo 192
264 frodo 14
265 frodo 192 static struct fileformat_s ffs[] =
266 frodo 34 {
267 frodo 192 {
268     "HTML4",
269     "HTML 4.01 Transitional, without CSS",
270     FORMAT_WORD | FORMAT_TEXTED,
271     gen_html4
272     },
273     {
274     NULL,
275     NULL,
276     0,
277     NULL
278     }
279 frodo 34 };
280    
281 frodo 192
282 frodo 34 void init_html4(void)
283     {
284 frodo 192 int i;
285     for (i = 0; ffs[i].name; i++)
286     psiconv_list_add(fileformat_list,ffs+i);
287 frodo 34 }

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