Subversion Repositories Scribus

Rev

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