~ubuntu-branches/ubuntu/natty/kadu/natty

« back to all changes in this revision

Viewing changes to modules/weather/weather_parser.cpp

  • Committer: Package Import Robot
  • Author(s): Kiszel Kristóf
  • Date: 2010-07-21 15:24:54 UTC
  • mfrom: (0.6.1) (0.5.1) (1.4.1) (22.1.2 maverick)
  • Revision ID: package-import@ubuntu.com-20100721152454-vttqle18lovfudni
Tags: 0.6.5.4.ds1-3ubuntu2
Remove libqt4-webkit-dev from build-depends and add
libqtwebkit-dev for qtwebkit transition

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/***************************************************************************
 
2
 *                                                                         *
 
3
 *   This program is free software; you can redistribute it and/or modify  *
 
4
 *   it under the terms of the GNU General Public License as published by  *
 
5
 *   the Free Software Foundation; either version 2 of the License, or     *
 
6
 *   (at your option) any later version.                                   *
 
7
 *                                                                         *
 
8
 ***************************************************************************/
 
9
 
 
10
#include <QtCore/QVector>
 
11
 
 
12
#include "misc.h"
 
13
 
 
14
#include "weather_parser.h"
 
15
#include "weather_global.h"
 
16
 
 
17
WeatherParser::WeatherParser()
 
18
{
 
19
}
 
20
 
 
21
/**
 
22
        Formatowanie wyjsciowej prognozy pogody
 
23
**/
 
24
bool WeatherParser::getData( const QString& page, const PlainConfigFile* wConfig, Forecast& forecast ) const
 
25
{
 
26
        kdebugf();
 
27
 
 
28
        bool cs = wConfig->readBoolEntry("Default","CaseSensitive");
 
29
        
 
30
        int num_layouts = wConfig->readNumEntry("Default","Layouts");
 
31
        WDataValue dValue;
 
32
        
 
33
        QString actualName;
 
34
        QVector<WDataValue> valsList;
 
35
        QStringList nextDaysNamesList;
 
36
        QVector<WDataValue> nextDaysValsList;
 
37
        
 
38
        bool result;
 
39
        int cursor = 0;
 
40
        for(int i=0; i<num_layouts; i++)
 
41
        {
 
42
                QString layoutSection = QString("Layout%1").arg(i+1);
 
43
                QString layoutName = wConfig->readEntry(layoutSection,"Name");
 
44
                int num_repeats = wConfig->readNumEntry(layoutSection,"Repeats");
 
45
                int num_values = wConfig->readNumEntry(layoutSection,"Values");
 
46
                
 
47
                for(int j=0; j<num_repeats; j++)
 
48
                {
 
49
                        for(int k=0; k<num_values; k++)
 
50
                        {
 
51
                                QString valSection = QString("Layout%1Value%2").arg(i+1).arg(k+1);
 
52
                                
 
53
                                dValue.Name = wConfig->readEntry(valSection,"Name");
 
54
                                dValue.Start = wConfig->readEntry(valSection,"Start");
 
55
                                dValue.End = wConfig->readEntry(valSection,"End");
 
56
                                dValue.Content = "";
 
57
                                
 
58
                                result = getDataValue( page, dValue,cursor, wConfig, cs);
 
59
                                
 
60
                                if(dValue.Content.isEmpty())
 
61
                                        continue;
 
62
                                else if(dValue.Name == "Phantom")
 
63
                                        continue;
 
64
                                
 
65
                                if(layoutName == "Name")
 
66
                                        forecast.LocationName = dValue.Content;
 
67
                                else if(layoutName == "Actual")
 
68
                                {
 
69
                                        if(dValue.Name == "Name")
 
70
                                                actualName = dValue.Content;
 
71
                                        else
 
72
                                                valsList.push_back(dValue);
 
73
                                }
 
74
                                else if(layoutName == "DaysNames")
 
75
                                {
 
76
                                        if(dValue.Name == "Actual")
 
77
                                                actualName = dValue.Content;
 
78
                                        else if(dValue.Name == "NextDays")
 
79
                                                nextDaysNamesList.push_back(dValue.Content);
 
80
                                }
 
81
                                else if(layoutName == "NextDays" && dValue.Name == "Name")
 
82
                                        nextDaysNamesList.push_back(dValue.Content);
 
83
                                else
 
84
                                        nextDaysValsList.push_back(dValue);
 
85
                        }
 
86
                }
 
87
        }
 
88
        
 
89
        QString Data("");
 
90
        
 
91
        ForecastDay fDay;
 
92
        
 
93
        fDay["Name"] = actualName;
 
94
        for(QVector<WDataValue>::iterator it = valsList.begin(); it != valsList.end(); it++)
 
95
        {
 
96
                if((*it).Name == "Icon")
 
97
                        fDay["Icon"] = WeatherGlobal::getIconPath( wConfig->readEntry("Icons",(*it).Content ) );
 
98
                else
 
99
                        fDay[(*it).Name] = (*it).Content;
 
100
        }
 
101
        
 
102
        forecast.Days.push_back(fDay);
 
103
        fDay.clear();
 
104
        
 
105
        int num_vals = nextDaysValsList.count();
 
106
        int num_names = nextDaysNamesList.count();
 
107
        
 
108
        if(!num_names)
 
109
                return false;
 
110
                
 
111
        int T = num_vals/num_names;
 
112
        
 
113
        if(!T)
 
114
                return false;
 
115
        
 
116
        Data = "";
 
117
        for(int i=0; i<num_vals; i++)
 
118
        {
 
119
                WDataValue& val = nextDaysValsList[i];
 
120
        
 
121
                if(i%T == 0)
 
122
                        fDay["Name"] = nextDaysNamesList[i/T];
 
123
                
 
124
                if(val.Name == "Icon")
 
125
                        fDay["Icon"] = WeatherGlobal::getIconPath( wConfig->readEntry("Icons",val.Content) );
 
126
                else
 
127
                        fDay[val.Name] = val.Content;
 
128
                
 
129
                if(i%T == T-1)
 
130
                {
 
131
                        forecast.Days.push_back(fDay);
 
132
                        fDay.clear();
 
133
                        
 
134
                        Data = "";
 
135
                }
 
136
        }
 
137
 
 
138
        kdebugf2();
 
139
        return true;
 
140
}
 
