1 /**************************************************************
2 *
3 * Licensed to the Apache Software Foundation (ASF) under one
4 * or more contributor license agreements. See the NOTICE file
5 * distributed with this work for additional information
6 * regarding copyright ownership. The ASF licenses this file
7 * to you under the Apache License, Version 2.0 (the
8 * "License"); you may not use this file except in compliance
9 * with the License. You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing,
14 * software distributed under the License is distributed on an
15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16 * KIND, either express or implied. See the License for the
17 * specific language governing permissions and limitations
18 * under the License.
19 *
20 *************************************************************/
21
22
23
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_svtools.hxx"
26
27 #include <tools/urlobj.hxx>
28 #include <svl/zformat.hxx>
29 #include <svl/macitem.hxx>
30 #include <tools/cachestr.hxx>
31 #include <vcl/svapp.hxx>
32 #include <svl/zforlist.hxx>
33
34 #include <svtools/htmlout.hxx>
35 #include <svtools/htmlkywd.hxx>
36 #include <svtools/imap.hxx>
37 #include <svtools/imaprect.hxx>
38 #include <svtools/imapcirc.hxx>
39 #include <svtools/imappoly.hxx>
40 #include "svl/urihelper.hxx"
41
42 #ifndef RTL_CONSTASCII_STRINGPARAM
43 #define RTL_CONSTASCII_STRINGPARAM( c ) c, sizeof(c)-1
44 #endif
45
46 #if defined(UNX)
47 const sal_Char HTMLOutFuncs::sNewLine = '\012';
48 #else
49 const sal_Char __FAR_DATA HTMLOutFuncs::sNewLine[] = "\015\012";
50 #endif
51
52 #define TXTCONV_BUFFER_SIZE 20
53
HTMLOutContext(rtl_TextEncoding eDestEnc)54 HTMLOutContext::HTMLOutContext( rtl_TextEncoding eDestEnc )
55 {
56 m_eDestEnc = RTL_TEXTENCODING_DONTKNOW == eDestEnc
57 ? gsl_getSystemTextEncoding()
58 : eDestEnc;
59
60 m_hConv = rtl_createUnicodeToTextConverter( eDestEnc );
61 DBG_ASSERT( m_hConv,
62 "HTMLOutContext::HTMLOutContext: no converter for source encoding" );
63 m_hContext = m_hConv ? rtl_createUnicodeToTextContext( m_hConv )
64 : (rtl_TextToUnicodeContext)1;
65 }
66
~HTMLOutContext()67 HTMLOutContext::~HTMLOutContext()
68 {
69 rtl_destroyUnicodeToTextContext( m_hConv, m_hContext );
70 rtl_destroyUnicodeToTextConverter( m_hConv );
71 }
72
lcl_svhtml_GetEntityForChar(sal_Unicode c,rtl_TextEncoding eDestEnc)73 const sal_Char *lcl_svhtml_GetEntityForChar( sal_Unicode c,
74 rtl_TextEncoding eDestEnc )
75 {
76 const sal_Char* pStr = 0;
77
78 // Note: We currently handle special cases for ISO-8859-2 here simply because
79 // the code was already submitted. But we should also handle other code pages
80 // as well as the code becomes available.
81
82 if( eDestEnc == RTL_TEXTENCODING_ISO_8859_2 || eDestEnc == RTL_TEXTENCODING_MS_1250 )
83 {
84 // Don't handle the following characters for Easter European (ISO-8859-2).
85 switch ( c )
86 {
87 case 164: // curren
88 case 184: // ccedil
89 case 193: // Aacute
90 case 194: // Acirc
91 case 196: // Auml
92 case 199: // Ccedil
93 case 201: // Eacute
94 case 203: // Euml
95 case 205: // Iacute
96 case 206: // Icirc
97 case 211: // Oacute
98 case 212: // Ocirc
99 case 214: // Ouml
100 case 215: // times
101 case 218: // Uacute
102 case 220: // Uuml
103 case 221: // Yacute
104 case 225: // aacute
105 case 226: // acirc
106 case 228: // auml
107 case 233: // eacute
108 case 235: // euml
109 case 237: // iacute
110 case 238: // icirc
111 case 243: // oacute
112 case 244: // ocirc
113 case 246: // ouml
114 case 247: // divide
115 case 250: // uacute
116 case 252: // uuml
117 case 253: // yacute
118 case 352: // Scaron
119 case 353: // scaron
120 return pStr;
121 }
122 }
123
124 // TODO: handle more special cases for other code pages.
125
126 switch( c )
127 {
128 // case '\x0a': return HTMLOutFuncs::Out_Tag( rStream, OOO_STRING_SVTOOLS_HTML_linebreak );
129
130 case '<': pStr = OOO_STRING_SVTOOLS_HTML_C_lt; break;
131 case '>': pStr = OOO_STRING_SVTOOLS_HTML_C_gt; break;
132 case '&': pStr = OOO_STRING_SVTOOLS_HTML_C_amp; break;
133 case '"': pStr = OOO_STRING_SVTOOLS_HTML_C_quot; break;
134
135 case 161: pStr = OOO_STRING_SVTOOLS_HTML_S_iexcl; break;
136 case 162: pStr = OOO_STRING_SVTOOLS_HTML_S_cent; break;
137 case 163: pStr = OOO_STRING_SVTOOLS_HTML_S_pound; break;
138 case 164: pStr = OOO_STRING_SVTOOLS_HTML_S_curren; break;
139 case 165: pStr = OOO_STRING_SVTOOLS_HTML_S_yen; break;
140 case 166: pStr = OOO_STRING_SVTOOLS_HTML_S_brvbar; break;
141 case 167: pStr = OOO_STRING_SVTOOLS_HTML_S_sect; break;
142 case 168: pStr = OOO_STRING_SVTOOLS_HTML_S_uml; break;
143 case 169: pStr = OOO_STRING_SVTOOLS_HTML_S_copy; break;
144 case 170: pStr = OOO_STRING_SVTOOLS_HTML_S_ordf; break;
145 case 171: pStr = OOO_STRING_SVTOOLS_HTML_S_laquo; break;
146 case 172: pStr = OOO_STRING_SVTOOLS_HTML_S_not; break;
147 case 174: pStr = OOO_STRING_SVTOOLS_HTML_S_reg; break;
148 case 175: pStr = OOO_STRING_SVTOOLS_HTML_S_macr; break;
149 case 176: pStr = OOO_STRING_SVTOOLS_HTML_S_deg; break;
150 case 177: pStr = OOO_STRING_SVTOOLS_HTML_S_plusmn; break;
151 case 178: pStr = OOO_STRING_SVTOOLS_HTML_S_sup2; break;
152 case 179: pStr = OOO_STRING_SVTOOLS_HTML_S_sup3; break;
153 case 180: pStr = OOO_STRING_SVTOOLS_HTML_S_acute; break;
154 case 181: pStr = OOO_STRING_SVTOOLS_HTML_S_micro; break;
155 case 182: pStr = OOO_STRING_SVTOOLS_HTML_S_para; break;
156 case 183: pStr = OOO_STRING_SVTOOLS_HTML_S_middot; break;
157 case 184: pStr = OOO_STRING_SVTOOLS_HTML_S_cedil; break;
158 case 185: pStr = OOO_STRING_SVTOOLS_HTML_S_sup1; break;
159 case 186: pStr = OOO_STRING_SVTOOLS_HTML_S_ordm; break;
160 case 187: pStr = OOO_STRING_SVTOOLS_HTML_S_raquo; break;
161 case 188: pStr = OOO_STRING_SVTOOLS_HTML_S_frac14; break;
162 case 189: pStr = OOO_STRING_SVTOOLS_HTML_S_frac12; break;
163 case 190: pStr = OOO_STRING_SVTOOLS_HTML_S_frac34; break;
164 case 191: pStr = OOO_STRING_SVTOOLS_HTML_S_iquest; break;
165
166 case 192: pStr = OOO_STRING_SVTOOLS_HTML_C_Agrave; break;
167 case 193: pStr = OOO_STRING_SVTOOLS_HTML_C_Aacute; break;
168 case 194: pStr = OOO_STRING_SVTOOLS_HTML_C_Acirc; break;
169 case 195: pStr = OOO_STRING_SVTOOLS_HTML_C_Atilde; break;
170 case 196: pStr = OOO_STRING_SVTOOLS_HTML_C_Auml; break;
171 case 197: pStr = OOO_STRING_SVTOOLS_HTML_C_Aring; break;
172 case 198: pStr = OOO_STRING_SVTOOLS_HTML_C_AElig; break;
173 case 199: pStr = OOO_STRING_SVTOOLS_HTML_C_Ccedil; break;
174 case 200: pStr = OOO_STRING_SVTOOLS_HTML_C_Egrave; break;
175 case 201: pStr = OOO_STRING_SVTOOLS_HTML_C_Eacute; break;
176 case 202: pStr = OOO_STRING_SVTOOLS_HTML_C_Ecirc; break;
177 case 203: pStr = OOO_STRING_SVTOOLS_HTML_C_Euml; break;
178 case 204: pStr = OOO_STRING_SVTOOLS_HTML_C_Igrave; break;
179 case 205: pStr = OOO_STRING_SVTOOLS_HTML_C_Iacute; break;
180 case 206: pStr = OOO_STRING_SVTOOLS_HTML_C_Icirc; break;
181 case 207: pStr = OOO_STRING_SVTOOLS_HTML_C_Iuml; break;
182 case 208: pStr = OOO_STRING_SVTOOLS_HTML_C_ETH; break;
183 case 209: pStr = OOO_STRING_SVTOOLS_HTML_C_Ntilde; break;
184 case 210: pStr = OOO_STRING_SVTOOLS_HTML_C_Ograve; break;
185 case 211: pStr = OOO_STRING_SVTOOLS_HTML_C_Oacute; break;
186 case 212: pStr = OOO_STRING_SVTOOLS_HTML_C_Ocirc; break;
187 case 213: pStr = OOO_STRING_SVTOOLS_HTML_C_Otilde; break;
188 case 214: pStr = OOO_STRING_SVTOOLS_HTML_C_Ouml; break;
189 case 215: pStr = OOO_STRING_SVTOOLS_HTML_S_times; break;
190 case 216: pStr = OOO_STRING_SVTOOLS_HTML_C_Oslash; break;
191 case 217: pStr = OOO_STRING_SVTOOLS_HTML_C_Ugrave; break;
192 case 218: pStr = OOO_STRING_SVTOOLS_HTML_C_Uacute; break;
193 case 219: pStr = OOO_STRING_SVTOOLS_HTML_C_Ucirc; break;
194 case 220: pStr = OOO_STRING_SVTOOLS_HTML_C_Uuml; break;
195 case 221: pStr = OOO_STRING_SVTOOLS_HTML_C_Yacute; break;
196
197 case 222: pStr = OOO_STRING_SVTOOLS_HTML_C_THORN; break;
198 case 223: pStr = OOO_STRING_SVTOOLS_HTML_C_szlig; break;
199
200 case 224: pStr = OOO_STRING_SVTOOLS_HTML_S_agrave; break;
201 case 225: pStr = OOO_STRING_SVTOOLS_HTML_S_aacute; break;
202 case 226: pStr = OOO_STRING_SVTOOLS_HTML_S_acirc; break;
203 case 227: pStr = OOO_STRING_SVTOOLS_HTML_S_atilde; break;
204 case 228: pStr = OOO_STRING_SVTOOLS_HTML_S_auml; break;
205 case 229: pStr = OOO_STRING_SVTOOLS_HTML_S_aring; break;
206 case 230: pStr = OOO_STRING_SVTOOLS_HTML_S_aelig; break;
207 case 231: pStr = OOO_STRING_SVTOOLS_HTML_S_ccedil; break;
208 case 232: pStr = OOO_STRING_SVTOOLS_HTML_S_egrave; break;
209 case 233: pStr = OOO_STRING_SVTOOLS_HTML_S_eacute; break;
210 case 234: pStr = OOO_STRING_SVTOOLS_HTML_S_ecirc; break;
211 case 235: pStr = OOO_STRING_SVTOOLS_HTML_S_euml; break;
212 case 236: pStr = OOO_STRING_SVTOOLS_HTML_S_igrave; break;
213 case 237: pStr = OOO_STRING_SVTOOLS_HTML_S_iacute; break;
214 case 238: pStr = OOO_STRING_SVTOOLS_HTML_S_icirc; break;
215 case 239: pStr = OOO_STRING_SVTOOLS_HTML_S_iuml; break;
216 case 240: pStr = OOO_STRING_SVTOOLS_HTML_S_eth; break;
217 case 241: pStr = OOO_STRING_SVTOOLS_HTML_S_ntilde; break;
218 case 242: pStr = OOO_STRING_SVTOOLS_HTML_S_ograve; break;
219 case 243: pStr = OOO_STRING_SVTOOLS_HTML_S_oacute; break;
220 case 244: pStr = OOO_STRING_SVTOOLS_HTML_S_ocirc; break;
221 case 245: pStr = OOO_STRING_SVTOOLS_HTML_S_otilde; break;
222 case 246: pStr = OOO_STRING_SVTOOLS_HTML_S_ouml; break;
223 case 247: pStr = OOO_STRING_SVTOOLS_HTML_S_divide; break;
224 case 248: pStr = OOO_STRING_SVTOOLS_HTML_S_oslash; break;
225 case 249: pStr = OOO_STRING_SVTOOLS_HTML_S_ugrave; break;
226 case 250: pStr = OOO_STRING_SVTOOLS_HTML_S_uacute; break;
227 case 251: pStr = OOO_STRING_SVTOOLS_HTML_S_ucirc; break;
228 case 252: pStr = OOO_STRING_SVTOOLS_HTML_S_uuml; break;
229 case 253: pStr = OOO_STRING_SVTOOLS_HTML_S_yacute; break;
230 case 254: pStr = OOO_STRING_SVTOOLS_HTML_S_thorn; break;
231 case 255: pStr = OOO_STRING_SVTOOLS_HTML_S_yuml; break;
232
233 case 338: pStr = OOO_STRING_SVTOOLS_HTML_S_OElig; break;
234 case 339: pStr = OOO_STRING_SVTOOLS_HTML_S_oelig; break;
235 case 352: pStr = OOO_STRING_SVTOOLS_HTML_S_Scaron; break;
236 case 353: pStr = OOO_STRING_SVTOOLS_HTML_S_scaron; break;
237 case 376: pStr = OOO_STRING_SVTOOLS_HTML_S_Yuml; break;
238 case 402: pStr = OOO_STRING_SVTOOLS_HTML_S_fnof; break;
239 case 710: pStr = OOO_STRING_SVTOOLS_HTML_S_circ; break;
240 case 732: pStr = OOO_STRING_SVTOOLS_HTML_S_tilde; break;
241
242 // Greek chars are handled later,
243 // since they should *not* be transformed to entities
244 // when generating Greek text (== using Greek encoding)
245
246 case 8194: pStr = OOO_STRING_SVTOOLS_HTML_S_ensp; break;
247 case 8195: pStr = OOO_STRING_SVTOOLS_HTML_S_emsp; break;
248 case 8201: pStr = OOO_STRING_SVTOOLS_HTML_S_thinsp; break;
249 case 8204: pStr = OOO_STRING_SVTOOLS_HTML_S_zwnj; break;
250 case 8205: pStr = OOO_STRING_SVTOOLS_HTML_S_zwj; break;
251 case 8206: pStr = OOO_STRING_SVTOOLS_HTML_S_lrm; break;
252 case 8207: pStr = OOO_STRING_SVTOOLS_HTML_S_rlm; break;
253 case 8211: pStr = OOO_STRING_SVTOOLS_HTML_S_ndash; break;
254 case 8212: pStr = OOO_STRING_SVTOOLS_HTML_S_mdash; break;
255 case 8216: pStr = OOO_STRING_SVTOOLS_HTML_S_lsquo; break;
256 case 8217: pStr = OOO_STRING_SVTOOLS_HTML_S_rsquo; break;
257 case 8218: pStr = OOO_STRING_SVTOOLS_HTML_S_sbquo; break;
258 case 8220: pStr = OOO_STRING_SVTOOLS_HTML_S_ldquo; break;
259 case 8221: pStr = OOO_STRING_SVTOOLS_HTML_S_rdquo; break;
260 case 8222: pStr = OOO_STRING_SVTOOLS_HTML_S_bdquo; break;
261 case 8224: pStr = OOO_STRING_SVTOOLS_HTML_S_dagger; break;
262 case 8225: pStr = OOO_STRING_SVTOOLS_HTML_S_Dagger; break;
263 case 8226: pStr = OOO_STRING_SVTOOLS_HTML_S_bull; break;
264 case 8230: pStr = OOO_STRING_SVTOOLS_HTML_S_hellip; break;
265 case 8240: pStr = OOO_STRING_SVTOOLS_HTML_S_permil; break;
266 case 8242: pStr = OOO_STRING_SVTOOLS_HTML_S_prime; break;
267 case 8243: pStr = OOO_STRING_SVTOOLS_HTML_S_Prime; break;
268 case 8249: pStr = OOO_STRING_SVTOOLS_HTML_S_lsaquo; break;
269 case 8250: pStr = OOO_STRING_SVTOOLS_HTML_S_rsaquo; break;
270 case 8254: pStr = OOO_STRING_SVTOOLS_HTML_S_oline; break;
271 case 8260: pStr = OOO_STRING_SVTOOLS_HTML_S_frasl; break;
272 case 8364: pStr = OOO_STRING_SVTOOLS_HTML_S_euro; break;
273 case 8465: pStr = OOO_STRING_SVTOOLS_HTML_S_image; break;
274 case 8472: pStr = OOO_STRING_SVTOOLS_HTML_S_weierp; break;
275 case 8476: pStr = OOO_STRING_SVTOOLS_HTML_S_real; break;
276 case 8482: pStr = OOO_STRING_SVTOOLS_HTML_S_trade; break;
277 case 8501: pStr = OOO_STRING_SVTOOLS_HTML_S_alefsym; break;
278 case 8592: pStr = OOO_STRING_SVTOOLS_HTML_S_larr; break;
279 case 8593: pStr = OOO_STRING_SVTOOLS_HTML_S_uarr; break;
280 case 8594: pStr = OOO_STRING_SVTOOLS_HTML_S_rarr; break;
281 case 8595: pStr = OOO_STRING_SVTOOLS_HTML_S_darr; break;
282 case 8596: pStr = OOO_STRING_SVTOOLS_HTML_S_harr; break;
283 case 8629: pStr = OOO_STRING_SVTOOLS_HTML_S_crarr; break;
284 case 8656: pStr = OOO_STRING_SVTOOLS_HTML_S_lArr; break;
285 case 8657: pStr = OOO_STRING_SVTOOLS_HTML_S_uArr; break;
286 case 8658: pStr = OOO_STRING_SVTOOLS_HTML_S_rArr; break;
287 case 8659: pStr = OOO_STRING_SVTOOLS_HTML_S_dArr; break;
288 case 8660: pStr = OOO_STRING_SVTOOLS_HTML_S_hArr; break;
289 case 8704: pStr = OOO_STRING_SVTOOLS_HTML_S_forall; break;
290 case 8706: pStr = OOO_STRING_SVTOOLS_HTML_S_part; break;
291 case 8707: pStr = OOO_STRING_SVTOOLS_HTML_S_exist; break;
292 case 8709: pStr = OOO_STRING_SVTOOLS_HTML_S_empty; break;
293 case 8711: pStr = OOO_STRING_SVTOOLS_HTML_S_nabla; break;
294 case 8712: pStr = OOO_STRING_SVTOOLS_HTML_S_isin; break;
295 case 8713: pStr = OOO_STRING_SVTOOLS_HTML_S_notin; break;
296 case 8715: pStr = OOO_STRING_SVTOOLS_HTML_S_ni; break;
297 case 8719: pStr = OOO_STRING_SVTOOLS_HTML_S_prod; break;
298 case 8721: pStr = OOO_STRING_SVTOOLS_HTML_S_sum; break;
299 case 8722: pStr = OOO_STRING_SVTOOLS_HTML_S_minus; break;
300 case 8727: pStr = OOO_STRING_SVTOOLS_HTML_S_lowast; break;
301 case 8730: pStr = OOO_STRING_SVTOOLS_HTML_S_radic; break;
302 case 8733: pStr = OOO_STRING_SVTOOLS_HTML_S_prop; break;
303 case 8734: pStr = OOO_STRING_SVTOOLS_HTML_S_infin; break;
304 case 8736: pStr = OOO_STRING_SVTOOLS_HTML_S_ang; break;
305 case 8743: pStr = OOO_STRING_SVTOOLS_HTML_S_and; break;
306 case 8744: pStr = OOO_STRING_SVTOOLS_HTML_S_or; break;
307 case 8745: pStr = OOO_STRING_SVTOOLS_HTML_S_cap; break;
308 case 8746: pStr = OOO_STRING_SVTOOLS_HTML_S_cup; break;
309 case 8747: pStr = OOO_STRING_SVTOOLS_HTML_S_int; break;
310 case 8756: pStr = OOO_STRING_SVTOOLS_HTML_S_there4; break;
311 case 8764: pStr = OOO_STRING_SVTOOLS_HTML_S_sim; break;
312 case 8773: pStr = OOO_STRING_SVTOOLS_HTML_S_cong; break;
313 case 8776: pStr = OOO_STRING_SVTOOLS_HTML_S_asymp; break;
314 case 8800: pStr = OOO_STRING_SVTOOLS_HTML_S_ne; break;
315 case 8801: pStr = OOO_STRING_SVTOOLS_HTML_S_equiv; break;
316 case 8804: pStr = OOO_STRING_SVTOOLS_HTML_S_le; break;
317 case 8805: pStr = OOO_STRING_SVTOOLS_HTML_S_ge; break;
318 case 8834: pStr = OOO_STRING_SVTOOLS_HTML_S_sub; break;
319 case 8835: pStr = OOO_STRING_SVTOOLS_HTML_S_sup; break;
320 case 8836: pStr = OOO_STRING_SVTOOLS_HTML_S_nsub; break;
321 case 8838: pStr = OOO_STRING_SVTOOLS_HTML_S_sube; break;
322 case 8839: pStr = OOO_STRING_SVTOOLS_HTML_S_supe; break;
323 case 8853: pStr = OOO_STRING_SVTOOLS_HTML_S_oplus; break;
324 case 8855: pStr = OOO_STRING_SVTOOLS_HTML_S_otimes; break;
325 case 8869: pStr = OOO_STRING_SVTOOLS_HTML_S_perp; break;
326 case 8901: pStr = OOO_STRING_SVTOOLS_HTML_S_sdot; break;
327 case 8968: pStr = OOO_STRING_SVTOOLS_HTML_S_lceil; break;
328 case 8969: pStr = OOO_STRING_SVTOOLS_HTML_S_rceil; break;
329 case 8970: pStr = OOO_STRING_SVTOOLS_HTML_S_lfloor; break;
330 case 8971: pStr = OOO_STRING_SVTOOLS_HTML_S_rfloor; break;
331 case 9001: pStr = OOO_STRING_SVTOOLS_HTML_S_lang; break;
332 case 9002: pStr = OOO_STRING_SVTOOLS_HTML_S_rang; break;
333 case 9674: pStr = OOO_STRING_SVTOOLS_HTML_S_loz; break;
334 case 9824: pStr = OOO_STRING_SVTOOLS_HTML_S_spades; break;
335 case 9827: pStr = OOO_STRING_SVTOOLS_HTML_S_clubs; break;
336 case 9829: pStr = OOO_STRING_SVTOOLS_HTML_S_hearts; break;
337 case 9830: pStr = OOO_STRING_SVTOOLS_HTML_S_diams; break;
338 }
339
340 // Greek chars: if we do not produce a Greek encoding,
341 // transform them into entities
342 if( !pStr &&
343 ( eDestEnc != RTL_TEXTENCODING_ISO_8859_7 ) &&
344 ( eDestEnc != RTL_TEXTENCODING_MS_1253 ) )
345 {
346 switch( c )
347 {
348 case 913: pStr = OOO_STRING_SVTOOLS_HTML_S_Alpha; break;
349 case 914: pStr = OOO_STRING_SVTOOLS_HTML_S_Beta; break;
350 case 915: pStr = OOO_STRING_SVTOOLS_HTML_S_Gamma; break;
351 case 916: pStr = OOO_STRING_SVTOOLS_HTML_S_Delta; break;
352 case 917: pStr = OOO_STRING_SVTOOLS_HTML_S_Epsilon; break;
353 case 918: pStr = OOO_STRING_SVTOOLS_HTML_S_Zeta; break;
354 case 919: pStr = OOO_STRING_SVTOOLS_HTML_S_Eta; break;
355 case 920: pStr = OOO_STRING_SVTOOLS_HTML_S_Theta; break;
356 case 921: pStr = OOO_STRING_SVTOOLS_HTML_S_Iota; break;
357 case 922: pStr = OOO_STRING_SVTOOLS_HTML_S_Kappa; break;
358 case 923: pStr = OOO_STRING_SVTOOLS_HTML_S_Lambda; break;
359 case 924: pStr = OOO_STRING_SVTOOLS_HTML_S_Mu; break;
360 case 925: pStr = OOO_STRING_SVTOOLS_HTML_S_Nu; break;
361 case 926: pStr = OOO_STRING_SVTOOLS_HTML_S_Xi; break;
362 case 927: pStr = OOO_STRING_SVTOOLS_HTML_S_Omicron; break;
363 case 928: pStr = OOO_STRING_SVTOOLS_HTML_S_Pi; break;
364 case 929: pStr = OOO_STRING_SVTOOLS_HTML_S_Rho; break;
365 case 931: pStr = OOO_STRING_SVTOOLS_HTML_S_Sigma; break;
366 case 932: pStr = OOO_STRING_SVTOOLS_HTML_S_Tau; break;
367 case 933: pStr = OOO_STRING_SVTOOLS_HTML_S_Upsilon; break;
368 case 934: pStr = OOO_STRING_SVTOOLS_HTML_S_Phi; break;
369 case 935: pStr = OOO_STRING_SVTOOLS_HTML_S_Chi; break;
370 case 936: pStr = OOO_STRING_SVTOOLS_HTML_S_Psi; break;
371 case 937: pStr = OOO_STRING_SVTOOLS_HTML_S_Omega; break;
372 case 945: pStr = OOO_STRING_SVTOOLS_HTML_S_alpha; break;
373 case 946: pStr = OOO_STRING_SVTOOLS_HTML_S_beta; break;
374 case 947: pStr = OOO_STRING_SVTOOLS_HTML_S_gamma; break;
375 case 948: pStr = OOO_STRING_SVTOOLS_HTML_S_delta; break;
376 case 949: pStr = OOO_STRING_SVTOOLS_HTML_S_epsilon; break;
377 case 950: pStr = OOO_STRING_SVTOOLS_HTML_S_zeta; break;
378 case 951: pStr = OOO_STRING_SVTOOLS_HTML_S_eta; break;
379 case 952: pStr = OOO_STRING_SVTOOLS_HTML_S_theta; break;
380 case 953: pStr = OOO_STRING_SVTOOLS_HTML_S_iota; break;
381 case 954: pStr = OOO_STRING_SVTOOLS_HTML_S_kappa; break;
382 case 955: pStr = OOO_STRING_SVTOOLS_HTML_S_lambda; break;
383 case 956: pStr = OOO_STRING_SVTOOLS_HTML_S_mu; break;
384 case 957: pStr = OOO_STRING_SVTOOLS_HTML_S_nu; break;
385 case 958: pStr = OOO_STRING_SVTOOLS_HTML_S_xi; break;
386 case 959: pStr = OOO_STRING_SVTOOLS_HTML_S_omicron; break;
387 case 960: pStr = OOO_STRING_SVTOOLS_HTML_S_pi; break;
388 case 961: pStr = OOO_STRING_SVTOOLS_HTML_S_rho; break;
389 case 962: pStr = OOO_STRING_SVTOOLS_HTML_S_sigmaf; break;
390 case 963: pStr = OOO_STRING_SVTOOLS_HTML_S_sigma; break;
391 case 964: pStr = OOO_STRING_SVTOOLS_HTML_S_tau; break;
392 case 965: pStr = OOO_STRING_SVTOOLS_HTML_S_upsilon; break;
393 case 966: pStr = OOO_STRING_SVTOOLS_HTML_S_phi; break;
394 case 967: pStr = OOO_STRING_SVTOOLS_HTML_S_chi; break;
395 case 968: pStr = OOO_STRING_SVTOOLS_HTML_S_psi; break;
396 case 969: pStr = OOO_STRING_SVTOOLS_HTML_S_omega; break;
397 case 977: pStr = OOO_STRING_SVTOOLS_HTML_S_thetasym;break;
398 case 978: pStr = OOO_STRING_SVTOOLS_HTML_S_upsih; break;
399 case 982: pStr = OOO_STRING_SVTOOLS_HTML_S_piv; break;
400 }
401 }
402
403 return pStr;
404 }
405
lcl_ConvertCharToHTML(sal_Unicode c,ByteString & rDest,HTMLOutContext & rContext,String * pNonConvertableChars)406 void lcl_ConvertCharToHTML( sal_Unicode c, ByteString& rDest,
407 HTMLOutContext& rContext,
408 String *pNonConvertableChars )
409 {
410 DBG_ASSERT( RTL_TEXTENCODING_DONTKNOW != rContext.m_eDestEnc,
411 "wrong destination encoding" );
412 const sal_Char *pStr = 0;
413 switch( c )
414 {
415 case 0xA0: // is a hard blank
416 //!! the TextConverter has a problem with this character - so change it to
417 // a hard space - that's the same as our 5.2
418 case 0x2011: // is a hard hyphen
419 pStr = OOO_STRING_SVTOOLS_HTML_S_nbsp;
420 break;
421 case 0xAD: // is a soft hyphen
422 pStr = OOO_STRING_SVTOOLS_HTML_S_shy;
423 break;
424 default:
425 // There may be an entity for the character.
426 // The new HTML4 entities above 255 are not used for UTF-8,
427 // because Netscape 4 does support UTF-8 but does not support
428 // these entities.
429 if( c < 128 || RTL_TEXTENCODING_UTF8 != rContext.m_eDestEnc )
430 pStr = lcl_svhtml_GetEntityForChar( c, rContext.m_eDestEnc );
431 break;
432 }
433
434 sal_Char cBuffer[TXTCONV_BUFFER_SIZE];
435 sal_uInt32 nInfo = 0;
436 sal_Size nSrcChars;
437 const sal_uInt32 nFlags = RTL_UNICODETOTEXT_FLAGS_NONSPACING_IGNORE|
438 RTL_UNICODETOTEXT_FLAGS_CONTROL_IGNORE|
439 RTL_UNICODETOTEXT_FLAGS_UNDEFINED_ERROR|
440 RTL_UNICODETOTEXT_FLAGS_INVALID_ERROR;
441 if( pStr )
442 {
443 sal_Size nLen = rtl_convertUnicodeToText(
444 rContext.m_hConv, rContext.m_hContext, &c, 0,
445 cBuffer, TXTCONV_BUFFER_SIZE,
446 nFlags|RTL_UNICODETOTEXT_FLAGS_FLUSH,
447 &nInfo, &nSrcChars );
448 DBG_ASSERT( (nInfo & (RTL_UNICODETOTEXT_INFO_ERROR|RTL_UNICODETOTEXT_INFO_DESTBUFFERTOSMALL)) == 0, "HTMLOut: error while flushing" );
449 sal_Char *pBuffer = cBuffer;
450 while( nLen-- )
451 rDest += *pBuffer++;
452 ((rDest += '&') += pStr) += ';';
453 }
454 else
455 {
456 sal_Size nLen = rtl_convertUnicodeToText( rContext.m_hConv,
457 rContext.m_hContext, &c, 1,
458 cBuffer, TXTCONV_BUFFER_SIZE,
459 nFlags,
460 &nInfo, &nSrcChars );
461 if( nLen > 0 && (nInfo & (RTL_UNICODETOTEXT_INFO_ERROR|RTL_UNICODETOTEXT_INFO_DESTBUFFERTOSMALL)) == 0 )
462 {
463 sal_Char *pBuffer = cBuffer;
464 while( nLen-- )
465 rDest += *pBuffer++;
466 }
467 else
468 {
469 // If the character could not be converted to the destination
470 // character set, the UNICODE character is exported as character
471 // entity.
472 nLen = rtl_convertUnicodeToText(
473 rContext.m_hConv, rContext.m_hContext, &c, 0,
474 cBuffer, TXTCONV_BUFFER_SIZE,
475 nFlags|RTL_UNICODETOTEXT_FLAGS_FLUSH,
476 &nInfo, &nSrcChars );
477 DBG_ASSERT( (nInfo & (RTL_UNICODETOTEXT_INFO_ERROR|RTL_UNICODETOTEXT_INFO_DESTBUFFERTOSMALL)) == 0, "HTMLOut: error while flushing" );
478 sal_Char *pBuffer = cBuffer;
479 while( nLen-- )
480 rDest += *pBuffer++;
481
482 (((rDest += '&') += '#') +=
483 ByteString::CreateFromInt64( (sal_uInt32)c )) += ';';
484 if( pNonConvertableChars &&
485 STRING_NOTFOUND == pNonConvertableChars->Search( c ) )
486 pNonConvertableChars->Append( c );
487 }
488 }
489 }
490
lcl_FlushToAscii(ByteString & rDest,HTMLOutContext & rContext)491 sal_Bool lcl_FlushToAscii( ByteString& rDest, HTMLOutContext& rContext )
492 {
493 sal_Unicode c = 0;
494 sal_Char cBuffer[TXTCONV_BUFFER_SIZE];
495 sal_uInt32 nInfo = 0;
496 sal_Size nSrcChars;
497 const sal_uInt32 nFlags = RTL_UNICODETOTEXT_FLAGS_NONSPACING_IGNORE|
498 RTL_UNICODETOTEXT_FLAGS_CONTROL_IGNORE|
499 RTL_UNICODETOTEXT_FLAGS_UNDEFINED_ERROR|
500 RTL_UNICODETOTEXT_FLAGS_FLUSH|
501 RTL_UNICODETOTEXT_FLAGS_INVALID_ERROR;
502 sal_Size nLen = rtl_convertUnicodeToText(
503 rContext.m_hConv, rContext.m_hContext, &c, 0,
504 cBuffer, TXTCONV_BUFFER_SIZE, nFlags,
505 &nInfo, &nSrcChars );
506 DBG_ASSERT( (nInfo & (RTL_UNICODETOTEXT_INFO_ERROR|RTL_UNICODETOTEXT_INFO_DESTBUFFERTOSMALL)) == 0, "HTMLOut: error while flushing" );
507 sal_Bool bRet = nLen > 0;
508 sal_Char *pBuffer = cBuffer;
509 while( nLen-- )
510 rDest += *pBuffer++;
511 return bRet;
512 }
513
ConvertStringToHTML(const String & rSrc,ByteString & rDest,rtl_TextEncoding eDestEnc,String * pNonConvertableChars)514 void HTMLOutFuncs::ConvertStringToHTML( const String& rSrc,
515 ByteString& rDest,
516 rtl_TextEncoding eDestEnc,
517 String *pNonConvertableChars )
518 {
519 HTMLOutContext aContext( eDestEnc );
520 for( sal_uInt32 i=0UL, nLen = rSrc.Len(); i < nLen; i++ )
521 lcl_ConvertCharToHTML( rSrc.GetChar( (xub_StrLen)i ), rDest, aContext,
522 pNonConvertableChars );
523 lcl_FlushToAscii( rDest, aContext );
524 }
525
Out_AsciiTag(SvStream & rStream,const sal_Char * pStr,sal_Bool bOn,rtl_TextEncoding)526 SvStream& HTMLOutFuncs::Out_AsciiTag( SvStream& rStream, const sal_Char *pStr,
527 sal_Bool bOn, rtl_TextEncoding )
528 {
529 sal_Char sStt[3] = "</";
530 if( bOn )
531 sStt[1] = 0;
532 return (rStream << sStt << pStr << '>');
533 }
534
Out_Char(SvStream & rStream,sal_Unicode c,HTMLOutContext & rContext,String * pNonConvertableChars)535 SvStream& HTMLOutFuncs::Out_Char( SvStream& rStream, sal_Unicode c,
536 HTMLOutContext& rContext,
537 String *pNonConvertableChars )
538 {
539 ByteString sOut;
540 lcl_ConvertCharToHTML( c, sOut, rContext, pNonConvertableChars );
541 rStream << sOut.GetBuffer();
542 return rStream;
543 }
544
Out_String(SvStream & rStream,const String & rStr,rtl_TextEncoding eDestEnc,String * pNonConvertableChars)545 SvStream& HTMLOutFuncs::Out_String( SvStream& rStream, const String& rStr,
546 rtl_TextEncoding eDestEnc,
547 String *pNonConvertableChars )
548 {
549 HTMLOutContext aContext( eDestEnc );
550 xub_StrLen nLen = rStr.Len();
551 for( xub_StrLen n = 0; n < nLen; n++ )
552 HTMLOutFuncs::Out_Char( rStream, rStr.GetChar( (xub_StrLen)n ),
553 aContext, pNonConvertableChars );
554 HTMLOutFuncs::FlushToAscii( rStream, aContext );
555 return rStream;
556 }
557
FlushToAscii(SvStream & rStream,HTMLOutContext & rContext)558 SvStream& HTMLOutFuncs::FlushToAscii( SvStream& rStream,
559 HTMLOutContext& rContext )
560 {
561 ByteString sOut;
562 if( lcl_FlushToAscii( sOut, rContext ) )
563 rStream << sOut.GetBuffer();
564
565 return rStream;
566 }
567
Out_Hex(SvStream & rStream,sal_uLong nHex,sal_uInt8 nLen,rtl_TextEncoding)568 SvStream& HTMLOutFuncs::Out_Hex( SvStream& rStream, sal_uLong nHex, sal_uInt8 nLen,
569 rtl_TextEncoding )
570 { // in einen Stream aus
571 sal_Char aNToABuf[] = "0000000000000000";
572
573 DBG_ASSERT( nLen < sizeof(aNToABuf), "zu viele Stellen" );
574 if( nLen>=sizeof(aNToABuf) )
575 nLen = (sizeof(aNToABuf)-1);
576
577 // Pointer an das Bufferende setzen
578 sal_Char *pStr = aNToABuf + (sizeof(aNToABuf)-1);
579 for( sal_uInt8 n = 0; n < nLen; ++n )
580 {
581 *(--pStr) = (sal_Char)(nHex & 0xf ) + 48;
582 if( *pStr > '9' )
583 *pStr += 39;
584 nHex >>= 4;
585 }
586 return rStream << pStr;
587 }
588
589
Out_Color(SvStream & rStream,const Color & rColor,rtl_TextEncoding)590 SvStream& HTMLOutFuncs::Out_Color( SvStream& rStream, const Color& rColor,
591 rtl_TextEncoding )
592 {
593 rStream << "\"#";
594 if( rColor.GetColor() == COL_AUTO )
595 {
596 rStream << "000000";
597 }
598 else
599 {
600 Out_Hex( rStream, rColor.GetRed(), 2 );
601 Out_Hex( rStream, rColor.GetGreen(), 2 );
602 Out_Hex( rStream, rColor.GetBlue(), 2 );
603 }
604 rStream << '\"';
605
606 return rStream;
607 }
608
Out_ImageMap(SvStream & rStream,const String & rBaseURL,const ImageMap & rIMap,const String & rName,const HTMLOutEvent * pEventTable,sal_Bool bOutStarBasic,const sal_Char * pDelim,const sal_Char * pIndentArea,const sal_Char * pIndentMap,rtl_TextEncoding eDestEnc,String * pNonConvertableChars)609 SvStream& HTMLOutFuncs::Out_ImageMap( SvStream& rStream,
610 const String& rBaseURL,
611 const ImageMap& rIMap,
612 const String& rName,
613 const HTMLOutEvent *pEventTable,
614 sal_Bool bOutStarBasic,
615 const sal_Char *pDelim,
616 const sal_Char *pIndentArea,
617 const sal_Char *pIndentMap,
618 rtl_TextEncoding eDestEnc,
619 String *pNonConvertableChars )
620 {
621 if( RTL_TEXTENCODING_DONTKNOW == eDestEnc )
622 eDestEnc = gsl_getSystemTextEncoding();
623
624 const String& rOutName = rName.Len() ? rName : rIMap.GetName();
625 DBG_ASSERT( rOutName.Len(), "Kein ImageMap-Name" );
626 if( !rOutName.Len() )
627 return rStream;
628
629 ByteString sOut( '<' );
630 sOut.Append( RTL_CONSTASCII_STRINGPARAM(OOO_STRING_SVTOOLS_HTML_map ) );
631 sOut.Append( ' ' );
632 sOut.Append( RTL_CONSTASCII_STRINGPARAM(OOO_STRING_SVTOOLS_HTML_O_name) );
633 sOut.Append( RTL_CONSTASCII_STRINGPARAM("=\"") );
634 rStream << sOut.GetBuffer();
635 sOut.Erase();
636 Out_String( rStream, rOutName, eDestEnc, pNonConvertableChars );
637 rStream << "\">";
638
639 for( sal_uInt16 i=0U; i<rIMap.GetIMapObjectCount(); i++ )
640 {
641 const IMapObject* pObj = rIMap.GetIMapObject( i );
642 DBG_ASSERT( pObj, "Wo ist das ImageMap-Object?" );
643
644 if( pObj )
645 {
646 const sal_Char *pShape = 0;
647 ByteString aCoords;
648 switch( pObj->GetType() )
649 {
650 case( IMAP_OBJ_RECTANGLE ):
651 {
652 const IMapRectangleObject* pRectObj =
653 (const IMapRectangleObject *)pObj;
654 pShape = OOO_STRING_SVTOOLS_HTML_SH_rect;
655 Rectangle aRect( pRectObj->GetRectangle() );
656 ((((((aCoords =
657 ByteString::CreateFromInt32(aRect.Left())) += ',')
658 += ByteString::CreateFromInt32(aRect.Top())) += ',')
659 += ByteString::CreateFromInt32(aRect.Right())) += ',')
660 += ByteString::CreateFromInt32(aRect.Bottom());
661 }
662 break;
663 case( IMAP_OBJ_CIRCLE ):
664 {
665 const IMapCircleObject* pCirc =
666 (const IMapCircleObject *)pObj;
667 pShape= OOO_STRING_SVTOOLS_HTML_SH_circ;
668 Point aCenter( pCirc->GetCenter() );
669 long nOff = pCirc->GetRadius();
670 ((((aCoords =
671 ByteString::CreateFromInt32(aCenter.X())) += ',')
672 += ByteString::CreateFromInt32(aCenter.Y())) += ',')
673 += ByteString::CreateFromInt32(nOff);
674 }
675 break;
676 case( IMAP_OBJ_POLYGON ):
677 {
678 const IMapPolygonObject* pPolyObj =
679 (const IMapPolygonObject *)pObj;
680 pShape= OOO_STRING_SVTOOLS_HTML_SH_poly;
681 Polygon aPoly( pPolyObj->GetPolygon() );
682 sal_uInt16 nCount = aPoly.GetSize();
683 if( nCount>0 )
684 {
685 const Point& rPoint = aPoly[0];
686 ((aCoords =
687 ByteString::CreateFromInt32(rPoint.X())) += ',')
688 += ByteString::CreateFromInt32(rPoint.Y());
689 }
690 for( sal_uInt16 j=1; j<nCount; j++ )
691 {
692 const Point& rPoint = aPoly[j];
693 (((aCoords += ',')
694 += ByteString::CreateFromInt32(rPoint.X())) += ',')
695 += ByteString::CreateFromInt32(rPoint.Y());
696 }
697 }
698 break;
699 default:
700 DBG_ASSERT( pShape, "unbekanntes IMapObject" );
701 break;
702 }
703
704 if( pShape )
705 {
706 if( pDelim )
707 rStream << pDelim;
708 if( pIndentArea )
709 rStream << pIndentArea;
710
711 ((((((((((sOut = '<') += OOO_STRING_SVTOOLS_HTML_area) += ' ')
712 += OOO_STRING_SVTOOLS_HTML_O_shape) += '=') += pShape) += ' ')
713 += OOO_STRING_SVTOOLS_HTML_O_coords) += "=\"") += aCoords) += "\" ";
714 rStream << sOut.GetBuffer();
715
716 String aURL( pObj->GetURL() );
717 if( aURL.Len() && pObj->IsActive() )
718 {
719 aURL = URIHelper::simpleNormalizedMakeRelative(
720 rBaseURL, aURL );
721 (sOut = OOO_STRING_SVTOOLS_HTML_O_href) += "=\"";
722 rStream << sOut.GetBuffer();
723 Out_String( rStream, aURL, eDestEnc, pNonConvertableChars ) << '\"';
724 }
725 else
726 rStream << OOO_STRING_SVTOOLS_HTML_O_nohref;
727
728 const String& rObjName = pObj->GetName();
729 if( rObjName.Len() )
730 {
731 ((sOut = ' ') += OOO_STRING_SVTOOLS_HTML_O_name) += "=\"";
732 rStream << sOut.GetBuffer();
733 Out_String( rStream, rObjName, eDestEnc, pNonConvertableChars ) << '\"';
734 }
735
736 const String& rTarget = pObj->GetTarget();
737 if( rTarget.Len() && pObj->IsActive() )
738 {
739 ((sOut = ' ') += OOO_STRING_SVTOOLS_HTML_O_target) += "=\"";
740 rStream << sOut.GetBuffer();
741 Out_String( rStream, rTarget, eDestEnc, pNonConvertableChars ) << '\"';
742 }
743
744 String rDesc( pObj->GetAltText() );
745 if( rDesc.Len() == 0 )
746 rDesc = pObj->GetDesc();
747
748 if( rDesc.Len() )
749 {
750 ((sOut = ' ') += OOO_STRING_SVTOOLS_HTML_O_alt) += "=\"";
751 rStream << sOut.GetBuffer();
752 Out_String( rStream, rDesc, eDestEnc, pNonConvertableChars ) << '\"';
753 }
754
755 const SvxMacroTableDtor& rMacroTab = pObj->GetMacroTable();
756 if( pEventTable && rMacroTab.Count() )
757 Out_Events( rStream, rMacroTab, pEventTable,
758 bOutStarBasic, eDestEnc, pNonConvertableChars );
759
760 rStream << '>';
761 }
762 }
763
764 }
765
766 if( pDelim )
767 rStream << pDelim;
768 if( pIndentMap )
769 rStream << pIndentMap;
770 Out_AsciiTag( rStream, OOO_STRING_SVTOOLS_HTML_map, sal_False );
771
772 return rStream;
773 }
774
OutScript(SvStream & rStrm,const String & rBaseURL,const String & rSource,const String & rLanguage,ScriptType eScriptType,const String & rSrc,const String * pSBLibrary,const String * pSBModule,rtl_TextEncoding eDestEnc,String * pNonConvertableChars)775 SvStream& HTMLOutFuncs::OutScript( SvStream& rStrm,
776 const String& rBaseURL,
777 const String& rSource,
778 const String& rLanguage,
779 ScriptType eScriptType,
780 const String& rSrc,
781 const String *pSBLibrary,
782 const String *pSBModule,
783 rtl_TextEncoding eDestEnc,
784 String *pNonConvertableChars )
785 {
786 if( RTL_TEXTENCODING_DONTKNOW == eDestEnc )
787 eDestEnc = gsl_getSystemTextEncoding();
788
789 // Script wird komplett nicht eingerueckt!
790 ByteString sOut( '<' );
791 sOut.Append( RTL_CONSTASCII_STRINGPARAM(OOO_STRING_SVTOOLS_HTML_script) );
792
793 if( rLanguage.Len() )
794 {
795 sOut.Append( ' ' );
796 sOut.Append( RTL_CONSTASCII_STRINGPARAM(OOO_STRING_SVTOOLS_HTML_O_language) );
797 sOut.Append( RTL_CONSTASCII_STRINGPARAM("=\"") );
798 rStrm << sOut.GetBuffer();
799 Out_String( rStrm, rLanguage, eDestEnc, pNonConvertableChars );
800 sOut = '\"';
801 }
802
803 if( rSrc.Len() )
804 {
805 ((sOut += ' ') += OOO_STRING_SVTOOLS_HTML_O_src) += "=\"";
806 rStrm << sOut.GetBuffer();
807 Out_String( rStrm, URIHelper::simpleNormalizedMakeRelative(rBaseURL, rSrc), eDestEnc, pNonConvertableChars );
808 sOut = '\"';
809 }
810
811 if( STARBASIC != eScriptType && pSBLibrary )
812 {
813 ((sOut += ' ') += OOO_STRING_SVTOOLS_HTML_O_sdlibrary) += "=\"";
814 rStrm << sOut.GetBuffer();
815 Out_String( rStrm, *pSBLibrary, eDestEnc, pNonConvertableChars );
816 sOut = '\"';
817 }
818
819 if( STARBASIC != eScriptType && pSBModule )
820 {
821 ((sOut += ' ') += OOO_STRING_SVTOOLS_HTML_O_sdmodule) += "=\"";
822 rStrm << sOut.GetBuffer();
823 Out_String( rStrm, *pSBModule, eDestEnc, pNonConvertableChars );
824 sOut = '\"';
825 }
826
827 sOut += '>';
828
829 rStrm << sOut.GetBuffer();
830
831 if( rSource.Len() || pSBLibrary || pSBModule )
832 {
833 rStrm << sNewLine;
834
835 if( JAVASCRIPT != eScriptType )
836 {
837 rStrm << "<!--"
838 << sNewLine;
839 }
840
841 if( STARBASIC == eScriptType )
842 {
843 if( pSBLibrary )
844 {
845 sOut.Assign( RTL_CONSTASCII_STRINGPARAM("' ") );
846 sOut.Append( RTL_CONSTASCII_STRINGPARAM(OOO_STRING_SVTOOLS_HTML_SB_library) );
847 sOut.Append( ' ' );
848 ByteString sTmp( *pSBLibrary, eDestEnc );
849 sOut.Append( sTmp );
850 rStrm << sOut.GetBuffer() << sNewLine;
851 }
852
853 if( pSBModule )
854 {
855 sOut.Assign( RTL_CONSTASCII_STRINGPARAM("' ") );
856 sOut.Append( RTL_CONSTASCII_STRINGPARAM(OOO_STRING_SVTOOLS_HTML_SB_module) );
857 sOut.Append( ' ' );
858 ByteString sTmp( *pSBModule, eDestEnc );
859 sOut.Append( sTmp );
860 rStrm << sOut.GetBuffer() << sNewLine;
861 }
862 }
863
864 if( rSource.Len() )
865 {
866 // Wir schreiben das Modul mm ANSI-Zeichensatz, aber mit
867 // System-Zeilenumbruechen raus.
868 ByteString sSource( rSource, eDestEnc );
869 sSource.ConvertLineEnd( GetSystemLineEnd() );
870 rStrm << sSource.GetBuffer();
871 }
872 rStrm << sNewLine;
873
874 if( JAVASCRIPT != eScriptType )
875 {
876 // MIB/MM: Wenn es kein StarBasic ist, kann ein // natuerlich
877 // falsch sein. Da der Kommentar aber beim Einlesen wider
878 // entfernt wird, schickt uns das nicht weiter ...
879 rStrm << (STARBASIC == eScriptType ? "' -->" : "// -->")
880 << sNewLine;
881 }
882 }
883
884 HTMLOutFuncs::Out_AsciiTag( rStrm, OOO_STRING_SVTOOLS_HTML_script, sal_False );
885
886 return rStrm;
887 }
888
889
Out_Events(SvStream & rStrm,const SvxMacroTableDtor & rMacroTable,const HTMLOutEvent * pEventTable,sal_Bool bOutStarBasic,rtl_TextEncoding eDestEnc,String * pNonConvertableChars)890 SvStream& HTMLOutFuncs::Out_Events( SvStream& rStrm,
891 const SvxMacroTableDtor& rMacroTable,
892 const HTMLOutEvent *pEventTable,
893 sal_Bool bOutStarBasic,
894 rtl_TextEncoding eDestEnc,
895 String *pNonConvertableChars )
896 {
897 sal_uInt16 i=0;
898 while( pEventTable[i].pBasicName || pEventTable[i].pJavaName )
899 {
900 const SvxMacro *pMacro =
901 rMacroTable.Get( pEventTable[i].nEvent );
902
903 if( pMacro && pMacro->GetMacName().Len() &&
904 ( JAVASCRIPT == pMacro->GetScriptType() || bOutStarBasic ))
905 {
906 const sal_Char *pStr = STARBASIC == pMacro->GetScriptType()
907 ? pEventTable[i].pBasicName
908 : pEventTable[i].pJavaName;
909
910 if( pStr )
911 {
912 ByteString sOut( ' ' );
913 (sOut += pStr) += "=\"";
914 rStrm << sOut.GetBuffer();
915
916 Out_String( rStrm, pMacro->GetMacName(), eDestEnc, pNonConvertableChars ) << '\"';
917 }
918 }
919 i++;
920 }
921
922 return rStrm;
923 }
924
CreateTableDataOptionsValNum(ByteString & aStrTD,sal_Bool bValue,double fVal,sal_uLong nFormat,SvNumberFormatter & rFormatter,rtl_TextEncoding eDestEnc,String * pNonConvertableChars)925 ByteString& HTMLOutFuncs::CreateTableDataOptionsValNum( ByteString& aStrTD,
926 sal_Bool bValue,
927 double fVal, sal_uLong nFormat, SvNumberFormatter& rFormatter,
928 rtl_TextEncoding eDestEnc, String* pNonConvertableChars )
929 {
930 if ( bValue )
931 {
932 // printf / scanf ist zu ungenau
933 String aValStr;
934 rFormatter.GetInputLineString( fVal, 0, aValStr );
935 ByteString sTmp( aValStr, eDestEnc );
936 ((((aStrTD += ' ') += OOO_STRING_SVTOOLS_HTML_O_SDval) += "=\"") += sTmp) += '\"';
937 }
938 if ( bValue || nFormat )
939 {
940 ((aStrTD += ' ') += OOO_STRING_SVTOOLS_HTML_O_SDnum) += "=\"";
941 (aStrTD += ByteString::CreateFromInt32(
942 Application::GetSettings().GetLanguage() ))
943 += ';'; // Language fuer Format 0
944 if ( nFormat )
945 {
946 ByteString aNumStr;
947 LanguageType nLang;
948 const SvNumberformat* pFormatEntry = rFormatter.GetEntry( nFormat );
949 if ( pFormatEntry )
950 {
951 ConvertStringToHTML( pFormatEntry->GetFormatstring(), aNumStr,
952 eDestEnc, pNonConvertableChars );
953 nLang = pFormatEntry->GetLanguage();
954 }
955 else
956 nLang = LANGUAGE_SYSTEM;
957 ((aStrTD += ByteString::CreateFromInt32(nLang)) += ';') += aNumStr;
958 }
959 aStrTD += '\"';
960 }
961 return aStrTD;
962 }
963
PrivateURLToInternalImg(String & rURL)964 sal_Bool HTMLOutFuncs::PrivateURLToInternalImg( String& rURL )
965 {
966 if( rURL.Len() > 14UL &&
967 rURL.CompareToAscii( OOO_STRING_SVTOOLS_HTML_private_image, 14UL ) == COMPARE_EQUAL )
968 {
969 rURL.Erase( 0UL, 14UL );
970 return sal_True;
971 }
972
973 return sal_False;
974 }
975
976
977