Subversion Repositories Scribus

Rev

Rev 4698 | Rev 5239 | 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;
45
        checkerSettings.checkAnnotations = currDoc->checkerProfiles[currDoc->curCheckProfile].checkAnnotations;
46
        checkerSettings.checkRasterPDF = currDoc->checkerProfiles[currDoc->curCheckProfile].checkRasterPDF;
47
        currDoc->docItemErrors.clear();
48
        currDoc->masterItemErrors.clear();
49
        errorCodes itemError;
50
        for (uint d = 0; d < currDoc->MasterItems.count(); ++d)
51
        {
52
                currItem = currDoc->MasterItems.at(d);
4698 cbradney 53
                if (!currItem->printEnabled())
4509 fschmid 54
                        continue;
2111 cbradney 55
                itemError.clear();
4084 cbradney 56
                if (((currItem->isAnnotation()) || (currItem->isBookmark)) && (checkerSettings.checkAnnotations))
4512 cbradney 57
                        itemError.insert(PDFAnnotField, 0);
2111 cbradney 58
                if (((currItem->fillTransparency() != 0.0) || (currItem->lineTransparency() != 0.0)) && (checkerSettings.checkTransparency))
4512 cbradney 59
                        itemError.insert(Transparency, 0);
3866 fschmid 60
                if ((currItem->GrType != 0) && (checkerSettings.checkTransparency))
61
                {
62
                        QPtrVector<VColorStop> colorStops = currItem->fill_gradient.colorStops();
63
                        for( uint offset = 0 ; offset < colorStops.count() ; offset++ )
64
                        {
65
                                if (colorStops[offset]->opacity != 1.0)
66
                                {
4512 cbradney 67
                                        itemError.insert(Transparency, 0);
3866 fschmid 68
                                        break;
69
                                }
70
                        }
71
                }
2111 cbradney 72
                if ((currItem->OwnPage == -1) && (checkerSettings.checkOrphans))
4512 cbradney 73
                        itemError.insert(ObjectNotOnPage, 0);
3625 avox 74
                if (currItem->asImageFrame())
2111 cbradney 75
                {
76
                        if ((!currItem->PicAvail) && (checkerSettings.checkPictures))
4512 cbradney 77
                                itemError.insert(MissingImage, 0);
2111 cbradney 78
                        else
79
                        {
3985 cbradney 80
                                if  (((qRound(72.0 / currItem->imageXScale()) < checkerSettings.minResolution) || (qRound(72.0 / currItem->imageYScale()) < checkerSettings.minResolution))
2111 cbradney 81
                                          && (currItem->isRaster) && (checkerSettings.checkResolution))
4512 cbradney 82
                                        itemError.insert(ImageDPITooLow, 0);
2111 cbradney 83
                                QFileInfo fi = QFileInfo(currItem->Pfile);
84
                                QString ext = fi.extension(false).lower();
85
                                if ((ext == "pdf") && (checkerSettings.checkRasterPDF))
4512 cbradney 86
                                        itemError.insert(PlacedPDF, 0);
2111 cbradney 87
                        }
88
                }
3625 avox 89
                if ((currItem->asTextFrame()) || (currItem->asPathText()))
2111 cbradney 90
                {
5184 avox 91
#ifndef NLS_PROTO
2111 cbradney 92
                        if ((currItem->itemText.count() > currItem->MaxChars) && (checkerSettings.checkOverflow))
4512 cbradney 93
                                itemError.insert(TextOverflow, 0);
5184 avox 94
                        for (uint e = 0; e < currItem->itemText.length(); ++e)
2111 cbradney 95
                        {
5184 avox 96
                                uint chr = currItem->itemText.text(e).unicode();
2447 fschmid 97
                                if ((chr == 13) || (chr == 32) || (chr == 29) || (chr == 28) || (chr == 27) || (chr == 26) || (chr == 25))
2111 cbradney 98
                                        continue;
5184 avox 99
                                if ((currItem->itemText.charStyle(e).cstyle & 64) || (currItem->itemText.charStyle(e).cstyle & 32))
2111 cbradney 100
                                {
5184 avox 101
                                        chx = currItem->itemText.text(e);
102
                                        if (chx.upper() != currItem->itemText.text(e))
2111 cbradney 103
                                                chx = chx.upper();
104
                                        chr = chx[0].unicode();
105
                                }
2285 fschmid 106
                                if (chr == 9)
107
                                {
5184 avox 108
                                        for (uint t1 = 0; t1 < currDoc->docParagraphStyles[currItem->itemText.at(e)->cab].tabValues().count(); t1++)
2285 fschmid 109
                                        {
5184 avox 110
                                                if (currDoc->docParagraphStyles[currItem->itemText.at(e)->cab].tabValues()[t1].tabFillChar.isNull())
2285 fschmid 111
                                                        continue;
5184 avox 112
                                                chx = QString(currDoc->docParagraphStyles[currItem->itemText.at(e)->cab].tabValues()[t1].tabFillChar);
113
                                                if ((currItem->itemText.charStyle(e).cstyle & 64) || (currItem->itemText.charStyle(e).cstyle & 32))
2285 fschmid 114
                                                {
5184 avox 115
                                                        if (chx.upper() != QString(currDoc->docParagraphStyles[currItem->itemText.at(e)->cab].tabValues()[t1].tabFillChar))
2285 fschmid 116
                                                                chx = chx.upper();
117
                                                }
118
                                                chr = chx[0].unicode();
119
                                                if ((!currItem->itemText.at(e)->cfont->CharWidth.contains(chr)) && (checkerSettings.checkGlyphs))
4512 cbradney 120
                                                        itemError.insert(MissingGlyph, 0);
2285 fschmid 121
                                        }
122
                                        for (uint t1 = 0; t1 < currItem->TabValues.count(); t1++)
123
                                        {
124
                                                if (currItem->TabValues[t1].tabFillChar.isNull())
125
                                                        continue;
126
                                                chx = QString(currItem->TabValues[t1].tabFillChar);
5184 avox 127
                                                if ((currItem->itemText.charStyle(e).cstyle & 64) || (currItem->itemText.charStyle(e).cstyle & 32))
2285 fschmid 128
                                                {
129
                                                        if (chx.upper() != QString(currItem->TabValues[t1].tabFillChar))
130
                                                                chx = chx.upper();
131
                                                }
132
                                                chr = chx[0].unicode();
133
                                                if ((!currItem->itemText.at(e)->cfont->CharWidth.contains(chr)) && (checkerSettings.checkGlyphs))
4512 cbradney 134
                                                        itemError.insert(MissingGlyph, 0);
2285 fschmid 135
                                        }
136
                                        continue;
137
                                }
2111 cbradney 138
                                if (chr == 30)
139
                                {
140
                                        for (uint numco = 0x30; numco < 0x3A; ++numco)
141
                                        {
142
                                                if ((!currItem->itemText.at(e)->cfont->CharWidth.contains(numco)) && (checkerSettings.checkGlyphs))
4512 cbradney 143
                                                        itemError.insert(MissingGlyph, 0);
2111 cbradney 144
                                        }
145
                                        continue;
146
                                }
147
                                if ((!currItem->itemText.at(e)->cfont->CharWidth.contains(chr)) && (checkerSettings.checkGlyphs))
4512 cbradney 148
                                        itemError.insert(MissingGlyph, 0);
2111 cbradney 149
                        }
5184 avox 150
#endif
2111 cbradney 151
                }
152
                if (itemError.count() != 0)
153
                        currDoc->masterItemErrors.insert(currItem->ItemNr, itemError);
154
        }
