Subversion Repositories Scribus

Rev

Rev 139 | Rev 164 | 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
 
159 Franz 34
/*!
35
 \fn Hyphenator::Hyphenator(QWidget* parent, ScribusDoc *dok, ScribusApp* app)
36
 \brief Constructor reads user configuration and sets hyphenator properties.
37
 \date
38
 \author Franz Schmid
39
 \param parent unused
40
 \param dok ScribusDoc reference. It's used for preferences accessing.
41
 \param app ScribusApp reference. It's used for preferences accessing.
42
 \retval None
43
*/
3 paul 44
Hyphenator::Hyphenator(QWidget* parent, ScribusDoc *dok, ScribusApp* app) : QObject( parent, "bu")
45
{
105 Franz 46
  char *filename = NULL;
3 paul 47
        doc = dok;
48
        Sap = app;
49
        MinWordLen = doc->MinWordLen;
50
        Automatic = doc->Automatic;
51
        AutoCheck = doc->AutoCheck;
52
        QString pfad = PREL;
53
        if (Sap->Sprachen.contains(doc->Language))
54
                Language = doc->Language;
55
        else
56
                {
57
                Language = Sap->Prefs.Language;
58
                doc->Language = Language;
59
                }
60
        pfad += "/lib/scribus/dicts/" + Sap->Sprachen[Language];
106 Franz 61
        QFile f(pfad);
62
        if (f.open(IO_ReadOnly))
63
                {
64
                QTextStream st(&f);
65
    QString line;
66
    line = st.readLine();
67
                codec = QTextCodec::codecForName(line);
68
                f.close();
69
                }
70
        else
71
                {
72
                useAble = false;
73
                hdict = NULL;
74
                return;
75
                }
3 paul 76
        QCString fn = pfad.latin1();
77
        filename = fn.data();
105 Franz 78
        hdict = hnj_hyphen_load(filename);
79
        if (hdict == NULL)
80
                useAble = false;
81
        else
82
                useAble = true;
3 paul 83
}
84
 
159 Franz 85
/*!
86
 \fn Hyphenator::~Hyphenator()
87
 \brief Safely cleans hyphen.
88
 \date
89
 \author Franz Schmid
90
 \param None
91
 \retval None
92
 */
3 paul 93
Hyphenator::~Hyphenator()
94
{
95
        hnj_hyphen_free(hdict);
96
}
97
 
159 Franz 98
/*!
99
 \fn void Hyphenator::slotNewDict(QString name)
100
 \brief Loads dictionary and fills parameters like \a useAble, \a codec, \a hdict.
101
 \date
102
 \author Franz Schmid
103
 \param name is the name of specified language - filename.
104
 \retval None
105
 */
3 paul 106
void Hyphenator::slotNewDict(QString name)
107
{
105 Franz 108
  char *filename = NULL;
3 paul 109
        if (!Sap->Sprachen.contains(name))
110
                return;
111
        if (hdict != NULL)
112
                hnj_hyphen_free(hdict);
113
        QString pfad = PREL;
114
        Language = name;
115
        doc->Language = name;
116
        pfad += "/lib/scribus/dicts/" + Sap->Sprachen[Language];
106 Franz 117
        QFile f(pfad);
118
        if (f.open(IO_ReadOnly))
119
                {
120
                QTextStream st(&f);
121
    QString line;
122
    line = st.readLine();
123
                codec = QTextCodec::codecForName(line);
124
                f.close();
125
                }
126
        else
127
                {
128
                useAble = false;
129
                hdict = NULL;
130
                return;
131
                }
3 paul 132
        QCString fn = pfad.latin1();
133
        filename = fn.data();
105 Franz 134
        hdict = hnj_hyphen_load(filename);
135
        if (hdict == NULL)
136
                useAble = false;
137
        else
138
                useAble = true;
3 paul 139
}
140
 
159 Franz 141
/*!
142
 \fn void Hyphenator::slotNewSettings(int Wordlen, bool Autom, bool ACheck)
143
 \brief Writes actual hyphen configuration into \a doc object.
144
 \date
145
 \author Franz Schmid
146
 \param WordLen lenght of the word.
147
 \param Autom is automatic flag.
148
 \param ACheck AutoCheck flag.
149
 \retval None
150
 */
