Subversion Repositories Scribus

Rev

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

Rev Author Line No. Line
3 paul 1
/***************************************************************************
2
                          hyphenator.cpp  -  description
3
                             -------------------
4
    begin                : Sat Nov 02 08:00:00 CEST 2002
5
    copyright            : (C) 2002 by Franz Schmid
6
    email                : Franz.Schmid@altmuehlnet.de
7
 ***************************************************************************/
8
 
9
/***************************************************************************
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
 ***************************************************************************/
17
#include "hyphenator.h"
18
#include "hyphenator.moc"
19
#include "hyask.h"
128 Franz 20
 
21
#if (_MSC_VER >= 1200)
22
 #include "win-config.h"
23
#else
24
 #include "config.h"
25
#endif
26
 
3 paul 27
#include <qregexp.h>
28
#include <qcursor.h>
29
#include <qdir.h>
30
#include <cstdlib>
80 Franz 31
#include <string>
3 paul 32
#include "scribus.h"
33
 
34
Hyphenator::Hyphenator(QWidget* parent, ScribusDoc *dok, ScribusApp* app) : QObject( parent, "bu")
35
{
105 Franz 36
  char *filename = NULL;
3 paul 37
        doc = dok;
38
        Sap = app;
39
        MinWordLen = doc->MinWordLen;
40
        Automatic = doc->Automatic;
41
        AutoCheck = doc->AutoCheck;
42
        QString pfad = PREL;
43
        if (Sap->Sprachen.contains(doc->Language))
44
                Language = doc->Language;
45
        else
46
                {
47
                Language = Sap->Prefs.Language;
48
                doc->Language = Language;
49
                }
50
        pfad += "/lib/scribus/dicts/" + Sap->Sprachen[Language];
106 Franz 51
        QFile f(pfad);
52
        if (f.open(IO_ReadOnly))
53
                {
54
                QTextStream st(&f);
55
    QString line;
56
    line = st.readLine();
57
                codec = QTextCodec::codecForName(line);
58
                f.close();
59
                }
60
        else
61
                {
62
                useAble = false;
63
                hdict = NULL;
64
                return;
65
                }
3 paul 66
        QCString fn = pfad.latin1();
67
        filename = fn.data();
105 Franz 68
        hdict = hnj_hyphen_load(filename);
69
        if (hdict == NULL)
70
                useAble = false;
71
        else
72
                useAble = true;
3 paul 73
}
74
 
75
Hyphenator::~Hyphenator()
76
{
77
        hnj_hyphen_free(hdict);
78
}
79
 
80
void Hyphenator::slotNewDict(QString name)
81
{
105 Franz 82
  char *filename = NULL;
3 paul 83
        if (!Sap->Sprachen.contains(name))
84
                return;
85
        if (hdict != NULL)
86
                hnj_hyphen_free(hdict);
87
        QString pfad = PREL;
88
        Language = name;
89
        doc->Language = name;
90
        pfad += "/lib/scribus/dicts/" + Sap->Sprachen[Language];
106 Franz 91
        QFile f(pfad);
92
        if (f.open(IO_ReadOnly))
93
                {
94
                QTextStream st(&f);
95
    QString line;
96
    line = st.readLine();
97
                codec = QTextCodec::codecForName(line);
98
                f.close();
99
                }
100
        else
101
                {
102
                useAble = false;
103
                hdict = NULL;
104
                return;
105
                }
3 paul 106
        QCString fn = pfad.latin1();
107
        filename = fn.data();
105 Franz 108
        hdict = hnj_hyphen_load(filename);
109
        if (hdict == NULL)
110
                useAble = false;
111
        else
112
                useAble = true;
3 paul 113
}
114
 
115
void Hyphenator::slotNewSettings(int Wordlen, bool Autom, bool ACheck)
116
{
117
        MinWordLen = Wordlen;
118
        Automatic = Autom;
119
        AutoCheck = ACheck;
120
        doc->MinWordLen = Wordlen;
121
        doc->Automatic = Autom;
122
        doc->AutoCheck = AutoCheck;
123
}
124
 
125
void Hyphenator::slotHyphenateWord(PageItem* it, QString text, int firstC)
126
{
127
        const char *word;
128
  char *buffer;
129
  const int BORDER = 2;
130
        QCString te;
105 Franz 131
        if (!useAble)
132
                return;
133
        if (!Sap->Sprachen.contains(it->Language))
134
                return;
118 Franz 135
        uint maxC = it->Ptext.count() - 1;
3 paul 136
        QString found = text;
137
        if (static_cast<int>(found.length()) > MinWordLen)
138
                {
106 Franz 139
        te = codec->fromUnicode( found );
3 paul 140
                word = te.data();
141
                buffer = static_cast<char*>(malloc(strlen(word)+BORDER+3));
142
                if (buffer == NULL)
143
                        return;
144
                if (!hnj_hyphen_hyphenate(hdict, word, strlen(word), buffer));
145
                        {
146
                        uint i = 0;
147
                buffer[strlen(word)] = '\0';
118 Franz 148
                        for (i = 1; i < found.length()-1; ++i)
3 paul 149
                                {
118 Franz 150
                                it->Ptext.at(QMIN(maxC, i+firstC))->cstyle &= 127;              // Delete any old Hyphens
3 paul 151
                                }
118 Franz 152
                        for (i = 1; i < found.length()-1; ++i)
3 paul 153
                                {
154
                                if(buffer[i] & 1)
118 Franz 155
                                        it->Ptext.at(QMIN(maxC, i+firstC))->cstyle ^= 128;      // Set new Hyphens according Buffer
3 paul 156
                                }
157
                        }
158
                free(buffer);
159
                }
160
}
161
 
