Subversion Repositories Scribus

Rev

Rev 6619 | Rev 7994 | 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"
5674 fschmid 30
#include "util.h"
2111 cbradney 31
 
6715 cbradney 32
bool DocumentChecker::checkDocument(ScribusDoc *currDoc)
2111 cbradney 33
{
34
        PageItem* currItem;
5721 avox 35
        QString chstr;
2111 cbradney 36
        struct checkerPrefs checkerSettings;
37
        checkerSettings.ignoreErrors = currDoc->checkerProfiles[currDoc->curCheckProfile].ignoreErrors;
38
        checkerSettings.autoCheck = currDoc->checkerProfiles[currDoc->curCheckProfile].autoCheck;
39
        checkerSettings.checkGlyphs = currDoc->checkerProfiles[currDoc->curCheckProfile].checkGlyphs;
40
        checkerSettings.checkOrphans = currDoc->checkerProfiles[currDoc->curCheckProfile].checkOrphans;
41
        checkerSettings.checkOverflow = currDoc->checkerProfiles[currDoc->curCheckProfile].checkOverflow;
42
        checkerSettings.checkPictures = currDoc->checkerProfiles[currDoc->curCheckProfile].checkPictures;
43
        checkerSettings.checkResolution = currDoc->checkerProfiles[currDoc->curCheckProfile].checkResolution;
44
        checkerSettings.checkTransparency = currDoc->checkerProfiles[currDoc->curCheckProfile].checkTransparency;
45
        checkerSettings.minResolution = currDoc->checkerProfiles[currDoc->curCheckProfile].minResolution;
5239 fschmid 46
        checkerSettings.maxResolution = currDoc->checkerProfiles[currDoc->curCheckProfile].maxResolution;
2111 cbradney 47
        checkerSettings.checkAnnotations = currDoc->checkerProfiles[currDoc->curCheckProfile].checkAnnotations;
48
        checkerSettings.checkRasterPDF = currDoc->checkerProfiles[currDoc->curCheckProfile].checkRasterPDF;
5270 subik 49
        checkerSettings.checkForGIF = currDoc->checkerProfiles[currDoc->curCheckProfile].checkForGIF;
6619 fschmid 50
        checkerSettings.ignoreOffLayers = currDoc->checkerProfiles[currDoc->curCheckProfile].ignoreOffLayers;
2111 cbradney 51
        currDoc->docItemErrors.clear();
52
        currDoc->masterItemErrors.clear();
5674 fschmid 53
        currDoc->docLayerErrors.clear();
2111 cbradney 54
        errorCodes itemError;
5674 fschmid 55
        errorCodes layerError;
56
        int Lnr;
57
        struct Layer ll;
58
        ll.LNr = 0;
59
        Lnr = 0;
60
        uint layerCount= currDoc->layerCount();
61
        for (uint la = 0; la < layerCount; ++la)
62
        {
63
                layerError.clear();
64
                Level2Layer(currDoc, &ll, Lnr);
6619 fschmid 65
                if ((!ll.isViewable) && (checkerSettings.ignoreOffLayers))
66
                        continue;
67
                if ((!ll.isPrintable) && (checkerSettings.ignoreOffLayers))
68
                        continue;
5674 fschmid 69
                if ((ll.transparency != 1.0) && (checkerSettings.checkTransparency))
70
                        layerError.insert(Transparency, 0);
71
                if ((ll.blendMode != 0) && (checkerSettings.checkTransparency))
72
                        layerError.insert(BlendMode, 1);
73
                Lnr++;
74
                if (layerError.count() != 0)
75
                        currDoc->docLayerErrors.insert(ll.LNr, layerError);
76
        }
2111 cbradney 77
        for (uint d = 0; d < currDoc->MasterItems.count(); ++d)
78
        {
79
                currItem = currDoc->MasterItems.at(d);
4698 cbradney 80
                if (!currItem->printEnabled())
4509 fschmid 81
                        continue;
6619 fschmid 82
                if (!(currDoc->layerPrintable(currItem->LayerNr)) && (checkerSettings.ignoreOffLayers))
83
                        continue;
2111 cbradney 84
                itemError.clear();
4084 cbradney 85
                if (((currItem->isAnnotation()) || (currItem->isBookmark)) && (checkerSettings.checkAnnotations))
4512 cbradney 86
                        itemError.insert(PDFAnnotField, 0);
5748 fschmid 87
                if (((currItem->fillTransparency() != 0.0) || (currItem->lineTransparency() != 0.0) || (currItem->fillBlendmode() != 0) || (currItem->lineBlendmode() != 0)) && (checkerSettings.checkTransparency))
4512 cbradney 88
                        itemError.insert(Transparency, 0);
3866 fschmid 89
                if ((currItem->GrType != 0) && (checkerSettings.checkTransparency))
90
                {
91
                        QPtrVector<VColorStop> colorStops = currItem->fill_gradient.colorStops();
92
                        for( uint offset = 0 ; offset < colorStops.count() ; offset++ )
93
                        {
94
                                if (colorStops[offset]->opacity != 1.0)
95
                                {
4512 cbradney 96
                                        itemError.insert(Transparency, 0);
3866 fschmid 97
                                        break;
98
                                }
99
                        }
100
                }
2111 cbradney 101
                if ((currItem->OwnPage == -1) && (checkerSettings.checkOrphans))
4512 cbradney 102
                        itemError.insert(ObjectNotOnPage, 0);
3625 avox 103
                if (currItem->asImageFrame())
2111 cbradney 104
                {
105
                        if ((!currItem->PicAvail) && (checkerSettings.checkPictures))
4512 cbradney 106
                                itemError.insert(MissingImage, 0);
2111 cbradney 107
                        else
108
                        {
3985 cbradney 109
                                if  (((qRound(72.0 / currItem->imageXScale()) < checkerSettings.minResolution) || (qRound(72.0 / currItem->imageYScale()) < checkerSettings.minResolution))
2111 cbradney 110
                                          && (currItem->isRaster) && (checkerSettings.checkResolution))
4512 cbradney 111
                                        itemError.insert(ImageDPITooLow, 0);
5239 fschmid 112
                                if  (((qRound(72.0 / currItem->imageXScale()) > checkerSettings.maxResolution) || (qRound(72.0 / currItem->imageYScale()) > checkerSettings.maxResolution))
113
                                          && (currItem->isRaster) && (checkerSettings.checkResolution))
114
                                        itemError.insert(ImageDPITooHigh, 0);
2111 cbradney 115
                                QFileInfo fi = QFileInfo(currItem->Pfile);
116
                                QString ext = fi.extension(false).lower();
117
                                if ((ext == "pdf") && (checkerSettings.checkRasterPDF))
4512 cbradney 118
                                        itemError.insert(PlacedPDF, 0);
5269 subik 119
                                if ((ext == "gif") && (checkerSettings.checkForGIF))
120
                                        itemError.insert(ImageIsGIF, 0);
2111 cbradney 121
                        }
122
                }
3625 avox 123
                if ((currItem->asTextFrame()) || (currItem->asPathText()))
2111 cbradney 124
                {
5184 avox 125
#ifndef NLS_PROTO
5559 avox 126
                        if ( currItem->frameOverflows() && (checkerSettings.checkOverflow))
4512 cbradney 127
                                itemError.insert(TextOverflow, 0);
5721 avox 128
                        for (int e = 0; e < currItem->itemText.length(); ++e)
2111 cbradney 129
                        {
5184 avox 130
                                uint chr = currItem->itemText.text(e).unicode();
2447 fschmid 131
                                if ((chr == 13) || (chr == 32) || (chr == 29) || (chr == 28) || (chr == 27) || (chr == 26) || (chr == 25))
2111 cbradney 132
                                        continue;
5691 avox 133
                                if ((currItem->itemText.charStyle(e).effects() & ScStyle_SmallCaps) || (currItem->itemText.charStyle(e).effects() & ScStyle_AllCaps))
2111 cbradney 134
                                {
5721 avox 135
                                        chstr = currItem->itemText.text(e);
136
                                        if (chstr.upper() != currItem->itemText.text(e))
137
                                                chstr = chstr.upper();
138
                                        chr = chstr[0].unicode();
2111 cbradney 139
                                }
2285 fschmid 140
                                if (chr == 9)
141
                                {
5721 avox 142
                                        for (uint t1 = 0; t1 < currItem->itemText.paragraphStyle(e).tabValues().count(); t1++)
2285 fschmid 143
                                        {
5721 avox 144
                                                if (currItem->itemText.paragraphStyle(e).tabValues()[t1].tabFillChar.isNull())
2285 fschmid 145
                                                        continue;
5721 avox 146
                                                chstr = QString(currItem->itemText.paragraphStyle(e).tabValues()[t1].tabFillChar);
5691 avox 147
                                                if ((currItem->itemText.charStyle(e).effects() & ScStyle_SmallCaps) || (currItem->itemText.charStyle(e).effects() & ScStyle_AllCaps))
2285 fschmid 148
                                                {
5721 avox 149
                                                        if (chstr.upper() != QString(currItem->itemText.paragraphStyle(e).tabValues()[t1].tabFillChar))
150
                                                                chstr = chstr.upper();
2285 fschmid 151
                                                }
5721 avox 152
                                                chr = chstr[0].unicode();
5980 avox 153
                                                if ((!currItem->itemText.charStyle(e).font().canRender(chr)) && (checkerSettings.checkGlyphs))
4512 cbradney 154
                                                        itemError.insert(MissingGlyph, 0);
2285 fschmid 155
                                        }
156
                                        for (uint t1 = 0; t1 < currItem->TabValues.count(); t1++)
157
                                        {
158
                                                if (currItem->TabValues[t1].tabFillChar.isNull())
159
                                                        continue;
5721 avox 160
                                                chstr = QString(currItem->TabValues[t1].tabFillChar);
5691 avox 161
                                                if ((currItem->itemText.charStyle(e).effects() & ScStyle_SmallCaps) || (currItem->itemText.charStyle(e).effects() & ScStyle_AllCaps))
2285 fschmid 162
                                                {
5721 avox 163
                                                        if (chstr.upper() != QString(currItem->TabValues[t1].tabFillChar))
164
                                                                chstr = chstr.upper();
2285 fschmid 165
                                                }
5721 avox 166
                                                chr = chstr[0].unicode();
5980 avox 167
                                                if ((!currItem->itemText.charStyle(e).font().canRender(chr)) && (checkerSettings.checkGlyphs))
4512 cbradney 168
                                                        itemError.insert(MissingGlyph, 0);
2285 fschmid 169
                                        }
170
                                        continue;
171
                                }
2111 cbradney 172
                                if (chr == 30)
173
                                {
174
                                        for (uint numco = 0x30; numco < 0x3A; ++numco)
175
                                        {
5980 avox 176
                                                if ((!currItem->itemText.charStyle(e).font().canRender(numco)) && (checkerSettings.checkGlyphs))
4512 cbradney 177
                                                        itemError.insert(MissingGlyph, 0);
2111 cbradney 178
                                        }
179
                                        continue;
180
                                }
5980 avox 181
                                if ((!currItem->itemText.charStyle(e).font().canRender(chr)) && (checkerSettings.checkGlyphs))
4512 cbradney 182
                                        itemError.insert(MissingGlyph, 0);
2111 cbradney 183
                        }
5184 avox 184
#endif
2111 cbradney 185
                }
186
                if (itemError.count() != 0)
187
                        currDoc->masterItemErrors.insert(currItem->ItemNr, itemError);
188
        }
189
        for (uint d = 0; d < currDoc->DocItems.count(); ++d)
190
        {
191
                currItem = currDoc->DocItems.at(d);
4698 cbradney 192
                if (!currItem->printEnabled())
4509 fschmid 193
                        continue;
6619 fschmid 194
                if (!(currDoc->layerPrintable(currItem->LayerNr)) && (checkerSettings.ignoreOffLayers))
195
                        continue;
2111 cbradney 196
                itemError.clear();
5748 fschmid 197
                if (((currItem->fillTransparency() != 0.0) || (currItem->lineTransparency() != 0.0) || (currItem->fillBlendmode() != 0) || (currItem->lineBlendmode() != 0)) && (checkerSettings.checkTransparency))
4512 cbradney 198
                        itemError.insert(Transparency, 0);
3866 fschmid 199
                if ((currItem->GrType != 0) && (checkerSettings.checkTransparency))
200
                {
201
                        QPtrVector<VColorStop> colorStops = currItem->fill_gradient.colorStops();
202
                        for( uint offset = 0 ; offset < colorStops.count() ; offset++ )
203
                        {
204
                                if (colorStops[offset]->opacity != 1.0)
205
                                {
4512 cbradney 206
                                        itemError.insert(Transparency, 0);
3866 fschmid 207
                                        break;
208
                                }
209
                        }
210
                }
4084 cbradney 211
                if (((currItem->isAnnotation()) || (currItem->isBookmark)) && (checkerSettings.checkAnnotations))
4512 cbradney 212
                        itemError.insert(PDFAnnotField, 0);
2111 cbradney 213
                if ((currItem->OwnPage == -1) && (checkerSettings.checkOrphans))
4512 cbradney 214
                        itemError.insert(ObjectNotOnPage, 0);
3625 avox 215
                if (currItem->asImageFrame())
2111 cbradney 216
                {
217
                        if ((!currItem->PicAvail) && (checkerSettings.checkPictures))
4512 cbradney 218
                                itemError.insert(MissingImage, 0);
2111 cbradney 219
                        else
220
                        {
3985 cbradney 221
                                if  (((qRound(72.0 / currItem->imageYScale()) < checkerSettings.minResolution) || (qRound(72.0 / currItem->imageYScale()) < checkerSettings.minResolution))
2111 cbradney 222
                                           && (currItem->isRaster) && (checkerSettings.checkResolution))
4512 cbradney 223
                                        itemError.insert(ImageDPITooLow, 0);
5239 fschmid 224
                                if  (((qRound(72.0 / currItem->imageXScale()) > checkerSettings.maxResolution) || (qRound(72.0 / currItem->imageYScale()) > checkerSettings.maxResolution))
225
                                          && (currItem->isRaster) && (checkerSettings.checkResolution))
226
                                        itemError.insert(ImageDPITooHigh, 0);
2111 cbradney 227
                                QFileInfo fi = QFileInfo(currItem->Pfile);
228
                                QString ext = fi.extension(false).lower();
229
                                if ((ext == "pdf") && (checkerSettings.checkRasterPDF))
4512 cbradney 230
                                        itemError.insert(PlacedPDF, 0);
5269 subik 231
                                if ((ext == "gif") && (checkerSettings.checkForGIF))
232
                                        itemError.insert(ImageIsGIF, 0);
2111 cbradney 233
                        }
234
                }
3625 avox 235
                if ((currItem->asTextFrame()) || (currItem->asPathText()))
2111 cbradney 236
                {
5184 avox 237
#ifndef NLS_PROTO
5559 avox 238
                        if ( currItem->frameOverflows() && (checkerSettings.checkOverflow))
4512 cbradney 239
                                itemError.insert(TextOverflow, 0);
5753 jghali 240
                        for (int e = 0; e < currItem->itemText.length(); ++e)
2111 cbradney 241
                        {
5184 avox 242
                                uint chr = currItem->itemText.text(e).unicode();
2447 fschmid 243
                                if ((chr == 13) || (chr == 32) || (chr == 29) || (chr == 28) || (chr == 27) || (chr == 26) || (chr == 25))
2111 cbradney 244
                                        continue;
5691 avox 245
                                if ((currItem->itemText.charStyle(e).effects() & ScStyle_SmallCaps) || (currItem->itemText.charStyle(e).effects() & ScStyle_AllCaps))
2111 cbradney 246
                                {
5721 avox 247
                                        chstr = currItem->itemText.text(e,1);
248
                                        if (chstr.upper() != currItem->itemText.text(e,1))
249
                                                chstr = chstr.upper();
250
                                        chr = chstr[0].unicode();
2111 cbradney 251
                                }
2285 fschmid 252
                                if (chr == 9)
253
                                {
5721 avox 254
                                        for (uint t1 = 0; t1 < currItem->itemText.paragraphStyle(e).tabValues().count(); t1++)
2285 fschmid 255
                                        {
5721 avox 256
                                                if (currItem->itemText.paragraphStyle(e).tabValues()[t1].tabFillChar.isNull())
2285 fschmid 257
                                                        continue;
5721 avox 258
                                                chstr = QString(currItem->itemText.paragraphStyle(e).tabValues()[t1].tabFillChar);
5691 avox 259
                                                if ((currItem->itemText.charStyle(e).effects() & ScStyle_SmallCaps) || (currItem->itemText.charStyle(e).effects() & ScStyle_AllCaps))
2285 fschmid 260
                                                {
5721 avox 261
                                                        if (chstr.upper() != QString(currItem->itemText.paragraphStyle(e).tabValues()[t1].tabFillChar))
262
                                                                chstr = chstr.upper();
2285 fschmid 263
                                                }
5721 avox 264
                                                chr = chstr[0].unicode();
5980 avox 265
                                                if ((!currItem->itemText.charStyle(e).font().canRender(chr)) && (checkerSettings.checkGlyphs))
4512 cbradney 266
                                                        itemError.insert(MissingGlyph, 0);
2285 fschmid 267
                                        }
268
                                        for (uint t1 = 0; t1 < currItem->TabValues.count(); t1++)
269
                                        {
270
                                                if (currItem->TabValues[t1].tabFillChar.isNull())
271
                                                        continue;
5721 avox 272
                                                chstr = QString(currItem->TabValues[t1].tabFillChar);
5691 avox 273
                                                if ((currItem->itemText.charStyle(e).effects() & ScStyle_SmallCaps) || (currItem->itemText.charStyle(e).effects() & ScStyle_AllCaps))
2285 fschmid 274
                                                {
5721 avox 275
                                                        if (chstr.upper() != QString(currItem->TabValues[t1].tabFillChar))
276
                                                                chstr = chstr.upper();
2285 fschmid 277
                                                }
5721 avox 278
                                                chr = chstr[0].unicode();
5980 avox 279
                                                if ((!currItem->itemText.charStyle(e).font().canRender(chr)) && (checkerSettings.checkGlyphs))
4512 cbradney 280
                                                        itemError.insert(MissingGlyph, 0);
2285 fschmid 281
                                        }
282
                                        continue;
283
                                }
2111 cbradney 284
                                if (chr == 30)
285
                                {
286
                                        for (uint numco = 0x30; numco < 0x3A; ++numco)
287
                                        {
5980 avox 288
                                                if ((!currItem->itemText.charStyle(e).font().canRender(numco)) && (checkerSettings.checkGlyphs))
4512 cbradney 289
                                                        itemError.insert(MissingGlyph, 0);
2111 cbradney 290
                                        }
291
                                        continue;
292
                                }
5980 avox 293
                                if ((!currItem->itemText.charStyle(e).font().canRender(chr)) && (checkerSettings.checkGlyphs))
4512 cbradney 294
                                        itemError.insert(MissingGlyph, 0);
2111 cbradney 295
                        }
5184 avox 296
#endif
2111 cbradney 297
                }
298
                if (itemError.count() != 0)
299
                        currDoc->docItemErrors.insert(currItem->ItemNr, itemError);
300
        }
6715 cbradney 301
 
302
        return ((currDoc->docItemErrors.count() != 0) || (currDoc->masterItemErrors.count() != 0) || (currDoc->docLayerErrors.count() != 0));
2111 cbradney 303
}