Subversion Repositories Scribus

Rev

Rev 17459 | Rev 18260 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
4430 cbradney 1
/*
2
For general Scribus (>=1.3.2) copyright and licensing information please refer
3
to the COPYING file provided with the program. Following this notice may exist
4
a copyright and/or license notice that predates the release of Scribus 1.3.2
5
for which a new license (GPL+exception) is in place.
6
*/
364 Franz 7
/***************************************************************************
403 Franz 8
 *   Copyright (C) 2004 by Riku Leino                                      *
1184 tsoots 9
 *   tsoots@gmail.com                                                      *
403 Franz 10
 *                                                                         *
11
 *   This program is free software; you can redistribute it and/or modify  *
12
 *   it under the terms of the GNU General Public License as published by  *
13
 *   the Free Software Foundation; either version 2 of the License, or     *
14
 *   (at your option) any later version.                                   *
15
 *                                                                         *
16
 *   This program is distributed in the hope that it will be useful,       *
17
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
18
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
19
 *   GNU General Public License for more details.                          *
20
 *                                                                         *
21
 *   You should have received a copy of the GNU General Public License     *
22
 *   along with this program; if not, write to the                         *
23
 *   Free Software Foundation, Inc.,                                       *
18122 mrdocs 24
 *   51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.             *
364 Franz 25
 ***************************************************************************/
26
 
10223 cbradney 27
#include <QObject>
9535 fschmid 28
#include <QByteArray>
364 Franz 29
#include "htmlreader.h"
30
 
2986 craig 31
#include "scribusstructs.h"
838 cbradney 32
#include "gtmeasure.h"
399 Franz 33
 
34
HTMLReader* HTMLReader::hreader = NULL;
8527 jghali 35
bool HTMLReader::elemJustStarted = false;
36
bool HTMLReader::elemJustFinished = false;
399 Franz 37
 
38
extern htmlSAXHandlerPtr mySAXHandler;
39
 
403 Franz 40
HTMLReader::HTMLReader(gtParagraphStyle *ps, gtWriter *w, bool textOnly)
364 Franz 41
{
42
        pstyle = ps;
43
        defaultColor = ps->getFont()->getColor();
399 Franz 44
        defaultWeight = ps->getFont()->getWeight();
45
        defaultSlant = ps->getFont()->getSlant();
364 Franz 46
        initPStyles();
47
        inH1 = false;
48
        inH2 = false;
49
        inH3 = false;
16941 jghali 50
        inH4 = false;
51
        inH5 = false;
52
        inH6 = false;
364 Franz 53
        inA = false;
54
        inCode = false;
399 Franz 55
        inBody = false;
56
        inPre = false;
57
        inP = false;
58
        inCenter = false;
364 Franz 59
        writer = w;
60
        href = "";
403 Franz 61
        extLinks = "";
62
        extIndex = 1;
63
        listLevel = -1;
364 Franz 64
        inOL = false;
403 Franz 65
        wasInOL = false;
364 Franz 66
        inUL = false;
403 Franz 67
        wasInUL = false;
364 Franz 68
        inLI = false;
69
        addedLI = false;
399 Franz 70
        lastCharWasSpace = false;
403 Franz 71
        noFormatting = textOnly;
399 Franz 72
        hreader = this;
364 Franz 73
}
74
 