3 paul 151
void Hyphenator::slotNewSettings(int Wordlen, bool Autom, bool ACheck)
152
{
153
        MinWordLen = Wordlen;
154
        Automatic = Autom;
155
        AutoCheck = ACheck;
156
        doc->MinWordLen = Wordlen;
157
        doc->Automatic = Autom;
158
        doc->AutoCheck = AutoCheck;
159
}
160
 
159 Franz 161
/*!
162
 \fn void Hyphenator::slotHyphenateWord(PageItem* it, QString text, int firstC)
163
 \brief Make hyphenation when user edits text in text frame manually.
164
 \detail If is everything set correctly and textframe selected language fits the
165
    dictionary language. At first removes any old hyphens then sets new one.
166
 \param it references \see PageItem - text frame.
167
 \param text is a word to hyphenate.
168
 \param firstC is the first character of the word in \a it item.
169
 \retval None
170
 */
3 paul 171
void Hyphenator::slotHyphenateWord(PageItem* it, QString text, int firstC)
172
{
173
        const char *word;
174
  char *buffer;
175
  const int BORDER = 2;
176
        QCString te;
105 Franz 177
        if (!useAble)
178
                return;
179
        if (!Sap->Sprachen.contains(it->Language))
180
                return;
118 Franz 181
        uint maxC = it->Ptext.count() - 1;
3 paul 182
        QString found = text;
183
        if (static_cast<int>(found.length()) > MinWordLen)
184
                {
106 Franz 185
        te = codec->fromUnicode( found );
3 paul 186
                word = te.data();
187
                buffer = static_cast<char*>(malloc(strlen(word)+BORDER+3));
188
                if (buffer == NULL)
189
                        return;
190
                if (!hnj_hyphen_hyphenate(hdict, word, strlen(word), buffer));
191
                        {
192
                        uint i = 0;
193
                buffer[strlen(word)] = '\0';
118 Franz 194
                        for (i = 1; i < found.length()-1; ++i)
3 paul 195
                                {
118 Franz 196
                                it->Ptext.at(QMIN(maxC, i+firstC))->cstyle &= 127;              // Delete any old Hyphens
3 paul 197
                                }
118 Franz 198
                        for (i = 1; i < found.length()-1; ++i)
3 paul 199
                                {
200
                                if(buffer[i] & 1)
118 Franz 201
                                        it->Ptext.at(QMIN(maxC, i+firstC))->cstyle ^= 128;      // Set new Hyphens according Buffer
3 paul 202
                                }
203
                        }
204
                free(buffer);
205
                }
206
}
207
 
159 Franz 208
/*!
209
 \fn void Hyphenator::slotHyphenate(PageItem* it)
210
 \brief Make hyphenation as described in \see slotHyphenateWord for the whole text frame.
211
 \date
212
 \author Franz Schmid
213
 \param it references \see PageItem - text frame.
214
 \retval None
215
 */
