Subversion Repositories Scribus

Rev

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