75
void HTMLReader::initPStyles()
76
{
77
        pstylec = new gtParagraphStyle(*pstyle);
78
        pstylec->setAlignment(CENTER);
79
        pstylec->setName("HTML_center");
403 Franz 80
        gtParagraphStyle* pstyleli = new gtParagraphStyle(*pstyle);
364 Franz 81
        pstyleli->setIndent(pstyleli->getIndent()+50.0);
403 Franz 82
        pstyleli->setName("HTML_li_level-0");
83
        listStyles.push_back(pstyleli);
84
        nextItemNumbers.push_back(1);
16941 jghali 85
        pstyleh6 = new gtParagraphStyle(*pstyle);
86
        pstyleh6->getFont()->setSize(pstyle->getFont()->getSize() + 2.5);
87
        pstyleh6->getFont()->setWeight(BOLD);
88
        pstyleh6->setSpaceAbove(2.5);
89
        pstyleh6->setSpaceBelow(1.25);
90
        pstyleh6->setName("HTML_h6");
91
        pstyleh5 = new gtParagraphStyle(*pstyle);
92
        pstyleh5->getFont()->setSize(pstyle->getFont()->getSize() + 5);
93
        pstyleh5->getFont()->setWeight(BOLD);
94
        pstyleh5->setSpaceAbove(5.0);
95
        pstyleh5->setSpaceBelow(2.5);
96
        pstyleh5->setName("HTML_h5");
399 Franz 97
        pstyleh4 = new gtParagraphStyle(*pstyle);
98
        pstyleh4->getFont()->setSize(pstyle->getFont()->getSize() + 10);
99
        pstyleh4->getFont()->setWeight(BOLD);
100
        pstyleh4->setSpaceAbove(10.0);
101
        pstyleh4->setSpaceBelow(5.0);
102
        pstyleh4->setName("HTML_h4");
364 Franz 103
        pstyleh3 = new gtParagraphStyle(*pstyle);
104
        pstyleh3->getFont()->setSize(pstyle->getFont()->getSize() + 20);
399 Franz 105
        pstyleh3->getFont()->setWeight(BOLD);
364 Franz 106
        pstyleh3->setSpaceAbove(20.0);
107
        pstyleh3->setSpaceBelow(10.0);
108
        pstyleh3->setName("HTML_h3");
109
        pstyleh2 = new gtParagraphStyle(*pstyle);
110
        pstyleh2->getFont()->setSize(pstyle->getFont()->getSize() + 40);
399 Franz 111
        pstyleh2->getFont()->setWeight(BOLD);
364 Franz 112
        pstyleh2->setSpaceAbove(30.0);
113
        pstyleh2->setSpaceBelow(20.0);
114
        pstyleh2->setName("HTML_h2");
115
        pstyleh1 = new gtParagraphStyle(*pstyle);
116
        pstyleh1->getFont()->setSize(pstyle->getFont()->getSize() + 60);
399 Franz 117
        pstyleh1->getFont()->setWeight(BOLD);
118
        pstyleh1->setSpaceAbove(40.0);
119
        pstyleh1->setSpaceBelow(30.0);
364 Franz 120
        pstyleh1->setName("HTML_h1");
399 Franz 121
        pstylecode = new gtParagraphStyle(*pstyle);
122
        pstylecode->getFont()->setName("Courier Regular");
123
        pstylecode->setName("HTML_code");
124
        pstylep = new gtParagraphStyle(*pstyle);
2594 cbradney 125
        pstylep->setSpaceBelow(gtMeasure::i2d(5, SC_MM));
399 Franz 126
        pstylep->setName("HTML_p");
127
        pstylepre = new gtParagraphStyle(*pstyle);
128
        pstylepre->setName("HTML_pre");
364 Franz 129
}
130
 
1185 tsoots 131
void HTMLReader::startElement(void*, const xmlChar * fullname, const xmlChar ** atts)
364 Franz 132
{
8527 jghali 133
        elemJustStarted = true;
134
        elemJustFinished = false;
12150 jghali 135
        QString name(QString((const char*) fullname).toLower());
136
        QXmlAttributes attrs;
399 Franz 137
        if (atts)
138
        {
139
                for(const xmlChar** cur = atts; cur && *cur; cur += 2)
12150 jghali 140
                        attrs.append(QString((char*)*cur), NULL, QString((char*)*cur), QString((char*)*(cur + 1)));
399 Franz 141
        }
12150 jghali 142
        hreader->startElement(NULL, NULL, name, attrs);
364 Franz 143
}
144
 
