p={}functionp.main(frame)localargs=frame:getParent().argslocalinput=args[1]or"{{{1}}}"localplain=args.plain=="yes"locali=1localchangeList={}whileargs['?'..i]dolocalchange={pattern=args['?'..i],repl=args['!'..i]}ifnotchange.replthenreturnframe:expandTemplate{title='Error',args={'Ошибка: непарный аргумент: <code>?'..(i)..' = '..change.pattern..'</code>'}}endchangeList[i]=changei=i+1endlocalmatchList={}localpos=1locallen=mw.ustring.len(input)localresult=""whilepos<=lendolocalbestStart=len+1localbestStop=lenlocalbestChangefor_,changeinipairs(changeList)dolocalstart,stop=mw.ustring.find(input,change.pattern,pos,plain)ifstartand(start<bestStart)thenbestStart=startbestStop=stopbestChange=changeendendresult=result..mw.ustring.sub(input,pos,bestStart-1)ifbestChangethenlocalfragment=mw.ustring.sub(input,bestStart,bestStop)result=result..(plainandbestChange.replormw.ustring.gsub(fragment,bestChange.pattern,bestChange.repl,1))endpos=bestStop+1endreturnresultendreturnp