'------------------------------------------------------
' ListaItaliani2 Ugo Bottari (AlpVir) - 29/9/2013
'------------------------------------------------------
'
' Legge la pagina del forum di B4A che contiene il post con la lista degli italiani
' Rielabora il contenuto della pagina e visualizza i dati in una griglia. Tutto qui !
'
' Ovviamente la pagina di "fiaful" in questione deve essere sempre formattata allo stesso identico modo, pena il
' fallimento della procedura. "fiaful" ne deve terer conto. Magari potrebbe iniziare l'elenco con un
' <font color="#FF0000"><b>LISTA ITALIANI</font></b>
' e terminare con un
' <font color="#FF0000"><b>FINE ELENCO</font></b>
'
' Possibili miglioramenti :
' a) ordine alfabetico di città
' b) selezionando una riga appare una videata con una serie di informazioni relative alla persona selezionata
' Occorre però un database in cui memorizzare queste informazioni, che dovranno essere immesse dalle singole persone.
' Possibili campi di questo db :
' ID, Nome e cognome, Email, Sito, password, username di B4A, Note (campo memo in cui ciascuno memorizza quello che vuole)
'
' Maxi miglioramento : la pagina di cui sopra servirebbe SOLO all'importazione dei suoi dati (della pagina cioè) in un db remoto
' La visualizzazione all'interno dell'app sarebbe deputata ad un codice quasi del tutto diverso che non fa il parsing di una
' pagina HTML ma legge un db remoto. Se si fa trenta si può fare anche trentuno; in altre parole se si crea un db remoto tanto vale
' aggiungerci i dati prelevati dalla pagina del forum.
'
' L'icona dell'app potrebbe essere il simbolo del B4A soprapposto al tricolore.
'
' NOTA : Tutto fattibile ma ... ci vuole tempo
'
' Librerie necessarie: HTTP 1.26 e xnObjects 2.22
'
'-----------------------------------------------------------------------------------------
Sub Process_Globals
Dim hc As HttpClient
End Sub
Sub Globals
hc.Initialize("hc") ' client http
Dim Tutto As String ' l'intera pagina HTML in una stringa
Dim gg As xnGrid ' griglia
End Sub
Sub LeggiFile
'--- Leggo il file TXT che ho creato una volta per tutte.
' In questo modo evito i dovermi collegare ogni volta alla pagina originale.
'
Dim resultString As String
Dim Riga As String
Dim Tutto As String
'
Dim TextReader1 As TextReader
Dim Line As String
TextReader1.Initialize (File.OpenInput (File.DirRootExternal , "ListaItaliani.txt"))
Line =TextReader1.ReadLine
Do While Line <> Null
Line =TextReader1.ReadLine
If Line<> Null Then
If Line <> Null Then
Riga=Line.Trim
If Riga<>"" Then
Tutto = Tutto & Riga
End If
End If
End If
Loop
TextReader1.Close
End Sub
Sub Elabora
'--- Leggo la variabile stringa Tutto e faccio il parsing, individuando i 3 campi Regione, Nome, Citta
'
Dim I1 As Int, I2 As Int, I3 As Int, I4 As Int
Dim ele() As String ' array
Dim Regione As String
Dim Nome As String
Dim Citta As String
Dim PrecRegione As String ' per evitare la visualizzazione ripetuta della regione; appare una volta sola
'
I1 = Instr(Tutto,"<b>Abruzzo",0)' ' inizia da qui
I2 = Instr(Tutto,"Vicini vicini",0) ' e finisce qui, escludendo gli svizzeri
Tutto = Mid(Tutto,I1,I2-I1)
Log ("RISULTATI")
ele = Regex.Split("<br />",Tutto)
For i = 0 To ele.Length -1
S = ele(i).Trim
If S.Trim <>"" Then
If Instr(S,"</b>",0) > 0 Then
S = S.Replace("<b>","") : S = S.Replace("</b>","") : S= S.Replace ("<br />","")
Regione = S
Else
S = S.Replace("-","")
S = S.Replace ("<br />","")
Nome = S.Trim
I3 = Instr(Nome,"(",0)
If I3>0 Then
Nome = Left(Nome,I3)
Nome = Nome.Trim
I4 = Instr(S,")",0)
If I4 > 0 Then
Citta = Mid(S,I3+1,s.Length-I3-1)
Citta = Citta.Replace ("(","")
Citta = Citta.Replace (")","")
Else
Citta = ""
End If
Else
Citta = ""
End If
If Nome<>"" AND Citta<>"" Then
If PrecRegione=Regione Then Regione=""
AggiungiRiga (Regione,Nome,Citta)
PrecRegione=Regione
End If
End If
End If
Next
gg.Scrolltop
End Sub
Sub Activity_Create(FirstTime As Boolean)
ProgressDialogShow ("Attendere")
Activity.Title = "LISTA ITALIANI DEL FORUM B4A"
If gg.IsInitialized = False Then
gg.Initialize("gg")
gg.RowHeight = 24dip
gg.HeaderHeight = 30dip
gg.HeaderTextSize = 13
gg.RowTextSize = 13
gg.HeaderTextColor = Colors.Yellow
gg.RowTextColor = Colors.Yellow
gg.SelectedOddColor = Colors.Magenta
gg.SelectedEvenColor = Colors.Magenta
Dim cc(4) As xnGridCol
cc(0).Initialize2 ( "Regione" , "Reg" , 30%x , Gravity.Left ) : gg.ColAppend (cc(0))
cc(1).Initialize2 ( "Nome" , "Nom" , 30%x , Gravity.Left) : gg.ColAppend (cc(1))
cc(2).Initialize2 ( "Citta" , "Cit" , 30%x , Gravity.Left) : gg.ColAppend (cc(2))
Activity.AddView (gg,4dip, 10dip, 100%x, 100%y)
gg.Multiselect = False
gg.GridWidth = 1dip
gg.GridColor = Colors.white
gg.PixelFix = False
gg.GridCreate2 ( False )
End If
'--- se si compila usare solo questa linea
GetWebPage
'--- se viceversa si è in fase di collaudo (ossia si legge il file TXT) usare le due righe seguenti :
' LeggiFile
' Elabora
ProgressDialogHide
End Sub
Sub AggiungiRiga (Reg As String ,Nom As String ,Cit As String)
gg.RowAppend (Array As String (Reg,Nom,Cit))
Log ("Regione=" & Reg & " Nome=" & Nom & " Città=" & Cit)
End Sub
Sub Activity_Resume
End Sub
Sub Activity_Pause (UserClosed As Boolean)
End Sub
Sub GetWebPage
Dim req As HttpRequest
Dim PostUrl As String
PostUrl ="http://www.b4x.com/android/forum/threads/lista-italiani.28596/"
req.InitializeGet(PostUrl)
ProgressDialogShow("Attendi ... ")
hc.Execute(req, 1)
End Sub
Sub hc_ResponseSuccess (Response As HttpResponse, TaskId As Int)
Dim resultString As String
resultString = Response.GetString("UTF8")
'--- se si compila commentare la linea seguente
'File.WriteString (File.DirRootExternal,"ListaItaliani.txt",resultString)
Response.Release
Tutto=resultString
Elabora
End Sub
Sub hc_ResponseError (Response As HttpResponse, Reason As String, StatusCode As Int, TaskId As Int) 'No connection :-(
Log("Errore nella connessione : " & Reason & " " & StatusCode)
If Response <> Null Then
Log(Response.GetString("UTF8"))
ProgressDialogHide
Response.Release
End If
End Sub
Sub Instr(Text As String, TextToFind As String, Start As Int) As Int
Return Text.IndexOf2(TextToFind,Start)
End Sub
Sub Mid(Text As String, Start As Int, Length As Int) As String
If Length>0 AND Start>-1 AND Start< Text.Length Then Return Text.SubString2(Start,Start+Length)
End Sub
Sub Left(Text As String, Length As Long)As String
If Length>Text.Length Then Length=Text.Length
Return Text.SubString2(0, Length)
End Sub
Sub Right(Text As String, Length As Long) As String
If Length>Text.Length Then Length=Text.Length
Return Text.SubString(Text.Length-Length)
End Sub