162
void Hyphenator::slotHyphenate(PageItem* it)
163
{
164
        const char *word;
165
  char *buffer;
166
  const int BORDER = 2;
167
        QString text = "";
168
        QString buf;
169
        QCString te;
105 Franz 170
        if (!useAble)
171
                return;
3 paul 172
        if (it->PType != 4)
173
                return;
174
        if (it->Ptext.count() == 0)
175
                return;
176
        for (uint a = 0; a < it->Ptext.count(); ++a)
177
                {
178
                if (it->HasSel)
179
                        {
180
                        if (it->Ptext.at(a)->cselect)
181
                                text += it->Ptext.at(a)->ch;
182
                        }
183
                else
184
                        text += it->Ptext.at(a)->ch;
185
                }
186
        int firstC = 0;
187
        if (it->HasSel)
188
                {
189
                for (uint a = 0; a < it->Ptext.count(); ++a)
190
                        {
191
                        if (it->Ptext.at(a)->cselect)
192
                                {
193
                                firstC = static_cast<int>(a);
194
                                break;
195
                                }
196
                        }
197
                }
198
        int lastC = 0;
199
        int Ccount = 0;
200
        QString found = "";
201
        QString found2 = "";
118 Franz 202
        uint maxC = it->Ptext.count() - 1;
3 paul 203
  qApp->setOverrideCursor(QCursor(waitCursor), true);
204
        while ((firstC+Ccount < static_cast<int>(text.length())) && (firstC != -1) && (lastC < static_cast<int>(text.length())))
205
                {
206
                firstC = text.find(QRegExp("\\w"), firstC+Ccount);
207
                if (firstC < 0)
208
                        break;
139 Franz 209
                lastC = text.find(QRegExp("\\s|\\W|\\d|\\n|\\r|\\t"), firstC);
3 paul 210
                if (lastC < 0)
211
                        lastC = static_cast<int>(text.length());
212
                Ccount = lastC - firstC;
213
                if (Ccount > MinWordLen)
214
                        {
215
                        found = text.mid(firstC, Ccount).lower();
216
                        found2 = text.mid(firstC, Ccount);
106 Franz 217
                te = codec->fromUnicode( found );
3 paul 218
                        word = te.data();
219
                        buffer = static_cast<char*>(malloc(strlen(word)+BORDER+3));
220
                        if (buffer == NULL)
221
                                break;
222
                        if (!hnj_hyphen_hyphenate(hdict, word, strlen(word), buffer));
223
                                {
224
                        uint i = 0;
225
                        buffer[strlen(word)] = '\0';
118 Franz 226
                                for (i = 1; i < found.length()-1; ++i)
3 paul 227
                                        {
118 Franz 228
                                        it->Ptext.at(QMIN(maxC, i+firstC))->cstyle &= 127;              // Delete any old Hyphens
3 paul 229
                                        }
230
                                bool hasHyphen = false;
118 Franz 231
                                for (i = 1; i < found.length()-1; ++i)
3 paul 232
                                        {
233
                                        if(buffer[i] & 1)
234
                                                {
235
                                                hasHyphen = true;
236
                                                break;
237
                                                }
238
                                        }
239
                                if (hasHyphen)
240
                                        {
241
                                        if (!Automatic)
242
                                                {
243
                                                QString outs = "";
244
                                                outs += found2[0];
118 Franz 245
                                                for (i = 1; i < found.length()-1; ++i)
3 paul 246
                                                        {
247
                                                        outs += found2[i];
248
                                                        if(buffer[i] & 1)
249
                                                                outs += "-";
250
                                                        }
251
                                                outs += found2.right(1);
252
                                                qApp->setOverrideCursor(QCursor(ArrowCursor), true);
253
                                                HyAsk *dia = new HyAsk((QWidget*)parent(), outs);
254
                                                qApp->processEvents();
255
                                                if (dia->exec())
256
                                                        {
257
                                                        outs = dia->Wort->text();
258
                                                        uint ii = 0;
259
                                                        for (i = 1; i < outs.length()-1; ++i)
260
                                                                {
261
                                                                QChar cht = outs[i];
262
                                                                if (cht == "-")
118 Franz 263
                                                                        it->Ptext.at(QMIN(maxC, ii+firstC))->cstyle ^= 128;     // Set new Hyphens according Buffer
3 paul 264
                                                                else
265
                                                                        ii++;
266
                                                                }
267
                                                        }
268
                                                else
269
                                                        {
270
                                                        free(buffer);
271
                                                        delete dia;
272
                                                        break;
273
                                                        }
274
                                                delete dia;
275
                                        qApp->setOverrideCursor(QCursor(waitCursor), true);
276
                                                }
277
                                        else
278
                                                {
118 Franz 279
                                                for (i = 1; i < found.length()-1; ++i)
3 paul 280
                                                        {
281
                                                        if(buffer[i] & 1)
118 Franz 282
                                                                it->Ptext.at(QMIN(maxC, i+firstC))->cstyle ^= 128;      // Set new Hyphens according Buffer
3 paul 283
                                                        }
284
                                        }
285
                                        }
286
                                }
287
                        free(buffer);
288
                        buffer = NULL;
289
                        }
290
                if (Ccount == 0)
291
                        Ccount++;
292
                }
293
        it->Dirty = true;
294
        qApp->setOverrideCursor(QCursor(ArrowCursor), true);
107 Franz 295
        it->OwnPage->RefreshItem(it);
3 paul 296
}