Subversion Repositories Scribus

Rev

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