Subversion Repositories Scribus

Rev

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