145
bool HTMLReader::startElement(const QString&, const QString&, const QString &name, const QXmlAttributes &attrs)
146
{
399 Franz 147
        if (name == "p")
148
                inP = true;
149
        else if (name == "center")
364 Franz 150
                inCenter = true;
151
        else if (name == "br")
152
                writer->append("\n", pstyle);
153
        else if (name == "a")
154
        {
399 Franz 155
                toggleEffect(UNDERLINE);
364 Franz 156
                setBlueFont();
157
                for (int i = 0; i < attrs.count(); i++)
158
                {
159
                        if (attrs.localName(i) == "href")
160
                        {
161
                                href = attrs.value(i);
162
                        }
163
                        inA = true;
164
                }
165
        }
166
        else if (name == "ul")
403 Franz 167
        {
168
                ++listLevel;
169
                if (static_cast<int>(listStyles.size()) < (listLevel + 1))
170
                        createListStyle();
364 Franz 171
                inUL = true;
403 Franz 172
                if (inOL)
173
                {
174
                        inOL = false;
175
                        wasInOL = true;
176
                }
177
        }
364 Franz 178
        else if (name == "ol")
403 Franz 179
        {
180
                ++listLevel;
181
                if (static_cast<int>(listStyles.size()) < (listLevel + 1))
182
                        createListStyle();
364 Franz 183
                inOL = true;
403 Franz 184
                if (inUL)
185
                {
186
                        inUL = false;
187
                        wasInUL = true;
188
                }
189
        }
364 Franz 190
        else if (name == "li")
191
                inLI = true;
192
        else if (name == "h1")
193
                inH1 = true;
194
        else if (name == "h2")
195
                inH2 = true;
196
        else if (name == "h3")
197
                inH3 = true;
399 Franz 198
        else if (name == "h4")
199
                inH4 = true;
16941 jghali 200
        else if (name == "h5")
201
                inH5 = true;
202
        else if (name == "h6")
203
                inH6 = true;
364 Franz 204
        else if ((name == "b") || (name == "strong"))
205
                setBoldFont();
399 Franz 206
        else if ((name == "i") || (name == "em"))
207
                setItalicFont();
208
        else if (name == "code")
209
                inCode = true;
210
        else if (name == "body")
211
                inBody = true;
212
        else if (name == "pre")
213
                inPre = true;
214
        else if (name == "img")
215
        {
216
                QString imgline("(img,");
217
                for (int i = 0; i < attrs.count(); i++)
218
                {
219
                        if (attrs.localName(i) == "src")
220
                        {
17459 jghali 221
                                QString attrValue = attrs.value(i);
222
                                if (attrValue.indexOf("data:image") < 0)
223
                                        imgline +=  " src: " + attrValue;
224
                                else
225
                                        imgline +=  " src: embedded image";
399 Franz 226
                        }
227
                        if (attrs.localName(i) == "alt")
228
                        {
2877 cbradney 229
                                if (!attrs.value(i).isEmpty())
399 Franz 230
                                        imgline += ", alt: " + attrs.value(i);
231
                        }
232
                }
233
                imgline += ")\n\n";
234
                writer->append(imgline, pstyle);
235
        }
236
        else if (name == "sub")
237
                toggleEffect(SUBSCRIPT);
238
        else if (name == "sup")
239
                toggleEffect(SUPERSCRIPT);
240
        else if (name == "del")
241
                toggleEffect(STRIKETHROUGH);
1660 tsoots 242
        else if ((name == "ins" || name == "u") && (!inA))
399 Franz 243
                toggleEffect(UNDERLINE);
364 Franz 244
        return true;
245
}
1185 tsoots 246
void HTMLReader::characters(void*, const xmlChar * ch, int len)
399 Franz 247
{
248
        QString chars = QString::fromUtf8((const char*) ch, len);
249
        hreader->characters(chars);
250
}
364 Franz 251
 
