File lurk.hws changed (mode: 100755) (index 62e1a58..cecf786) |
... |
... |
EndFunction |
30 |
30 |
|
|
31 |
31 |
;č stáhnout soubor |
;č stáhnout soubor |
32 |
32 |
Function lurk:Explore(url$) |
Function lurk:Explore(url$) |
|
33 |
|
self:Clear() |
33 |
34 |
url$ = StripStr(url$) |
url$ = StripStr(url$) |
34 |
35 |
self.PleaseStop = False |
self.PleaseStop = False |
35 |
36 |
;č zjednodušená kontrola, pokud řetězec obsahuje procenta, |
;č zjednodušená kontrola, pokud řetězec obsahuje procenta, |
|
... |
... |
Function lurk:Explore(url$) |
37 |
38 |
;č Na případ, kdy uživatel strčí do URLu osamělý znak procenta vysereme |
;č Na případ, kdy uživatel strčí do URLu osamělý znak procenta vysereme |
38 |
39 |
;FindStr(s$, "%") <> -1 |
;FindStr(s$, "%") <> -1 |
39 |
40 |
Local err_code, html$, count = ?DownloadFile(url$, |
Local err_code, html$, count = ?DownloadFile(url$, |
40 |
|
{Adapter="hurl", Fail404=True, Encoded=FindStr(url$, "%") <> -1}, |
|
|
41 |
|
{Adapter="hurl", Fail404=True, Encoded=FindStr(url$, "%", True) <> -1}, |
41 |
42 |
lurk_callback, url$) |
lurk_callback, url$) |
42 |
43 |
If self.PleaseStop |
If self.PleaseStop |
43 |
44 |
self:set_status("interrupted") |
self:set_status("interrupted") |
|
... |
... |
Function lurk:Explore(url$) |
47 |
48 |
;č zde nepředpokládám, že by někdo jiný mohl spustit parser znovu. |
;č zde nepředpokládám, že by někdo jiný mohl spustit parser znovu. |
48 |
49 |
;č O to je to jednodušší. |
;č O to je to jednodušší. |
49 |
50 |
If err_code = #ERR_NONE |
If err_code = #ERR_NONE |
50 |
|
self:set_status(count .. " bytes from " .. url$ .. " transmitted") |
|
51 |
|
self:Clear() |
|
52 |
51 |
|
|
53 |
52 |
|
|
54 |
|
Local p = XMLParser.New({StartElement = lurkStartElement}) |
|
55 |
|
p:setbase(url$) |
|
56 |
|
;č ten parser trefí šlak, uvidí-li CO má zpracovat |
|
57 |
|
p:Parse(UnrightStr(html$, FindStr(html$, "<link", False))) |
|
|
53 |
|
Local headpos = FindStr(html$, "<head", False) |
|
54 |
|
If headpos < 0 |
|
55 |
|
self:set_status("\27bNothing found") ;č hlavně ta hlavička.. |
|
56 |
|
Return() |
|
57 |
|
Else |
|
58 |
|
self:set_status(count .. " bytes from " .. url$ .. " transmitted") |
58 |
59 |
|
|
59 |
|
;č html-ko nemůže nezpůsobit chybu. |
|
60 |
|
;č nemá cenu je hlídat |
|
61 |
|
Local err_code = ?p:Close() |
|
62 |
|
;Local err_code, status, msg, line, col, pos = ?p:Close() |
|
63 |
|
;self:Replay(err_code, "Done.") |
|
|
60 |
|
Local p = XMLParser.New({StartElement = lurkStartElement}) |
|
61 |
|
p:setbase(url$) |
|
62 |
|
;č ten parser trefí šlak, uvidí-li CO má zpracovat |
|
63 |
|
p:Parse(UnrightStr(html$, headpos)) |
|
64 |
|
|
|
65 |
|
;č html-ko nemůže nezpůsobit chybu. |
|
66 |
|
;č nemá cenu je hlídat |
|
67 |
|
Local err_code = ?p:Close() |
|
68 |
|
;Local err_code, status, msg, line, col, pos = ?p:Close() |
|
69 |
|
;self:Replay(err_code, "Done.") |
|
70 |
|
EndIf |
64 |
71 |
Else |
Else |
65 |
72 |
self:set_status("\27b" .. GetErrorName(err_code)) |
self:set_status("\27b" .. GetErrorName(err_code)) |
66 |
73 |
EndIf |
EndIf |
|
... |
... |
Function p_reconstructURL(base$, href$) |
87 |
94 |
If StartsWith(href$, "/") |
If StartsWith(href$, "/") |
88 |
95 |
;č uživatel může zadat normální adresu na http://, |
;č uživatel může zadat normální adresu na http://, |
89 |
96 |
;č nebo bůhvíco, co může začínat jménem serveru... |
;č nebo bůhvíco, co může začínat jménem serveru... |
90 |
|
Local hostpos = FindStr(base$, "//") + 2 |
|
91 |
|
Local hostend = FindStr(base$, "/", False, hostpos) |
|
|
97 |
|
Local hostpos = FindStr(base$, "//", True) + 2 |
|
98 |
|
Local hostend = FindStr(base$, "/", True, hostpos) |
92 |
99 |
If hostend = -1 |
If hostend = -1 |
93 |
100 |
;č bez lomítka na konci. |
;č bez lomítka na konci. |
94 |
101 |
Return(base$ .. href$) |
Return(base$ .. href$) |
|
... |
... |
Function p_reconstructURL(base$, href$) |
100 |
107 |
|
|
101 |
108 |
;č bez lomítka, pokud vůbec něčemu rozumím, vztahuje k aktuální složce? |
;č bez lomítka, pokud vůbec něčemu rozumím, vztahuje k aktuální složce? |
102 |
109 |
;č Jenomže ani čert se nevyzná, co je to složka v moderním webu |
;č Jenomže ani čert se nevyzná, co je to složka v moderním webu |
103 |
|
;č (víz. poznámku ohledně přesměrování) |
|
104 |
|
Return(TrimStr(base$, "/", True) .. "/" .. href$) |
|
|
110 |
|
;č (víz. poznámku ohledně přesměrování) |
|
111 |
|
Local parampos = FindStr(base$, "?", True) |
|
112 |
|
If parampos > 0 |
|
113 |
|
;č pokud ovšem adresa obsahuje otazník, nebo ampersand |
|
114 |
|
;č tak část za nim můžeme zajistě vyhodit |
|
115 |
|
Local drawerpos = ReverseFindStr(base$, "/", True, parampos) |
|
116 |
|
Return(LeftStr(base$, drawerpos + 1) .. href$) |
|
117 |
|
EndIf |
105 |
118 |
|
|
|
119 |
|
;č Je to jedno. Nechť to uživatel řeší sám! |
|
120 |
|
Return(TrimStr(base$, "/", True) .. "/" .. href$) |
106 |
121 |
EndFunction |
EndFunction |
107 |
122 |
|
|
|
123 |
|
Function _test_reconstruction() |
|
124 |
|
Local testcases = {} |
|
125 |
|
testcases["aninet.no"] = "feed" |
|
126 |
|
testcases["gemini://aninet.no"] = "feed" |
|
127 |
|
testcases["gemini://aninet.no/"] = "feed" |
|
128 |
|
testcases["gemini://aninet.no/dfg/"] = "feed" |
|
129 |
|
testcases["gemini://aninet.no/dfg/tgb"] = "feed" |
|
130 |
|
testcases["gemini://aninet.no/dfg/tgb?"] = "feed" |
|
131 |
|
testcases["gemini://aninet.no/dfg/tgb?atari=0&amiga=1"] = "feed" |
|
132 |
|
testcases["gemini://aninet.no/dfg/?atari=0&amiga=1"] = "feed" |
|
133 |
|
testcases["aninet.no/%34%20/?atari=0&amiga=1"] = "feed" |
|
134 |
|
For i,v In Pairs(testcases) |
|
135 |
|
DebugPrint(i, v, p_reconstructURL(i, v)) |
|
136 |
|
Next |
|
137 |
|
EndFunction |
|
138 |
|
|
|
139 |
|
|
108 |
140 |
|
|
109 |
141 |
Function lurkStartElement(p, name$, attrs) |
Function lurkStartElement(p, name$, attrs) |
110 |
142 |
CheckEvents() |
CheckEvents() |