include lexi.e -- parser XML -> text . -- ("uit te voeren aktie") -- ANCHOR=0 -- rssheader : [ '' get-title-header | -- '<link>' get-link-header | -- '<description>' get-desc-header | -- '<LastBuildDate>' get-date-header | -- '<item>' ("item-index+=1") get-item -- ] EOF . -- EOF : [ '</channel>' | '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 | -- '<link>' get-link-item | -- '<description>' get-desc-item | -- '<pubDate>' get-date-item -- ] '</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={"","<link>","<description>","<pubDate>","<item>","</channel>"} 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]})