252
bool HTMLReader::characters(const QString &ch)
253
{
399 Franz 254
        if (inBody)
364 Franz 255
        {
8527 jghali 256
                QString tmp = ch;
257
                // FIXME : According to html spec, new lines placed just after or just before an element
258
                // must be ignored, not exactly that, but better than nothing
259
                if (elemJustStarted  || elemJustFinished)
260
                {
261
                        while( !tmp.isEmpty() && (tmp[0] == '\r' || tmp[0] == '\n') )
262
                                tmp = tmp.right(tmp.length() - 1);
263
                        elemJustStarted = elemJustFinished = false;
264
                        if (tmp.isEmpty())
265
                                return true;
266
                }
267
                QString chl = tmp.left(1), chr = tmp.right(1);
268
                bool fcis = (chl.length() > 0 && chl[0].isSpace());
269
                bool lcis = (chr.length() > 0 && chr[0].isSpace());
399 Franz 270
                if (inPre)
403 Franz 271
                {
272
                        if (tmp.left(1) == "\n")
273
                                tmp = tmp.right(tmp.length() - 2);
274
                }
399 Franz 275
                else
10394 cbradney 276
                        tmp = tmp.simplified();
403 Franz 277
 
399 Franz 278
                if (!lastCharWasSpace)
279
                        if (fcis)
280
                                tmp = " " + tmp;
403 Franz 281
 
15329 jghali 282
                if (lcis && !(fcis && tmp.length() <= 1))
399 Franz 283
                        tmp = tmp + " ";
403 Franz 284
                lastCharWasSpace = lcis;
399 Franz 285
                if ((inLI) && (!addedLI))
364 Franz 286
                {
399 Franz 287
                        if (inUL)
288
                                tmp = "- " + tmp;
289
                        else if (inOL)
290
                        {
403 Franz 291
                                tmp = QString("%1. ").arg(nextItemNumbers[listLevel]) + tmp;
292
                                ++nextItemNumbers[listLevel];
399 Franz 293
                        }
294
                        addedLI = true;
364 Franz 295
                }
399 Franz 296
 
403 Franz 297
                if (noFormatting)
12895 jghali 298
                        writer->appendUnstyled(tmp);
403 Franz 299
                else if (inP)
399 Franz 300
                        writer->append(tmp, pstylep);
301
                else if (inLI)
403 Franz 302
                {
303
                        writer->append(tmp, listStyles[listLevel]);
304
                }
399 Franz 305
                else if (inH1)
306
                        writer->append(tmp, pstyleh1);
307
                else if (inH2)
308
                        writer->append(tmp, pstyleh2);
309
                else if (inH3)
310
                        writer->append(tmp, pstyleh3);
311
                else if (inH4)
312
                        writer->append(tmp, pstyleh4);
16941 jghali 313
                else if (inH5)
314
                        writer->append(tmp, pstyleh5);
315
                else if (inH6)
316
                        writer->append(tmp, pstyleh6);
399 Franz 317
                else if (inCenter)
318
                        writer->append(tmp, pstylec);
319
                else if (inCode)
320
                        writer->append(tmp, pstylecode);
321
                else if (inPre)
322
                        writer->append(tmp, pstylepre);
323
                else
324
                        writer->append(tmp, pstyle);
364 Franz 325
        }
326
        return true;
327
}
328
 
1185 tsoots 329
void HTMLReader::endElement(void*, const xmlChar * name)
399 Franz 330
{
8527 jghali 331
        elemJustStarted = false;
332
        elemJustFinished = true;
12150 jghali 333
        QString nname(QString((const char*) name).toLower());
334
        hreader->endElement(NULL, NULL, nname);
399 Franz 335
}
336
 
