local xml=require"slaxdom" local mva_email="mva@gentoo.org" local indent = 2 local char = "[a-zA-Z0-9().,-]" for c=1,#arg do local metadata_xml=arg[c] if not metadata_xml then -- actually, can should never happen, but let's keep it in case if universe will brake print("pass metadata.xml as argument(s)") os.exit(1) end local f,err=io.open(metadata_xml,"rb"); if not f then print(err); os.exit(1) end local s=f:read("*a"); s = s :gsub("(]*)(>)","%1--%2--%3") -- Workaround for SLAXML bug as it doesn't currently support DOCTYPE -- pre-strip whitespaces in 3 steps: :gsub("\n","") -- TEMP (remove someday): pre-strip newlines (SLAXML skips it inside text-contained tags) :gsub("\t"," ") -- substitute tabs with spaces :gsub(" *"," ") -- substitute many spaces in a row with one local metadata = xml:dom(s,{ simple=true, -- simpler structure (no kids made from whitespaces) stripWhitespace=true -- strip other whitespaces }) local m_k=metadata.kids for i=1,#m_k do if m_k[i].name == "pkgmetadata" then local pm_k=m_k[i].kids for ii=1,#pm_k do if pm_k[ii].name == "maintainer" and pm_k[ii].attr and #pm_k[ii].attr>0 and pm_k[ii].attr[1].name == "type" and pm_k[ii].attr[1].value == "person" then -- TODO: unhardcode attr position (make proper search, move to external function) local mnt_k=pm_k[ii].kids local desc_i,name_i,email_i=0,0,0 for iii=1,#mnt_k do -- http://www.gentoo.org/dtd/metadata.dtd if mnt_k[iii].name == "name" then name_i=iii; elseif mnt_k[iii].name == "email" then email_i=iii; elseif mnt_k[iii].name == "description" then desc_i=iii; end -- if(mnt_k) end -- for(iii) if email_i>0 and name_i>0 then if mnt_k[name_i].kids[1].value:match("Misbakh%-Solov[a-z]*v") then -- since there is another devs and maintainers called Vadim, -- search me by last name (pattern here is because there was two notations) mnt_k[email_i].kids[1].value=mva_email if desc_i>0 then mnt_k[desc_i].kids[1].value="Also, you can find me on IRC (Libera.Chat) as mva, or in Telegram as @mva_name" end -- if(desc) end -- if(mva) end -- email/name_i>0 end -- if(pm_k) end -- for(ii) end -- if(m_k) end -- for(i) --[[ --]] f,err=io.open(metadata_xml,"w+"); if not f then print(err); os.exit(1) end f:write(( --]] --[[ print(( --]] xml:xml( metadata, { indent=indent, sort=true, -- omit } ) :gsub( -- workaround over slaxml bug of not handling DOCTYPE "(]+)%-%-(>)", "%1%2%3%4" ) :gsub( -- strip indentation inside text-containing nodes "(>)[\n]*[ ]*("..char..")", "%1%2" ) :gsub( -- same "("..char..")[\n]*[ ]*( "()[\n]*[ ]*( "(>)[\n]*[ ]*()", "%1%2" ) :gsub( -- add space right before "("..char..")[\n]*[ ]*([^<]*)", "%1 %2" ) :gsub( -- and after "([^<]*)("..(char:gsub(".,",""))..")", "%1 %2" ) :gsub( -- handle comment ending glued to end of the tag "(>)(-->)", "%1 %2" ) :gsub( "$", "\n" ) )) f:close(); end -- vim: ft=lua ts=2 sw=2 sts=2 noet