141
 
 
142
/**
 
143
        Wylawianie fragmentu ze strony
 
144
**/
 
145
bool WeatherParser::getDataValue( const QString& page, WDataValue& wdata, int& cursor, const PlainConfigFile* wConfig, bool CaseSensitive) const
 
146
{
 
147
        kdebugf();
 
148
        
 
149
        long int start, end;
 
150
        long int startData;
 
151
        
 
152
        start = page.find(wdata.Start, cursor, CaseSensitive);
 
153
        if(start == -1)
 
154
                return false;
 
155
        
 
156
        startData = start + wdata.Start.length();
 
157
        
 
158
        end = page.find(wdata.End, startData, CaseSensitive);
 
159
        if(end == -1)
 
160
                return false;
 
161
        
 
162
        cursor = end;
 
163
        wdata.Content = tagClean(page.mid(startData, end-startData));
 
164
        
 
165
        kdebugf2();
 
166
        return true;
 
167
}
 
168
 
 
169
/**
 
170
        Zwraca wyszukane identyfikatory miast dla szukanego miasta
 
171
**/
 
172
void WeatherParser::getSearch( const QString& page, const PlainConfigFile* wConfig, const QString& serverConfigFile, CITYSEARCHRESULTS* results ) const
 
173
{
 
174
        kdebugf();
 
175
        
 
176
        bool CaseSensitive = wConfig->readBoolEntry("Default","CaseSensitive");
 
177
 
 
178
        long int start, separator, end, current;
 
179
        long int startData, sepData;
 
180
        bool idFirst;
 
181
        QString section, starttag, septag, endtag, first, second;
 
182
        
 
183
        int countResults = wConfig->readNumEntry("Name Search","SearchResults");
 
184
        
 
185
        for(int i=0; i<countResults; i++)
 
186
        {
 
187
                section = QString("SearchResult%1").arg(i+1);
 
188
                idFirst = wConfig->readBoolEntry(section,"IDFirst");
 
189
                starttag = wConfig->readEntry(section,"Start");
 
190
                septag = wConfig->readEntry(section,"Separator");
 
191
                endtag = wConfig->readEntry(section,"End");
 
192
        
 
193
                current = 0;
 
194
                do{
 
195
                        start = page.find(starttag, current, CaseSensitive);    
 
196
                        startData = start + starttag.length();
 
197
                        separator = page.find(septag, startData, CaseSensitive);
 
198
                        sepData = separator + septag.length();
 
199
                        end = page.find(endtag, sepData, CaseSensitive);
 
200
                        
 
201
                        if(end != -1 && start != -1 && separator != -1)
 
202
                        {
 
203
                                first = page.mid(startData, separator-startData);
 
204
                                second = page.mid(sepData, end-sepData);
 
205
                                
 
206
                                if(!first.isEmpty() && !second.isEmpty())
 
207
                                {
 
208
                                        if(idFirst)
 
209
                                                results->push_back( CitySearchResult(tagClean(second), first, serverConfigFile) );
 
210
                                        else
 
211
                                                results->push_back( CitySearchResult(tagClean(first), second, serverConfigFile) );
 
212
                                }
 
213
                                current = end+endtag.length();
 
214
                        }
 
215
                }while(end != -1 && start != -1 && separator != -1);
 
216
        }
 
217
        
 
218
        kdebugf2();
 
219
}
 
