Minulle iski aika aloittelijamainen oikosulku, kun olen koodaamassa tuota nettiselainta visual basic 6:lla.
Minulla on siinä jo jonkinlainen linkki-systeemi, joka ymmärtää, että tietty teksti on linkki jos sivulla on koodissa tälläinen kohta:
<a href=sivun osoite</a>
niin kuinka tai mitä minun pitää selaimen koodiin laittaa, että siitä saisi normaalin näköisen eli <a href="sivun osoite"></a> ?
Viimeisimmät sourcet selaimestani löytyy osoitteesta:
http://juhak.no-ip.info/ohjelmat/selain.zip
Jos jotakuta kiinnostaa edes...
Törmäsin samankaltaiseen ongelmaan rakentaessani QB:llä ohjelmointikieltä pari päivää sitten. Sen sijaan, että lukisit rivi kerrallaan, lue tagi kerrallaan (eli teksti merkkien '<' ja '>' välillä). Tällöin teksti kannattaa lukea binäärimuodossa merkki kerrallaan. Tässä jonkinlaista alkua (suoraan pohjattomasta hatusta):
dim tagi as string, merkki as string * 1
dim pituus as integer
open filu for binary as #1
do
if eof(1) then exit do
get #1, merkki 'luetaan 1 merkki
if merkki = "<" then 'tagi alkaa
' Etsitään loppu ja käsitellään sisältöä
get #1, merkki: pituus = 0: tagi = ""
do
get #1, merkki
' saavutettiin loppu tai eof
if merkki = ">" or eof(1) then
exit do
else
' Ei kuitenkaan lasketa mukaan rivinvaihtoja tai tabulaattoreita
if merkki <> chr$(13) and merkki <> chr$(9) then
pituus = pituus + 1
tagi = tagi + merkki
end if
end if
loop
tagi = lcase(tagi) ' Parannellaan vertailua varten
' Nyt on tagi on tagin sisältö ilman <- ja >-merkkejä.
' Merkkijonosta voidaan etsiä tiettyjä merkkijonoja
' InStr-komennolla.
' Esim. linkissä <a ...> ensimmäinen tieto täytyy olla
' merkki 'a' (tunniste), tauluissa 'table' jne.
end if
loop
close #1Seuraava askel tällä mekanismilla olisi sitten mm. attribuuttien etsinnällä tagista (bgcolor, name, class jne). Tähän kannattaa tehdä erillinen funktio, jolloin voit samalla laittaa selaimeesi oletusarvot tietyille asioille (bgcolor, textcolor jne). Esim.
Function EtsiAttr(tag as string, attr as string)
dim pos as integer, pos2 as integer
pos = InStr(tag, attr) ' Etsitään, missä kohdin on (jos on)
if pos = 0 then ' Oletukset menevät tähän (attribuuttia ei ole määritelty)
EtsiAttr = ""
else ' Attribuutti on olemassa (ainakin jollain tasolla).
' Se alkaa '='-merkin jälkeen ja on lainausmerkeissä.
' Eli haetaan seuraavan '=' -merkin paikan ja luetaan
' sitä seuraava ""-merkeissä oleva sana:
pos = InStr(pos, tag, "=")
' Virheenkäsittelyä
if pos = 0 then
MsgBox "Virhe attribuutin " +attr+ " lukemisessa!"
EtsiAttr = "": Exit Function
end if
' Hetaan sitten =:tä seuraava "-merkki (ASC: 34)
pos = InStr(pos, tag, chr$(34))
' Taas virheenkäsittelyä...
if pos = 0 then
MsgBox "Virhe attribuutin " +attr+ " lukemisessa!"
EtsiAttr = "": Exit Function
end if
' Luetaan toiseen "-merkkiin asti. pos+1, koska muuten
' palauttaisi aina pos:n arvon.
pos2 = InStr(pos + 1, tag, chr$(34))
' Virhe....
if pos2 = 0 then
MsgBox "Virhe attribuutin " +attr+ " lukemisessa:"+chr$(13)+"Päättämätön attribuutti."
EtsiAttr = "": Exit Function
end if
' No niin, se meni hyvin :) Luetaan tiedon sijainti.
EtsiAttr = Mid(tag, pos, pos2)
end if
end function
'... ... ...
' esim: tämän pitäisi tulostaa (tässä tapauksessa) info.html.
print EtsiAttr("<a href = "+chr$(34)+"info.html"+chr$(34)+">", "href")Toivottavasti auttoi :/
Minkälaista kieltä sqwiik väsää? (sori offtopic)
Vastaus offtopic: melko hämärää :) esim. kaikki silmukat ovat olioita (ja siten muokattavissa ulkopuolelta...)
Suosittelisin etsimään artikkeleita, joissa käsitellään parserin tekemistä vaikka tekstiseikkailuun tai skriptikieltä varten.
Offtopic: Aika mielenkiintoinen kieli... :) Voisi itsekin yrittää tehdä mahdollisimman kummallisen kielen.
Aihe on jo aika vanha, joten et voi enää vastata siihen.