364 Franz 337
bool HTMLReader::endElement(const QString&, const QString&, const QString &name)
338
{
339
        if (name == "center")
399 Franz 340
        {
364 Franz 341
                inCenter = false;
342
                writer->append("\n");
399 Franz 343
        }
344
        else if (name == "p")
364 Franz 345
        {
399 Franz 346
                writer->append("\n");
347
                inP = false;
348
        }
349
        else if (name == "a")
350
        {
351
                toggleEffect(UNDERLINE);
10430 cbradney 352
                if ((!href.isEmpty()) && ((href.indexOf("//") != -1) ||
353
                    (href.indexOf("mailto:") != -1) || (href.indexOf("www") != -1)))
399 Franz 354
                {
355
                        href = href.remove("mailto:");
403 Franz 356
                        writer->append(QString(" [%1]").arg(extIndex), pstyle);
357
                        extLinks += QString("[%1] ").arg(extIndex) + href + "\n";
358
                        ++extIndex;
399 Franz 359
                }
364 Franz 360
                href = "";
399 Franz 361
                setDefaultColor();
364 Franz 362
                inA = false;
363
        }
399 Franz 364
        else if (name == "ul")
365
        {
403 Franz 366
                if (listLevel == 0)
367
                {
368
                        inUL = false;
369
                        inOL = false;
370
                        wasInUL = false;
371
                        wasInOL = false;
372
                        listLevel = -1;
373
                }
374
                else if (wasInOL)
375
                {
376
                        inUL = false;
377
                        inOL = true;
378
                        wasInOL = false;
379
                        --listLevel;
380
                }
381
                else if (wasInUL)
382
                {
383
                        inUL = true;
384
                        inOL = false;
385
                        wasInUL = false;
386
                        --listLevel;
387
                }
388
                else
389
                        --listLevel;
390
                if (listLevel == -1)
391
                        writer->append("\n");
399 Franz 392
        }
393
        else if (name == "ol")
364 Franz 394
        {
403 Franz 395
                if (listLevel == 0)
396
                {
397
                        inUL = false;
398
                        inOL = false;
399
                        wasInUL = false;
400
                        wasInOL = false;
401
                        listLevel = -1;
402
                }
403
                else if (wasInUL)
404
                {
405
                        inOL = false;
406
                        inUL = true;
407
                        wasInUL = false;
408
                        nextItemNumbers[listLevel] = 1;
409
                        --listLevel;
410
                }
411
                else if (wasInOL)
412
                {
413
                        inOL = true;
414
                        inUL = false;
415
                        wasInOL = false;
416
                        nextItemNumbers[listLevel] = 1;
417
                        --listLevel;
418
                }
419
                else
420
                {
421
                        nextItemNumbers[listLevel] = 1;
422
                        --listLevel;
423
                }
424
                if (listLevel == -1)
425
                        writer->append("\n");
364 Franz 426
        }
399 Franz 427
        else if (name == "li")
364 Franz 428
        {
429
                inLI = false;
430
                addedLI = false;
399 Franz 431
                writer->append("\n");
364 Franz 432
        }
399 Franz 433
        else if (name == "h1")
364 Franz 434
        {
435
                inH1 = false;
16941 jghali 436
                writer->append("\n", pstyleh1);
364 Franz 437
        }
399 Franz 438
        else if (name == "h2")
364 Franz 439
        {
440
                inH2 = false;
16941 jghali 441
                writer->append("\n", pstyleh2);
364 Franz 442
        }
399 Franz 443
        else if (name == "h3")
364 Franz 444
        {
445
                inH3 = false;
16941 jghali 446
                writer->append("\n", pstyleh3);
364 Franz 447
        }
399 Franz 448
        else if (name == "h4")
449
        {
450
                inH4 = false;
16941 jghali 451
                writer->append("\n", pstyleh4);
399 Franz 452
        }
16941 jghali 453
        else if (name == "h5")
454
        {
455
                inH5 = false;
456
                writer->append("\n", pstyleh5);
457
        }
458
        else if (name == "h6")
459
        {
460
                inH6 = false;
461
                writer->append("\n", pstyleh6);
462
        }
399 Franz 463
        else if ((name == "b") || (name == "strong"))
364 Franz 464
                unSetBoldFont();
399 Franz 465
        else if ((name == "i") || (name == "em"))
466
                unsetItalicFont();
467
        else if (name == "code")
468
                inCode = false;
469
        else if (name == "body")
470
                inBody = false;
471
        else if (name == "pre")
472
        {
473
                inPre = false;
474
                writer->append("\n");
475
        }
476
        else if (name == "div")
477
                writer->append("\n");
478
        else if (name == "sub")
479
                toggleEffect(SUBSCRIPT);
480
        else if (name == "sup")
481
                toggleEffect(SUPERSCRIPT);
482
        else if (name == "del")
483
                toggleEffect(STRIKETHROUGH);
1660 tsoots 484
        else if ((name == "ins" || name == "u") && (!inA))
399 Franz 485
                toggleEffect(UNDERLINE);
364 Franz 486
        return true;
487
}
488
 
399 Franz 489
void HTMLReader::toggleEffect(FontEffect e)
364 Franz 490
{
399 Franz 491
        pstyle->getFont()->toggleEffect(e);
492
        pstylec->getFont()->toggleEffect(e);
403 Franz 493
        for (uint i = 0; i < listStyles.size(); ++i)
494
                listStyles[i]->getFont()->toggleEffect(e);
399 Franz 495
        pstyleh1->getFont()->toggleEffect(e);
496
        pstyleh2->getFont()->toggleEffect(e);
497
        pstyleh3->getFont()->toggleEffect(e);
498
        pstyleh4->getFont()->toggleEffect(e);
16941 jghali 499
        pstyleh5->getFont()->toggleEffect(e);
500
        pstyleh6->getFont()->toggleEffect(e);
399 Franz 501
        pstylecode->getFont()->toggleEffect(e);
502
        pstylep->getFont()->toggleEffect(e);
503
        pstylepre->getFont()->toggleEffect(e);
364 Franz 504
}
505
 