220
 
 
221
/**
 
222
        Wylowienie szukanego ID miasta z adresu URL.
 
223
        (niekt�re serwisy przekierowywuja od razu na
 
224
        strone z prognoza, gdy znajda tylko jedno miasto)
 
225
**/
 
226
QString WeatherParser::getFastSearch(const QString& link, const PlainConfigFile* wConfig) const
 
227
{
 
228
        kdebugf();
 
229
        
 
230
        QString starttag, endtag;
 
231
        long int start, end, startData;
 
232
        
 
233
        starttag = wConfig->readEntry("Name Search","FastSearch Start");
 
234
        endtag = wConfig->readEntry("Name Search","FastSearch End");
 
235
        
 
236
        start = link.find(starttag, 0, false);
 
237
        startData = start + starttag.length();
 
238
        
 
239
        if(endtag.isEmpty())
 
240
                end = link.length();
 
241
        else
 
242
                end = link.find(endtag, startData, false);
 
243
        
 
244
        kdebugf2();
 
245
        
 
246
        if(start == -1 || end == -1)
 
247
                return "";
 
248
        else
 
249
                return link.mid(startData, end-startData);
 
250
}
 
251
 
 
252
/**
 
253
        Czyszczenie bufora z tag�w HTML i zamienianie znakow specjalnych
 
254
**/
 
255
QString WeatherParser::tagClean( QString str ) const
 
256
{
 
257
        kdebugf();
 
258
        
 
259
        //str.replace("&deg;","�");
 
260
        str.replace("&nbsp;"," ");
 
261
        
 
262
        int start, end;
 
263
        start = 0;
 
264
        do{
 
265
                start = str.find("<",start);
 
266
                end = str.find(">",start+1);
 
267
                
 
268
                if(start != -1 && end != -1)
 
269
                        str.replace(start,end+1-start, " ");
 
270
                        
 
271
        }while(start != -1 && end != -1);
 
272
        
 
273
        str.replace("\n"," ");
 
274
        str.replace("\r"," ");
 
275
        str.replace("  "," ");
 
276
        str.replace(" ,",",");
 
277
        str.replace(" .",".");
 
278
        str.replace(" :",":");
 
279
        str.replace(" / ","/");
 
280
        
 
281
        kdebugf2();
 
282
        return str;
 
283
}
 
284