YUI Compressor og "\\s"
Jeg oppdaget nylig at YUI Compressor komprimerer strenger som "\\s" litt vel ivrig, noe som potensielt kan ødelegge regulære uttrykk og skape subtile feil som er vriene å spore opp.
Jeg oppdaget dette gjennom valideringskomponenten som jeg skrev om forleden dag. I standalone-versjonen har jeg en hasClassName-metode, og denne er implementert som dette:
function hasClassName(element, className) {
return new RegExp("(^|\\s)" + className + "(\\s|$)").test(element.className);
}
Til min store skuffelse ville YUI Compressor ha det til at det regulære uttrykket skulle være
new RegExp("(^|\s)"+A+"(\s|$)")
Dette fungerer ikke som ønsket, ettersom backslashen må escapes inne i strengen. Og det skulle ikke være lett å lure YUI Compressor heller. Ønsker du å få gjennom to backslasher må du til med fire til å begynne med, tilsynelatende uansett hvordan du kombinerer sammen strengen, putter biter i variabler osv. Hvis du bare trenger den komprimerte versjonen av scriptet er dette greit, men skal du også bruke den ukomprimerte versjonen så vil denne feile med for mange backslasher...
En workaround
Jeg kjører YUI Compressor fra en Rake-fil, så i første omgang har jeg "løst" problemet ved å lese filen og erstatte "\s" inne i regulære uttrykk med "\\s". Dette er bare en halvveis løsning, så jeg håper problemet fikses snart.
Problemet
Etter å ha prøvd mailinglista til YUI-biblioteket uten hell, sendte jeg en e-post til Julien Lecomte, som har skrevet compressoren. Han svarte raskt og bekreftet at dette var en bug, som jeg dermed har meldt inn via sourceforge.net. Så får vi bare håpe at den blir løst raskt.