399 Franz 506
void HTMLReader::setItalicFont()
364 Franz 507
{
399 Franz 508
        pstyle->getFont()->setSlant(ITALIC);
509
        pstylec->getFont()->setSlant(ITALIC);
403 Franz 510
        for (uint i = 0; i < listStyles.size(); ++i)
511
                listStyles[i]->getFont()->setSlant(ITALIC);
399 Franz 512
        pstyleh1->getFont()->setSlant(ITALIC);
513
        pstyleh2->getFont()->setSlant(ITALIC);
514
        pstyleh3->getFont()->setSlant(ITALIC);
515
        pstyleh4->getFont()->setSlant(ITALIC);
16941 jghali 516
        pstyleh5->getFont()->setSlant(ITALIC);
517
        pstyleh6->getFont()->setSlant(ITALIC);
399 Franz 518
        pstylecode->getFont()->setSlant(ITALIC);
519
        pstylep->getFont()->setSlant(ITALIC);
520
        pstylepre->getFont()->setSlant(ITALIC);
364 Franz 521
}
522
 
399 Franz 523
void HTMLReader::unsetItalicFont()
524
{
525
        pstyle->getFont()->setSlant(defaultSlant);
526
        pstylec->getFont()->setSlant(defaultSlant);
403 Franz 527
        for (uint i = 0; i < listStyles.size(); ++i)
528
                listStyles[i]->getFont()->setSlant(defaultSlant);
399 Franz 529
        pstyleh1->getFont()->setSlant(defaultSlant);
530
        pstyleh2->getFont()->setSlant(defaultSlant);
531
        pstyleh3->getFont()->setSlant(defaultSlant);
532
        pstyleh4->getFont()->setSlant(defaultSlant);
16941 jghali 533
        pstyleh5->getFont()->setSlant(defaultSlant);
534
        pstyleh6->getFont()->setSlant(defaultSlant);
399 Franz 535
        pstylecode->getFont()->setSlant(defaultSlant);
536
        pstylep->getFont()->setSlant(defaultSlant);
537
        pstylepre->getFont()->setSlant(defaultSlant);
538
}
539
 
364 Franz 540
void HTMLReader::setBlueFont()
541
{
542
        pstyle->getFont()->setColor("Blue");
543
        pstylec->getFont()->setColor("Blue");
403 Franz 544
        for (uint i = 0; i < listStyles.size(); ++i)
545
                listStyles[i]->getFont()->setColor("Blue");
364 Franz 546
        pstyleh1->getFont()->setColor("Blue");
547
        pstyleh2->getFont()->setColor("Blue");
548
        pstyleh3->getFont()->setColor("Blue");
399 Franz 549
        pstyleh4->getFont()->setColor("Blue");
16941 jghali 550
        pstyleh5->getFont()->setColor("Blue");
551
        pstyleh6->getFont()->setColor("Blue");
399 Franz 552
        pstylecode->getFont()->setColor("Blue");
553
        pstylep->getFont()->setColor("Blue");
554
        pstylepre->getFont()->setColor("Blue");
364 Franz 555
}
556
 
399 Franz 557
void HTMLReader::setDefaultColor()
364 Franz 558
{
559
        pstyle->getFont()->setColor(defaultColor);
560
        pstylec->getFont()->setColor(defaultColor);
403 Franz 561
        for (uint i = 0; i < listStyles.size(); ++i)
562
                listStyles[i]->getFont()->setColor(defaultColor);
364 Franz 563
        pstyleh1->getFont()->setColor(defaultColor);
564
        pstyleh2->getFont()->setColor(defaultColor);
565
        pstyleh3->getFont()->setColor(defaultColor);
399 Franz 566
        pstyleh4->getFont()->setColor(defaultColor);
16941 jghali 567
        pstyleh5->getFont()->setColor(defaultColor);
568
        pstyleh6->getFont()->setColor(defaultColor);
399 Franz 569
        pstylecode->getFont()->setColor(defaultColor);
570
        pstylep->getFont()->setColor(defaultColor);
571
        pstylepre->getFont()->setColor(defaultColor);
364 Franz 572
}
573
 
574
void HTMLReader::setBoldFont()
575
{
576
        pstyle->getFont()->setWeight(BOLD);
577
        pstylec->getFont()->setWeight(BOLD);
403 Franz 578
        for (uint i = 0; i < listStyles.size(); ++i)
579
                listStyles[i]->getFont()->setWeight(BOLD);
399 Franz 580
        pstylecode->getFont()->setWeight(BOLD);
581
        pstylep->getFont()->setWeight(BOLD);
582
        pstylepre->getFont()->setWeight(BOLD);
364 Franz 583
}
584
 
