1
/***************************************************************************
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. *
8
***************************************************************************/
10
#include <QtCore/QVector>
14
#include "weather_parser.h"
15
#include "weather_global.h"
17
WeatherParser::WeatherParser()
22
Formatowanie wyjsciowej prognozy pogody
24
bool WeatherParser::getData( const QString& page, const PlainConfigFile* wConfig, Forecast& forecast ) const
28
bool cs = wConfig->readBoolEntry("Default","CaseSensitive");
30
int num_layouts = wConfig->readNumEntry("Default","Layouts");
34
QVector<WDataValue> valsList;
35
QStringList nextDaysNamesList;
36
QVector<WDataValue> nextDaysValsList;
40
for(int i=0; i<num_layouts; i++)
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");
47
for(int j=0; j<num_repeats; j++)
49
for(int k=0; k<num_values; k++)
51
QString valSection = QString("Layout%1Value%2").arg(i+1).arg(k+1);
53
dValue.Name = wConfig->readEntry(valSection,"Name");
54
dValue.Start = wConfig->readEntry(valSection,"Start");
55
dValue.End = wConfig->readEntry(valSection,"End");
58
result = getDataValue( page, dValue,cursor, wConfig, cs);
60
if(dValue.Content.isEmpty())
62
else if(dValue.Name == "Phantom")
65
if(layoutName == "Name")
66
forecast.LocationName = dValue.Content;
67
else if(layoutName == "Actual")
69
if(dValue.Name == "Name")
70
actualName = dValue.Content;
72
valsList.push_back(dValue);
74
else if(layoutName == "DaysNames")
76
if(dValue.Name == "Actual")
77
actualName = dValue.Content;
78
else if(dValue.Name == "NextDays")
79
nextDaysNamesList.push_back(dValue.Content);
81
else if(layoutName == "NextDays" && dValue.Name == "Name")
82
nextDaysNamesList.push_back(dValue.Content);
84
nextDaysValsList.push_back(dValue);
93
fDay["Name"] = actualName;
94
for(QVector<WDataValue>::iterator it = valsList.begin(); it != valsList.end(); it++)
96
if((*it).Name == "Icon")
97
fDay["Icon"] = WeatherGlobal::getIconPath( wConfig->readEntry("Icons",(*it).Content ) );
99
fDay[(*it).Name] = (*it).Content;
102
forecast.Days.push_back(fDay);
105
int num_vals = nextDaysValsList.count();
106
int num_names = nextDaysNamesList.count();
111
int T = num_vals/num_names;
117
for(int i=0; i<num_vals; i++)
119
WDataValue& val = nextDaysValsList[i];
122
fDay["Name"] = nextDaysNamesList[i/T];
124
if(val.Name == "Icon")
125
fDay["Icon"] = WeatherGlobal::getIconPath( wConfig->readEntry("Icons",val.Content) );
127
fDay[val.Name] = val.Content;
131
forecast.Days.push_back(fDay);
143
Wylawianie fragmentu ze strony
145
bool WeatherParser::getDataValue( const QString& page, WDataValue& wdata, int& cursor, const PlainConfigFile* wConfig, bool CaseSensitive) const
152
start = page.find(wdata.Start, cursor, CaseSensitive);
156
startData = start + wdata.Start.length();
158
end = page.find(wdata.End, startData, CaseSensitive);
163
wdata.Content = tagClean(page.mid(startData, end-startData));
170
Zwraca wyszukane identyfikatory miast dla szukanego miasta
172
void WeatherParser::getSearch( const QString& page, const PlainConfigFile* wConfig, const QString& serverConfigFile, CITYSEARCHRESULTS* results ) const
176
bool CaseSensitive = wConfig->readBoolEntry("Default","CaseSensitive");
178
long int start, separator, end, current;
179
long int startData, sepData;
181
QString section, starttag, septag, endtag, first, second;
183
int countResults = wConfig->readNumEntry("Name Search","SearchResults");
185
for(int i=0; i<countResults; i++)
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");
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);
201
if(end != -1 && start != -1 && separator != -1)
203
first = page.mid(startData, separator-startData);
204
second = page.mid(sepData, end-sepData);
206
if(!first.isEmpty() && !second.isEmpty())
209
results->push_back( CitySearchResult(tagClean(second), first, serverConfigFile) );
211
results->push_back( CitySearchResult(tagClean(first), second, serverConfigFile) );
213
current = end+endtag.length();
215
}while(end != -1 && start != -1 && separator != -1);
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)
226
QString WeatherParser::getFastSearch(const QString& link, const PlainConfigFile* wConfig) const
230
QString starttag, endtag;
231
long int start, end, startData;
233
starttag = wConfig->readEntry("Name Search","FastSearch Start");
234
endtag = wConfig->readEntry("Name Search","FastSearch End");
236
start = link.find(starttag, 0, false);
237
startData = start + starttag.length();
242
end = link.find(endtag, startData, false);
246
if(start == -1 || end == -1)
249
return link.mid(startData, end-startData);
253
Czyszczenie bufora z tag�w HTML i zamienianie znakow specjalnych
255
QString WeatherParser::tagClean( QString str ) const
259
//str.replace("°","�");
260
str.replace(" "," ");
265
start = str.find("<",start);
266
end = str.find(">",start+1);
268
if(start != -1 && end != -1)
269
str.replace(start,end+1-start, " ");
271
}while(start != -1 && end != -1);
273
str.replace("\n"," ");
274
str.replace("\r"," ");
275
str.replace(" "," ");
276
str.replace(" ,",",");
277
str.replace(" .",".");
278
str.replace(" :",":");
279
str.replace(" / ","/");