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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 192 - (show annotations)
Mon Feb 2 20:43:04 2004 UTC (20 years, 2 months 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 /* 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
19 #include "config.h"
20
21 #include <psiconv/configuration.h>
22 #include <psiconv/data.h>
23 #include "general.h"
24
25 #include <string.h>
26 #include <stdlib.h>
27
28 #ifdef DMALLOC
29 #include "dmalloc.h"
30 #endif
31
32 #define TEMPSTR_LEN 100
33
34 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
52
53 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
69 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
90 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
96
97 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
103 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
131
132 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
146 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 }
163
164 void paragraph(const psiconv_config config, psiconv_list list,
165 psiconv_paragraph para, const encoding enc)
166 {
167 int i,charnr;
168 psiconv_string_t text;
169 psiconv_in_line_layout layout;
170
171
172 output_simple_chars(config,list,
173 para->base_paragraph->bullet->on?"<UL><LI":"<P",enc);
174
175 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
182 output_simple_chars(config,list,">",enc);
183
184 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 }
203 }
204 output_simple_chars(config, list,
205 para->base_paragraph->bullet->on?"</UL>\n":"\n",enc);
206 }
207
208 void paragraphs(const psiconv_config config, psiconv_list list,
209 psiconv_text_and_layout paragraphs, const encoding enc)
210 {
211 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 }
218 paragraph(config,list,para,enc);
219 }
220 }
221
222 void gen_word(const psiconv_config config, psiconv_list list,
223 const psiconv_word_f file, const encoding enc)
224 {
225 if (!file)
226 return;
227
228 header(config,list,enc);
229 paragraphs(config,list,file->paragraphs,enc);
230 footer(config,list,enc);
231 }
232
233
234 void gen_texted(const psiconv_config config, psiconv_list list,
235 const psiconv_texted_f file, const encoding enc)
236 {
237 header(config,list,enc);
238 paragraphs(config,list,file->texted_sec->paragraphs,enc);
239 footer(config,list,enc);
240 }
241
242 int gen_html4(const psiconv_config config, psiconv_list list,
243 const psiconv_file file, const char *dest,
244 const encoding enc)
245 {
246 encoding enc1 = enc;
247
248 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
254 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 }
263
264
265 static struct fileformat_s ffs[] =
266 {
267 {
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 };
280
281
282 void init_html4(void)
283 {
284 int i;
285 for (i = 0; ffs[i].name; i++)
286 psiconv_list_add(fileformat_list,ffs+i);
287 }

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