include lexi.e
-- parser XML -> text .
-- ("uit te voeren aktie")
-- ANCHOR=0
-- rssheader : [ '
' get-title-header |
-- '' get-link-header |
-- '' get-desc-header |
-- '' get-date-header |
-- '' ("item-index+=1") get-item
-- ] EOF .
-- EOF : [ '' | 'EOF'
-- get-title-header : '' ("header[title] = SKIP") .
-- get-link-header : '' ("header[link] = SKIP") .
-- get-desc-header : '' ("header[desc] = SKIP") .
-- get-date-header : '' ("header[date] = SKIP") .
--
-- get-rss-item : '' ("item-index+=1") get-item
-- get-item : [ '' get-title-item |
-- '' get-link-item |
-- '' get-desc-item |
-- '' get-date-item
-- ] '' .
-- get-title-item : ("rss[item-index][title] = SKIP") .
-- get-link-item : ("rss[item-index][link] = SKIP") .
-- get-desc-item : [ '' ("rss[item-index][desc] = SKIP")
-- ] .
-- get-desc-html : ']]>' ("rss[item-index][desc] = SKIP") '' .
-- get-date-item : '' ("rss[item-index][date] = SKIP") .
sequence header={{},{},{},{}}
constant rssheader={"","","","","",""}
constant rssheaderend={"","","",""}
constant title_header=1,link_header=2,desc_header=3,date_header=4,item_header=5,end_rss=6
sequence header_rss={},item_rss={}
function get_items(sequence rssheaderend)
constant CDATA = {""}
integer error=0
if L_result[L_INDEX] = title_header
then L_in(rssheaderend)
if L_result[L_INDEX]=title_header
then header[title_header]=L_result[L_SKIP]
else error=title_header
end if
elsif L_result[L_INDEX] = link_header
then L_in(rssheaderend)
if L_result[L_INDEX]=link_header
then header[link_header]=L_result[L_SKIP]
else error=link_header
end if
elsif L_result[L_INDEX] = desc_header
then -- zoek of dit een HTML beschrijving is .
L_any(" ") --anchor = 1
L_in(CDATA)
if L_result[L_INDEX]
then -- doesn't check on any thing
L_any({}) --anchor = 0
L_in(CDATA)
header[desc_header]=L_result[L_SKIP]
else
L_any({})
L_in(rssheaderend)
if L_result[L_INDEX]=desc_header
then header[desc_header]=L_result[L_SKIP]
else error=desc_header
end if
end if
elsif L_result[L_INDEX] = date_header
then L_in(rssheaderend)
if L_result[L_INDEX]=date_header
then header[date_header]=L_result[L_SKIP]
else error=date_header
end if
else error = length(rssheaderend)+1
end if
return error
end function
function RSS_header()
integer error=0
L_in(rssheader)
while L_result[L_INDEX]<5 do
error=get_items(rssheaderend)
if error!=0 then exit end if
L_in(rssheader)
end while
if error=0
then header_rss=header
error=L_result[L_INDEX]
end if
return error
end function
function RSS_item()
-- it enters with a ''
integer error=0
L_in(rssheader)
header={{},{},{},{}}
while L_result[L_INDEX]<6 do
if L_result[L_INDEX]=5
then -- store item info
item_rss=append(item_rss,header)
header={{},{},{},{}}
else error=get_items(rssheaderend)
if error!=0 then exit end if
end if
L_in(rssheader)
end while
if error=0 then error=L_result[L_INDEX] end if
return error
end function
function trimleft(sequence text , object tekens)
if length(text) then
while find(text[1],tekens) do
text=text[2..]
end while
end if
return text
end function
function trimright(sequence text , object tekens)
for i = length(text) to 1 by -1 do
if find(text[i],tekens)
then text=text[1..i-1]
else exit
end if
end for
return text
end function
function remove_all(sequence intext;teken )
integer j=find(teken,intext)
integer klad=1
while j do
klad+=j-1
intext=intext[1..klad-1]&intext[klad+1..-1]
j=find(teken,intext[klad..-1])
end while
return intext
end function
-- parser
global function RSS(sequence filename)
integer error=0
-- open file
integer file=open(filename&".txt","r")
integer fo
if not L_init(file)
then puts(2,"File not there\n")
error=-1
return error
end if
header_rss={}
item_rss={}
header={{},{},{},{}}
L_any({}) -- zet ANCHOR = 0
error = RSS_header()
if error=item_header
then -- read items
error = RSS_item()
if error!=end_rss
then printf(2,"error in reading RSS-Item (code:%d)\n",{error})
else error = 0
end if
else
printf(2,"error in reading RSS-Header (code:%d)\n",{error})
end if
close(file)
-- uitvoer
if error=0
then
fo =open(filename&".new","w")
-- zet read-all op 0
puts(fo,"0\n")
for i=1 to 4 do
puts(fo,header_rss[i]&'\n')
end for
for i=1 to length(item_rss) do
for j=1 to 4 do
-- moeten we leading tab's space en cr/lf verwijderen ?
-- idem voor de achterkant van de string ?
-- moeten overige \n ook worden geconferteerd naar 't ja wat (& ?)
-- ja alle \r \n moeten er uit , het moet 1 text record worden !
--item_rss[i][j]=remove_all(item_rss[i][j],'\r')
item_rss[i][j]=remove_all(item_rss[i][j],'\n')
--print(fo,item_rss[i][j])
puts(fo,trimright(trimleft(item_rss[i][j]," \t\r")," \t\r")&'\n')
end for
puts(fo,"0\n")-- not read
end for
close(fo)
end if
-- no more file's to handle ?
if L_end()
then puts(1,"End failed , stil work to do\n")
else puts(1,"End successfull\n")
end if
return error
end function
-- vergelijk feedX.new met feedX.rss
global procedure maak_rss(sequence filein)
sequence klad
integer rssnew=open(filein&".new","r")
integer rssold=open(filein&".rss","r")
-- feitelijk moeten deze er zijn , testen of dat zo is ?
-- de eerste 5 regels zijn readall-flag,titel,link,beschrijving,datum
-- de item's bestaan uit 5 regels :
-- titel , link , beschrijving , datum , readflag .
-- loop met ieder item uit new door die van rss .
-- zijn de eerte 4 regels identiek dan copier de readflag uit .rss
-- anders zet readflag op 0 .
-- verwijder alle niet te vergelijken items uit .rss weg .
-- Deze zijn of oud of niet meer aanwezig . (Dit geldt eigenlijk niet voor blog's)
header_rss={}
item_rss={}
header={}
-- lees header uit .rss
for i=1 to 5 do
header_rss=append(header_rss,gets(rssold))
end for
-- lees alle items uit .rss
header=gets(rssold)
while sequence(header) do
for i=1 to 4 do
header=append(header,gets(rssold))
end for
item_rss=append(item_rss,header)
header=gets(rssold)
end while
close(rssold)
-+
-- test
for i=1 to length(item_rss) do
for j=1 to length(item_rss[i]) do
puts(1,item_rss[i][j])
end for
end for
-+
-- maak voor test doeleinden een copy van .rss
renamef(filein&".rss",filein&".bak")
-- lees de header van .new en overschrijf die van .rss
rssold=open(filein&".rss","w")
-- lees header uit .rss
header_rss={}
for i=1 to 5 do
header_rss=append(header_rss,gets(rssnew))
end for
-- schrijf header weg naar .rss
printf(rssold,"%s%s%s%s%s",header_rss)
-- zet readall op true
header_rss[1]='1'
-- lees een item uit .new vergelijk dit met alle item's uit .rss
header=gets(rssnew)
while sequence(header) do
--lees feed uit .new
for i=1 to 4 do
header=append(header,gets(rssnew))
end for
-- kijk of de feed al aanwezig is
for i=1 to length(item_rss) do
if not compare(header[1..-2],item_rss[i][1..-2])
then -- indien gelijk copieer de readflag naar new
header[-1]=item_rss[i][-1]
-- printf(1,"equal at %d\n",i)
-- printf(1,"new = %s",{header[1..length(header)-4]})
-- printf(1,"old = %s",{item_rss[i][1..length(item_rss[i])-4]})
-- printf(1,"readflag = %s\n",header[-1])
exit
end if
end for
-- is RSS al een keer gelezen ?
if header[-1][1]='0' then header_rss[1]='0' end if
-- schrijf de rss weg
printf(rssold,"%s",{header[1..length(header)-4]})
printf(rssold,"%s%s%s%s",header[-4..-1])
-- volgende
header=gets(rssnew)
end while
~seek(rssold,0)
putc(rssold,header_rss[1])
close(rssnew)
--eventueel verwijder nu .bak , .new , .txt en .log
end procedure
-- Opmerking :
-- printf(1,"new = %s",{header[1..length(header)-4]})
-- Dit is gekluggel en staan doordat de eerste regel gelezen is als
-- header=gets(rssnew) welk een sequence of char's is .
-- daarna header=append(header,gets()) wordt gedaan .
-- Dit geeft een sequence als {a,c,b,f,g,{tweede},{derde},{etc}}
-- Beter was om de text sequence als sequence te maken dat geeft dan
-- {{a,c,f,g,},{tweede},{derde},{etc}}
-- Dan had je kunnen zeggen : printf(1,"new = %s",{header[1]})