3 paul 216
void Hyphenator::slotHyphenate(PageItem* it)
217
{
218
        const char *word;
219
  char *buffer;
220
  const int BORDER = 2;
221
        QString text = "";
222
        QString buf;
223
        QCString te;
105 Franz 224
        if (!useAble)
225
                return;
3 paul 226
        if (it->PType != 4)
227
                return;
228
        if (it->Ptext.count() == 0)
229
                return;
230
        for (uint a = 0; a < it->Ptext.count(); ++a)
231
                {
232
                if (it->HasSel)
233
                        {
234
                        if (it->Ptext.at(a)->cselect)
235
                                text += it->Ptext.at(a)->ch;
236
                        }
237
                else
238
                        text += it->Ptext.at(a)->ch;
239
                }
240
        int firstC = 0;
241
        if (it->HasSel)
242
                {
243
                for (uint a = 0; a < it->Ptext.count(); ++a)
244
                        {
245
                        if (it->Ptext.at(a)->cselect)
246
                                {
247
                                firstC = static_cast<int>(a);
248
                                break;
249
                                }
250
                        }
251
                }
252
        int lastC = 0;
253
        int Ccount = 0;
254
        QString found = "";
255
        QString found2 = "";
118 Franz 256
        uint maxC = it->Ptext.count() - 1;
3 paul 257
  qApp->setOverrideCursor(QCursor(waitCursor), true);
258
        while ((firstC+Ccount < static_cast<int>(text.length())) && (firstC != -1) && (lastC < static_cast<int>(text.length())))
259
                {
260
                firstC = text.find(QRegExp("\\w"), firstC+Ccount);
261
                if (firstC < 0)
262
                        break;
139 Franz 263
                lastC = text.find(QRegExp("\\s|\\W|\\d|\\n|\\r|\\t"), firstC);
3 paul 264
                if (lastC < 0)
265
                        lastC = static_cast<int>(text.length());
266
                Ccount = lastC - firstC;
267
                if (Ccount > MinWordLen)
268
                        {
269
                        found = text.mid(firstC, Ccount).lower();
270
                        found2 = text.mid(firstC, Ccount);
106 Franz 271
                te = codec->fromUnicode( found );
3 paul 272
                        word = te.data();
273
                        buffer = static_cast<char*>(malloc(strlen(word)+BORDER+3));
274
                        if (buffer == NULL)
275
                                break;
276
                        if (!hnj_hyphen_hyphenate(hdict, word, strlen(word), buffer));
277
                                {
278
                        uint i = 0;
279
                        buffer[strlen(word)] = '\0';
118 Franz 280
                                for (i = 1; i < found.length()-1; ++i)
3 paul 281
                                        {
118 Franz 282
                                        it->Ptext.at(QMIN(maxC, i+firstC))->cstyle &= 127;              // Delete any old Hyphens
3 paul 283
                                        }
284
                                bool hasHyphen = false;
118 Franz 285
                                for (i = 1; i < found.length()-1; ++i)
3 paul 286
                                        {
287
                                        if(buffer[i] & 1)
288
                                                {
289
                                                hasHyphen = true;
290
                                                break;
291
                                                }
292
                                        }
293
                                if (hasHyphen)
294
                                        {
295
                                        if (!Automatic)
296
                                                {
297
                                                QString outs = "";
298
                                                outs += found2[0];
118 Franz 299
                                                for (i = 1; i < found.length()-1; ++i)
3 paul 300
                                                        {
301
                                                        outs += found2[i];
302
                                                        if(buffer[i] & 1)
303
                                                                outs += "-";
304
                                                        }
305
                                                outs += found2.right(1);
306
                                                qApp->setOverrideCursor(QCursor(ArrowCursor), true);
307
                                                HyAsk *dia = new HyAsk((QWidget*)parent(), outs);
308
                                                qApp->processEvents();
309
                                                if (dia->exec())
310
                                                        {
311
                                                        outs = dia->Wort->text();
312
                                                        uint ii = 0;
313
                                                        for (i = 1; i < outs.length()-1; ++i)
314
                                                                {
315
                                                                QChar cht = outs[i];
316
                                                                if (cht == "-")
118 Franz 317
                                                                        it->Ptext.at(QMIN(maxC, ii+firstC))->cstyle ^= 128;     // Set new Hyphens according Buffer
3 paul 318
                                                                else
319
                                                                        ii++;
320
                                                                }
321
                                                        }
322
                                                else
323
                                                        {
324
                                                        free(buffer);
325
                                                        delete dia;
326
                                                        break;
327
                                                        }
328
                                                delete dia;
329
                                        qApp->setOverrideCursor(QCursor(waitCursor), true);
330
                                                }
331
                                        else
332
                                                {
118 Franz 333
                                                for (i = 1; i < found.length()-1; ++i)
3 paul 334
                                                        {
335
                                                        if(buffer[i] & 1)
118 Franz 336
                                                                it->Ptext.at(QMIN(maxC, i+firstC))->cstyle ^= 128;      // Set new Hyphens according Buffer
3 paul 337
                                                        }
338
                                        }
339
                                        }
340
                                }
341
                        free(buffer);
342
                        buffer = NULL;
343
                        }
344
                if (Ccount == 0)
345
                        Ccount++;
346
                }
347
        it->Dirty = true;
348
        qApp->setOverrideCursor(QCursor(ArrowCursor), true);
107 Franz 349
        it->OwnPage->RefreshItem(it);
3 paul 350
}