@@ -315,8 +315,8 @@ <h1>HTML using XMP</h1>
315315 ' local a`END`PUN=`END`LIT1`END`PLN<br>' +
316316 ' local b`END`PUN=`END`LIT1`END`PLN<br>' +
317317 ' `END`KWDwhile`END`PLN `END`PUN[`END`PLN `END`STR"$n"`END' +
318- '`PLN `END`PUN!=`END`PLN `END`LIT0`END`PLN `END`PUN]`END' +
319- '`PLN `END` PUN;`END`PLN `END`KWDdo`END`PLN<br>' +
318+ '`PLN `END`PUN!=`END`PLN `END`LIT0`END`PLN `END`PUN]`END`PLN `END ' +
319+ '`PUN;`END`PLN `END`KWDdo`END`PLN<br>' +
320320 ' local tmp`END`PUN=`END`PLN$a<br>' +
321321 ' a`END`PUN=`END`PLN$`END`PUN((`END`PLN $a `END`PUN+`END' +
322322 '`PLN $b `END`PUN))`END`PLN<br>' +
@@ -708,7 +708,54 @@ <h1>HTML using XMP</h1>
708708 return plainText . replace ( / \0 4 6 / g, '&' )
709709 . replace ( / \0 7 4 / g, '<' )
710710 . replace ( / \0 7 6 / g, '>' )
711- . replace ( / \0 4 2 / g, '"' ) ;
711+ . replace ( / \0 4 2 / g, '"' )
712+ . replace ( / \xa0 / g, ' ' ) ;
713+ }
714+
715+ /** convert a plain text string to html by escaping html special chars. */
716+ function htmlDQSafe ( plainText ) {
717+ return plainText . replace ( / \0 4 6 / g, '&' )
718+ . replace ( / \0 7 4 / g, '<' )
719+ . replace ( / \0 7 6 / g, '>' )
720+ . replace ( / \xa0 / g, ' ' ) ;
721+ }
722+
723+ /**
724+ * get normalized markup. innerHTML varies enough across browsers that we
725+ * can't use it.
726+ */
727+ function normalizedInnerHtml ( node , opt_out ) {
728+ var out = [ ] ;
729+ for ( var child = node . firstChild ; child ; child = child . nextSibling ) {
730+ normalizedHtml ( child , out ) ;
731+ }
732+ return out . join ( '' ) ;
733+ }
734+ var annoy = 10 ;
735+ function normalizedHtml ( node , out ) {
736+ switch ( node . nodeType ) {
737+ case 1 : // an element
738+ var name = node . tagName . toLowerCase ( ) ;
739+ out . push ( '\074' , name ) ;
740+ for ( var i = 0 ; i < node . attributes . length ; ++ i ) {
741+ out . push ( ' ' ) ;
742+ normalizedHtml ( node . attributes [ i ] , out ) ;
743+ }
744+ out . push ( '>' ) ;
745+ for ( var child = node . firstChild ; child ; child = child . nextSibling ) {
746+ normalizedHtml ( child , out ) ;
747+ }
748+ if ( node . firstChild || ! / ^ (?: b r | l i n k | i m g ) $ / . test ( name ) ) {
749+ out . push ( '<\/' , name , '>' ) ;
750+ }
751+ break ;
752+ case 2 : // an attribute
753+ out . push ( node . name . toLowerCase ( ) , '="' , htmlDQSafe ( node . value ) , '"' ) ;
754+ break ;
755+ case 3 : case 4 : // text
756+ out . push ( htmlDQSafe ( node . nodeValue ) ) ;
757+ break ;
758+ }
712759 }
713760
714761 var htmlOut = [ ] ;
@@ -720,7 +767,7 @@ <h1>HTML using XMP</h1>
720767 ? '<\/span>'
721768 : '<span class="' + lbl . toLowerCase ( ) + '">' ) ;
722769 } ) ;
723- var actual = document . getElementById ( lang ) . innerHTML ;
770+ var actual = normalizedInnerHtml ( document . getElementById ( lang ) ) ;
724771 if ( golden !== actual ) { // test failed
725772 // write out
726773 var pre = commonPrefix ( golden , actual ) ;
0 commit comments