Subversion Repositories Scribus

Rev

Rev 5239 | Rev 5270 | 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
*/
2111 cbradney 7
/***************************************************************************
8
        begin                : 2005
9
        copyright            : (C) 2005 by Franz Schmid
10
        email                : Franz.Schmid@altmuehlnet.de
11
        copyright            : (C) 2005 by Craig Bradney
12
        email                : cbradney@zip.com.au
13
***************************************************************************/
14
 
15
/***************************************************************************
16
*                                                                         *
4026 craig 17
*   ScMW program is free software; you can redistribute it and/or modify  *
2111 cbradney 18
*   it under the terms of the GNU General Public License as published by  *
19
*   the Free Software Foundation; either version 2 of the License, or     *
20
*   (at your option) any later version.                                   *
21
*                                                                         *
22
***************************************************************************/
23
 
24
#include "documentchecker.h"
25
#include "pageitem.h"
26
#include "scribusstructs.h"
27
#include "scribusdoc.h"
2714 craig 28
#include "page.h"
5184 avox 29
#include "text/nlsconfig.h"
2111 cbradney 30
 
31
void DocumentChecker::checkDocument(ScribusDoc *currDoc)
32
{
33
        PageItem* currItem;
34
        QString chx;
35
        struct checkerPrefs checkerSettings;
36
        checkerSettings.ignoreErrors = currDoc->checkerProfiles[currDoc->curCheckProfile].ignoreErrors;
37
        checkerSettings.autoCheck = currDoc->checkerProfiles[currDoc->curCheckProfile].autoCheck;
38
        checkerSettings.checkGlyphs = currDoc->checkerProfiles[currDoc->curCheckProfile].checkGlyphs;
39
        checkerSettings.checkOrphans = currDoc->checkerProfiles[currDoc->curCheckProfile].checkOrphans;
40
        checkerSettings.checkOverflow = currDoc->checkerProfiles[currDoc->curCheckProfile].checkOverflow;
41
        checkerSettings.checkPictures = currDoc->checkerProfiles[currDoc->curCheckProfile].checkPictures;
42
        checkerSettings.checkResolution = currDoc->checkerProfiles[currDoc->curCheckProfile].checkResolution;
43
        checkerSettings.checkTransparency = currDoc->checkerProfiles[currDoc->curCheckProfile].checkTransparency;
44
        checkerSettings.minResolution = currDoc->checkerProfiles[currDoc->curCheckProfile].minResolution;
5239 fschmid 45
        checkerSettings.maxResolution = currDoc->checkerProfiles[currDoc->curCheckProfile].maxResolution;
2111 cbradney 46
        checkerSettings.checkAnnotations = currDoc->checkerProfiles[currDoc->curCheckProfile].checkAnnotations;
47
        checkerSettings.checkRasterPDF = currDoc->checkerProfiles[currDoc->curCheckProfile].checkRasterPDF;
5269 subik 48
        checkerSettings.checkForGIF = true; // TODO: into prefs PV currDoc->checkerProfiles[currDoc->curCheckProfile].checkForGIF;
2111 cbradney 49
        currDoc->docItemErrors.clear();
50
        currDoc->masterItemErrors.clear();
51
        errorCodes itemError;
52
        for (uint d = 0; d < currDoc->MasterItems.count(); ++d)
53
        {
54
                currItem = currDoc->MasterItems.at(d);
4698 cbradney 55
                if (!currItem->printEnabled())
4509 fschmid 56
                        continue;
2111 cbradney 57
                itemError.clear();
4084 cbradney 58
                if (((currItem->isAnnotation()) || (currItem->isBookmark)) && (checkerSettings.checkAnnotations))
4512 cbradney 59
                        itemError.insert(PDFAnnotField, 0);
2111 cbradney 60
                if (((currItem->fillTransparency() != 0.0) || (currItem->lineTransparency() != 0.0)) && (checkerSettings.checkTransparency))
4512 cbradney 61
                        itemError.insert(Transparency, 0);
3866 fschmid 62
                if ((currItem->GrType != 0) && (checkerSettings.checkTransparency))
63
                {
64
                        QPtrVector<VColorStop> colorStops = currItem->fill_gradient.colorStops();
65
                        for( uint offset = 0 ; offset < colorStops.count() ; offset++ )
66
                        {
67
                                if (colorStops[offset]->opacity != 1.0)
68
                                {
4512 cbradney 69
                                        itemError.insert(Transparency, 0);
3866 fschmid 70
                                        break;
71
                                }
72
                        }
73
                }
2111 cbradney 74
                if ((currItem->OwnPage == -1) && (checkerSettings.checkOrphans))
4512 cbradney 75
                        itemError.insert(ObjectNotOnPage, 0);
3625 avox 76
                if (currItem->asImageFrame())
2111 cbradney 77
                {
78
                        if ((!currItem->PicAvail) && (checkerSettings.checkPictures))
4512 cbradney 79
                                itemError.insert(MissingImage, 0);
2111 cbradney 80
                        else
81
                        {
3985 cbradney 82
                                if  (((qRound(72.0 / currItem->imageXScale()) < checkerSettings.minResolution) || (qRound(72.0 / currItem->imageYScale()) < checkerSettings.minResolution))
2111 cbradney 83
                                          && (currItem->isRaster) && (checkerSettings.checkResolution))
4512 cbradney 84
                                        itemError.insert(ImageDPITooLow, 0);
5239 fschmid 85
                                if  (((qRound(72.0 / currItem->imageXScale()) > checkerSettings.maxResolution) || (qRound(72.0 / currItem->imageYScale()) > checkerSettings.maxResolution))
86
                                          && (currItem->isRaster) && (checkerSettings.checkResolution))
87
                                        itemError.insert(ImageDPITooHigh, 0);
2111 cbradney 88
                                QFileInfo fi = QFileInfo(currItem->Pfile);
89
                                QString ext = fi.extension(false).lower();
90
                                if ((ext == "pdf") && (checkerSettings.checkRasterPDF))
4512 cbradney 91
                                        itemError.insert(PlacedPDF, 0);
5269 subik 92
                                if ((ext == "gif") && (checkerSettings.checkForGIF))
93
                                        itemError.insert(ImageIsGIF, 0);
2111 cbradney 94
                        }
95
                }
3625 avox 96
                if ((currItem->asTextFrame()) || (currItem->asPathText()))
2111 cbradney 97
                {
5184 avox 98
#ifndef NLS_PROTO
2111 cbradney 99
                        if ((currItem->itemText.count() > currItem->MaxChars) && (checkerSettings.checkOverflow))
4512 cbradney 100
                                itemError.insert(TextOverflow, 0);
5184 avox 101
                        for (uint e = 0; e < currItem->itemText.length(); ++e)
2111 cbradney 102
                        {
5184 avox 103
                                uint chr = currItem->itemText.text(e).unicode();
2447 fschmid 104
                                if ((chr == 13) || (chr == 32) || (chr == 29) || (chr == 28) || (chr == 27) || (chr == 26) || (chr == 25))
2111 cbradney 105
                                        continue;
5184 avox 106
                                if ((currItem->itemText.charStyle(e).cstyle & 64) || (currItem->itemText.charStyle(e).cstyle & 32))
2111 cbradney 107
                                {
5184 avox 108
                                        chx = currItem->itemText.text(e);
109
                                        if (chx.upper() != currItem->itemText.text(e))
2111 cbradney 110
                                                chx = chx.upper();
111
                                        chr = chx[0].unicode();
112
                                }
2285 fschmid 113
                                if (chr == 9)
114
                                {
5184 avox 115
                                        for (uint t1 = 0; t1 < currDoc->docParagraphStyles[currItem->itemText.at(e)->cab].tabValues().count(); t1++)
2285 fschmid 116
                                        {
5184 avox 117
                                                if (currDoc->docParagraphStyles[currItem->itemText.at(e)->cab].tabValues()[t1].tabFillChar.isNull())
2285 fschmid 118
                                                        continue;
5184 avox 119
                                                chx = QString(currDoc->docParagraphStyles[currItem->itemText.at(e)->cab].tabValues()[t1].tabFillChar);
120
                                                if ((currItem->itemText.charStyle(e).cstyle & 64) || (currItem->itemText.charStyle(e).cstyle & 32))
2285 fschmid 121
                                                {
5184 avox 122
                                                        if (chx.upper() != QString(currDoc->docParagraphStyles[currItem->itemText.at(e)->cab].tabValues()[t1].tabFillChar))
2285 fschmid 123
                                                                chx = chx.upper();
124
                                                }
125
                                                chr = chx[0].unicode();
126
                                                if ((!currItem->itemText.at(e)->cfont->CharWidth.contains(chr)) && (checkerSettings.checkGlyphs))
4512 cbradney 127
                                                        itemError.insert(MissingGlyph, 0);
2285 fschmid 128
                                        }
129
                                        for (uint t1 = 0; t1 < currItem->TabValues.count(); t1++)
130
                                        {
131
                                                if (currItem->TabValues[t1].tabFillChar.isNull())
132
                                                        continue;
133
                                                chx = QString(currItem->TabValues[t1].tabFillChar);
5184 avox 134
                                                if ((currItem->itemText.charStyle(e).cstyle & 64) || (currItem->itemText.charStyle(e).cstyle & 32))
2285 fschmid 135
                                                {
136
                                                        if (chx.upper() != QString(currItem->TabValues[t1].tabFillChar))
137
                                                                chx = chx.upper();
138
                                                }
139
                                                chr = chx[0].unicode();
140
                                                if ((!currItem->itemText.at(e)->cfont->CharWidth.contains(chr)) && (checkerSettings.checkGlyphs))
4512 cbradney 141
                                                        itemError.insert(MissingGlyph, 0);
2285 fschmid 142
                                        }
143
                                        continue;
144
                                }
2111 cbradney 145
                                if (chr == 30)
146
                                {
147
                                        for (uint numco = 0x30; numco < 0x3A; ++numco)
148
                                        {
149
                                                if ((!currItem->itemText.at(e)->cfont->CharWidth.contains(numco)) && (checkerSettings.checkGlyphs))
4512 cbradney 150
                                                        itemError.insert(MissingGlyph, 0);
2111 cbradney 151
                                        }
152
                                        continue;
153
                                }
154
                                if ((!currItem->itemText.at(e)->cfont->CharWidth.contains(chr)) && (checkerSettings.checkGlyphs))
4512 cbradney 155
                                        itemError.insert(MissingGlyph, 0);
2111 cbradney 156
                        }
5184 avox 157
#endif
2111 cbradney 158
                }
159
                if (itemError.count() != 0)
160
                        currDoc->masterItemErrors.insert(currItem->ItemNr, itemError);
161
        }
162
        for (uint d = 0; d < currDoc->DocItems.count(); ++d)
163
        {
164
                currItem = currDoc->DocItems.at(d);
4698 cbradney 165
                if (!currItem->printEnabled())
4509 fschmid 166
                        continue;
2111 cbradney 167
                itemError.clear();
168
                if (((currItem->fillTransparency() != 0.0) || (currItem->lineTransparency() != 0.0)) && (checkerSettings.checkTransparency))
4512 cbradney 169
                        itemError.insert(Transparency, 0);
3866 fschmid 170
                if ((currItem->GrType != 0) && (checkerSettings.checkTransparency))
171
                {
172
                        QPtrVector<VColorStop> colorStops = currItem->fill_gradient.colorStops();
173
                        for( uint offset = 0 ; offset < colorStops.count() ; offset++ )
174
                        {
175
                                if (colorStops[offset]->opacity != 1.0)
176
                                {
4512 cbradney 177
                                        itemError.insert(Transparency, 0);
3866 fschmid 178
                                        break;
179
                                }
180
                        }
181
                }
4084 cbradney 182
                if (((currItem->isAnnotation()) || (currItem->isBookmark)) && (checkerSettings.checkAnnotations))
4512 cbradney 183
                        itemError.insert(PDFAnnotField, 0);
2111 cbradney 184
                if ((currItem->OwnPage == -1) && (checkerSettings.checkOrphans))
4512 cbradney 185
                        itemError.insert(ObjectNotOnPage, 0);
3625 avox 186
                if (currItem->asImageFrame())
2111 cbradney 187
                {
188
                        if ((!currItem->PicAvail) && (checkerSettings.checkPictures))
4512 cbradney 189
                                itemError.insert(MissingImage, 0);
2111 cbradney 190
                        else
191
                        {
3985 cbradney 192
                                if  (((qRound(72.0 / currItem->imageYScale()) < checkerSettings.minResolution) || (qRound(72.0 / currItem->imageYScale()) < checkerSettings.minResolution))
2111 cbradney 193
                                           && (currItem->isRaster) && (checkerSettings.checkResolution))
4512 cbradney 194
                                        itemError.insert(ImageDPITooLow, 0);
5239 fschmid 195
                                if  (((qRound(72.0 / currItem->imageXScale()) > checkerSettings.maxResolution) || (qRound(72.0 / currItem->imageYScale()) > checkerSettings.maxResolution))
196
                                          && (currItem->isRaster) && (checkerSettings.checkResolution))
197
                                        itemError.insert(ImageDPITooHigh, 0);
2111 cbradney 198
                                QFileInfo fi = QFileInfo(currItem->Pfile);
199
                                QString ext = fi.extension(false).lower();
200
                                if ((ext == "pdf") && (checkerSettings.checkRasterPDF))
4512 cbradney 201
                                        itemError.insert(PlacedPDF, 0);
5269 subik 202
                                if ((ext == "gif") && (checkerSettings.checkForGIF))
203
                                        itemError.insert(ImageIsGIF, 0);
2111 cbradney 204
                        }
205
                }
3625 avox 206
                if ((currItem->asTextFrame()) || (currItem->asPathText()))
2111 cbradney 207
                {
5184 avox 208
#ifndef NLS_PROTO
2111 cbradney 209
                        if ((currItem->itemText.count() > currItem->MaxChars) && (checkerSettings.checkOverflow))
4512 cbradney 210
                                itemError.insert(TextOverflow, 0);
2111 cbradney 211
                        for (uint e = 0; e < currItem->itemText.count(); ++e)
212
                        {
5184 avox 213
                                uint chr = currItem->itemText.text(e).unicode();
2447 fschmid 214
                                if ((chr == 13) || (chr == 32) || (chr == 29) || (chr == 28) || (chr == 27) || (chr == 26) || (chr == 25))
2111 cbradney 215
                                        continue;
5184 avox 216
                                if ((currItem->itemText.charStyle(e).cstyle & 64) || (currItem->itemText.charStyle(e).cstyle & 32))
2111 cbradney 217
                                {
5184 avox 218
                                        chx = currItem->itemText.text(e,1);
2111 cbradney 219
                                        if (chx.upper() != currItem->itemText.at(e)->ch)
220
                                                chx = chx.upper();
221
                                        chr = chx[0].unicode();
222
                                }
2285 fschmid 223
                                if (chr == 9)
224
                                {
5184 avox 225
                                        for (uint t1 = 0; t1 < currDoc->docParagraphStyles[currItem->itemText.at(e)->cab].tabValues().count(); t1++)
2285 fschmid 226
                                        {
5184 avox 227
                                                if (currDoc->docParagraphStyles[currItem->itemText.at(e)->cab].tabValues()[t1].tabFillChar.isNull())
2285 fschmid 228
                                                        continue;
5184 avox 229
                                                chx = QString(currDoc->docParagraphStyles[currItem->itemText.at(e)->cab].tabValues()[t1].tabFillChar);
230
                                                if ((currItem->itemText.charStyle(e).cstyle & 64) || (currItem->itemText.charStyle(e).cstyle & 32))
2285 fschmid 231
                                                {
5184 avox 232
                                                        if (chx.upper() != QString(currDoc->docParagraphStyles[currItem->itemText.at(e)->cab].tabValues()[t1].tabFillChar))
2285 fschmid 233
                                                                chx = chx.upper();
234
                                                }
235
                                                chr = chx[0].unicode();
236
                                                if ((!currItem->itemText.at(e)->cfont->CharWidth.contains(chr)) && (checkerSettings.checkGlyphs))
4512 cbradney 237
                                                        itemError.insert(MissingGlyph, 0);
2285 fschmid 238
                                        }
239
                                        for (uint t1 = 0; t1 < currItem->TabValues.count(); t1++)
240
                                        {
241
                                                if (currItem->TabValues[t1].tabFillChar.isNull())
242
                                                        continue;
243
                                                chx = QString(currItem->TabValues[t1].tabFillChar);
5184 avox 244
                                                if ((currItem->itemText.charStyle(e).cstyle & 64) || (currItem->itemText.charStyle(e).cstyle & 32))
2285 fschmid 245
                                                {
246
                                                        if (chx.upper() != QString(currItem->TabValues[t1].tabFillChar))
247
                                                                chx = chx.upper();
248
                                                }
249
                                                chr = chx[0].unicode();
250
                                                if ((!currItem->itemText.at(e)->cfont->CharWidth.contains(chr)) && (checkerSettings.checkGlyphs))
4512 cbradney 251
                                                        itemError.insert(MissingGlyph, 0);
2285 fschmid 252
                                        }
253
                                        continue;
254
                                }
2111 cbradney 255
                                if (chr == 30)
256
                                {
257
                                        for (uint numco = 0x30; numco < 0x3A; ++numco)
258
                                        {
259
                                                if ((!currItem->itemText.at(e)->cfont->CharWidth.contains(numco)) && (checkerSettings.checkGlyphs))
4512 cbradney 260
                                                        itemError.insert(MissingGlyph, 0);
2111 cbradney 261
                                        }
262
                                        continue;
263
                                }
264
                                if ((!currItem->itemText.at(e)->cfont->CharWidth.contains(chr)) && (checkerSettings.checkGlyphs))
4512 cbradney 265
                                        itemError.insert(MissingGlyph, 0);
2111 cbradney 266
                        }
5184 avox 267
#endif
2111 cbradney 268
                }
269
                if (itemError.count() != 0)
270
                        currDoc->docItemErrors.insert(currItem->ItemNr, itemError);
271
        }
272
}