155
        for (uint d = 0; d < currDoc->DocItems.count(); ++d)
156
        {
157
                currItem = currDoc->DocItems.at(d);
4698 cbradney 158
                if (!currItem->printEnabled())
4509 fschmid 159
                        continue;
2111 cbradney 160
                itemError.clear();
161
                if (((currItem->fillTransparency() != 0.0) || (currItem->lineTransparency() != 0.0)) && (checkerSettings.checkTransparency))
4512 cbradney 162
                        itemError.insert(Transparency, 0);
3866 fschmid 163
                if ((currItem->GrType != 0) && (checkerSettings.checkTransparency))
164
                {
165
                        QPtrVector<VColorStop> colorStops = currItem->fill_gradient.colorStops();
166
                        for( uint offset = 0 ; offset < colorStops.count() ; offset++ )
167
                        {
168
                                if (colorStops[offset]->opacity != 1.0)
169
                                {
4512 cbradney 170
                                        itemError.insert(Transparency, 0);
3866 fschmid 171
                                        break;
172
                                }
173
                        }
174
                }
4084 cbradney 175
                if (((currItem->isAnnotation()) || (currItem->isBookmark)) && (checkerSettings.checkAnnotations))
4512 cbradney 176
                        itemError.insert(PDFAnnotField, 0);
2111 cbradney 177
                if ((currItem->OwnPage == -1) && (checkerSettings.checkOrphans))
4512 cbradney 178
                        itemError.insert(ObjectNotOnPage, 0);
3625 avox 179
                if (currItem->asImageFrame())
2111 cbradney 180
                {
181
                        if ((!currItem->PicAvail) && (checkerSettings.checkPictures))
4512 cbradney 182
                                itemError.insert(MissingImage, 0);
2111 cbradney 183
                        else
184
                        {
3985 cbradney 185
                                if  (((qRound(72.0 / currItem->imageYScale()) < checkerSettings.minResolution) || (qRound(72.0 / currItem->imageYScale()) < checkerSettings.minResolution))
2111 cbradney 186
                                           && (currItem->isRaster) && (checkerSettings.checkResolution))
4512 cbradney 187
                                        itemError.insert(ImageDPITooLow, 0);
2111 cbradney 188
                                QFileInfo fi = QFileInfo(currItem->Pfile);
189
                                QString ext = fi.extension(false).lower();
190
                                if ((ext == "pdf") && (checkerSettings.checkRasterPDF))
4512 cbradney 191
                                        itemError.insert(PlacedPDF, 0);
2111 cbradney 192
                        }
193
                }
3625 avox 194
                if ((currItem->asTextFrame()) || (currItem->asPathText()))
2111 cbradney 195
                {
5184 avox 196
#ifndef NLS_PROTO
2111 cbradney 197
                        if ((currItem->itemText.count() > currItem->MaxChars) && (checkerSettings.checkOverflow))
4512 cbradney 198
                                itemError.insert(TextOverflow, 0);
2111 cbradney 199
                        for (uint e = 0; e < currItem->itemText.count(); ++e)
200
                        {
5184 avox 201
                                uint chr = currItem->itemText.text(e).unicode();
2447 fschmid 202
                                if ((chr == 13) || (chr == 32) || (chr == 29) || (chr == 28) || (chr == 27) || (chr == 26) || (chr == 25))
2111 cbradney 203
                                        continue;
5184 avox 204
                                if ((currItem->itemText.charStyle(e).cstyle & 64) || (currItem->itemText.charStyle(e).cstyle & 32))
2111 cbradney 205
                                {
5184 avox 206
                                        chx = currItem->itemText.text(e,1);
2111 cbradney 207
                                        if (chx.upper() != currItem->itemText.at(e)->ch)
208
                                                chx = chx.upper();
209
                                        chr = chx[0].unicode();
210
                                }
2285 fschmid 211
                                if (chr == 9)
212
                                {
5184 avox 213
                                        for (uint t1 = 0; t1 < currDoc->docParagraphStyles[currItem->itemText.at(e)->cab].tabValues().count(); t1++)
2285 fschmid 214
                                        {
5184 avox 215
                                                if (currDoc->docParagraphStyles[currItem->itemText.at(e)->cab].tabValues()[t1].tabFillChar.isNull())
2285 fschmid 216
                                                        continue;
5184 avox 217
                                                chx = QString(currDoc->docParagraphStyles[currItem->itemText.at(e)->cab].tabValues()[t1].tabFillChar);
218
                                                if ((currItem->itemText.charStyle(e).cstyle & 64) || (currItem->itemText.charStyle(e).cstyle & 32))
2285 fschmid 219
                                                {
5184 avox 220
                                                        if (chx.upper() != QString(currDoc->docParagraphStyles[currItem->itemText.at(e)->cab].tabValues()[t1].tabFillChar))
2285 fschmid 221
                                                                chx = chx.upper();
222
                                                }
223
                                                chr = chx[0].unicode();
224
                                                if ((!currItem->itemText.at(e)->cfont->CharWidth.contains(chr)) && (checkerSettings.checkGlyphs))
4512 cbradney 225
                                                        itemError.insert(MissingGlyph, 0);
2285 fschmid 226
                                        }
227
                                        for (uint t1 = 0; t1 < currItem->TabValues.count(); t1++)
228
                                        {
229
                                                if (currItem->TabValues[t1].tabFillChar.isNull())
230
                                                        continue;
231
                                                chx = QString(currItem->TabValues[t1].tabFillChar);
5184 avox 232
                                                if ((currItem->itemText.charStyle(e).cstyle & 64) || (currItem->itemText.charStyle(e).cstyle & 32))
2285 fschmid 233
                                                {
234
                                                        if (chx.upper() != QString(currItem->TabValues[t1].tabFillChar))
235
                                                                chx = chx.upper();
236
                                                }
237
                                                chr = chx[0].unicode();
238
                                                if ((!currItem->itemText.at(e)->cfont->CharWidth.contains(chr)) && (checkerSettings.checkGlyphs))
4512 cbradney 239
                                                        itemError.insert(MissingGlyph, 0);
2285 fschmid 240
                                        }
241
                                        continue;
242
                                }
2111 cbradney 243
                                if (chr == 30)
244
                                {
245
                                        for (uint numco = 0x30; numco < 0x3A; ++numco)
246
                                        {
247
                                                if ((!currItem->itemText.at(e)->cfont->CharWidth.contains(numco)) && (checkerSettings.checkGlyphs))
4512 cbradney 248
                                                        itemError.insert(MissingGlyph, 0);
2111 cbradney 249
                                        }
250
                                        continue;
251
                                }
252
                                if ((!currItem->itemText.at(e)->cfont->CharWidth.contains(chr)) && (checkerSettings.checkGlyphs))
4512 cbradney 253
                                        itemError.insert(MissingGlyph, 0);
2111 cbradney 254
                        }
5184 avox 255
#endif
2111 cbradney 256
                }
257
                if (itemError.count() != 0)
258
                        currDoc->docItemErrors.insert(currItem->ItemNr, itemError);
259
        }
260
}