585
void HTMLReader::unSetBoldFont()
586
{
399 Franz 587
        pstyle->getFont()->setWeight(defaultWeight);
588
        pstylec->getFont()->setWeight(defaultWeight);
403 Franz 589
        for (uint i = 0; i < listStyles.size(); ++i)
590
                listStyles[i]->getFont()->setWeight(defaultWeight);
399 Franz 591
        pstylecode->getFont()->setWeight(REGULAR);
592
        pstylep->getFont()->setWeight(defaultWeight);
593
        pstylepre->getFont()->setWeight(defaultWeight);
364 Franz 594
}
595
 
399 Franz 596
void HTMLReader::parse(QString filename)
597
{
7280 jghali 598
#if defined(_WIN32)
16577 craig 599
        QString fname = QDir::toNativeSeparators(filename);
10723 jghali 600
        QByteArray fn = (QSysInfo::WindowsVersion & QSysInfo::WV_NT_based) ? fname.toUtf8() : fname.toLocal8Bit();
7280 jghali 601
#else
10493 fschmid 602
        QByteArray fn(filename.toLocal8Bit());
7280 jghali 603
#endif
8527 jghali 604
        elemJustStarted = elemJustFinished = false;
7280 jghali 605
        htmlSAXParseFile(fn.data(), NULL, mySAXHandler, NULL);
399 Franz 606
}
607
 
403 Franz 608
void HTMLReader::createListStyle()
609
{
610
        gtParagraphStyle* tmpStyle = new gtParagraphStyle(*listStyles[0]);
611
        tmpStyle->setName(QString("HTML_li_level-%1").arg(listLevel + 1));
612
        double indent = listStyles[0]->getIndent();
613
        indent += 25 * (listLevel + 1);
614
        tmpStyle->setIndent(indent);
615
        listStyles.push_back(tmpStyle);
616
        nextItemNumbers.push_back(1);
617
}
618
 
399 Franz 619
htmlSAXHandler mySAXHandlerStruct = {
403 Franz 620
        NULL, // internalSubset,
621
        NULL, // isStandalone,
622
        NULL, // hasInternalSubset,
623
        NULL, // hasExternalSubset,
624
        NULL, // resolveEntity,
625
        NULL, // getEntity,
626
        NULL, // entityDecl,
627
        NULL, // notationDecl,
628
        NULL, // attributeDecl,
629
        NULL, // elementDecl,
630
        NULL, // unparsedEntityDecl,
631
        NULL, // setDocumentLocator,
399 Franz 632
        NULL, // startDocument,
633
        NULL, // endDocument,
634
        HTMLReader::startElement,
635
        HTMLReader::endElement,
403 Franz 636
        NULL, // reference,
399 Franz 637
        HTMLReader::characters,
403 Franz 638
        NULL, // ignorableWhitespace,
639
        NULL, // processingInstruction,
640
        NULL, // comment,
641
        NULL, // warning,
642
        NULL, // error,
643
        NULL, // fatalError,
644
        NULL, // getParameterEntity,
645
        NULL, // cdata,
399 Franz 646
        NULL,
647
        1
400 Franz 648
#ifdef HAVE_XML26
649
        ,
399 Franz 650
        NULL,
651
        NULL,
400 Franz 652
        NULL,
399 Franz 653
        NULL
400 Franz 654
#endif
655
};
399 Franz 656
 
657
htmlSAXHandlerPtr mySAXHandler = &mySAXHandlerStruct;
658
 
364 Franz 659
HTMLReader::~HTMLReader()
660
{
2877 cbradney 661
        if (!extLinks.isEmpty())
403 Franz 662
        {
663
                writer->append(QObject::tr("\nExternal Links\n"), pstyleh4);
664
                writer->append(extLinks, pstyle);
665
        }
666
        for (uint i = 0; i < listStyles.size(); ++i)
667
                delete listStyles[i];
364 Franz 668
        delete pstylec;
669
        delete pstyleh1;
670
        delete pstyleh2;
671
        delete pstyleh3;
403 Franz 672
        delete pstyleh4;
16941 jghali 673
        delete pstyleh5;
674
        delete pstyleh6;
399 Franz 675
        delete pstylecode;
676
        delete pstylep;
677
        delete pstylepre;
678
        hreader = NULL;
364 Franz 679
}
399 Franz 680