@@ -377,9 +377,9 @@ func (t *Token) Render() string {
377377 return buf .String ()
378378}
379379
380- func stickyWriteString (n * int , err * error , w io.Writer , s string ) {
380+ func stickyWriteString (n * int64 , err * error , w io.Writer , s string ) {
381381 n2 , err2 := io .WriteString (w , s )
382- * n += n2
382+ * n += int64 ( n2 )
383383 if err2 != nil {
384384 if * err != nil {
385385 * err = err2
@@ -392,33 +392,36 @@ func stickyWriteString(n *int, err *error, w io.Writer, s string) {
392392// to handle comment insertion rules.
393393//
394394// Tokens with type TokenError do not write anything.
395- func (t * Token ) WriteTo (w io.Writer ) (n int , err error ) {
395+ func (t * Token ) WriteTo (w io.Writer ) (n int64 , err error ) {
396396 switch t .Type {
397397 case TokenError :
398398 return
399399 case TokenEOF :
400400 return
401401 case TokenIdent :
402- return io .WriteString (w , escapeIdentifier (t .Value ))
402+ stickyWriteString (& n , & err , w , escapeIdentifier (t .Value ))
403+ return
403404 case TokenAtKeyword :
404405 stickyWriteString (& n , & err , w , "@" )
405406 stickyWriteString (& n , & err , w , escapeIdentifier (t .Value ))
406407 return
407408 case TokenDelim :
408409 if t .Value == "\\ " {
409410 // nb: should not happen, this is actually TokenBadEscape
410- return io . WriteString ( w , "\\ \n " )
411+ stickyWriteString ( & n , & err , w , "\\ \n " )
411412 } else {
412- return io . WriteString ( w , t .Value )
413+ stickyWriteString ( & n , & err , w , t .Value )
413414 }
415+ return
414416 case TokenHash :
415417 e := t .Extra .(* TokenExtraHash )
416- io . WriteString ( w , "#" )
418+ stickyWriteString ( & n , & err , w , "#" )
417419 if e .IsIdentifier {
418- return io . WriteString ( w , escapeIdentifier (t .Value ))
420+ stickyWriteString ( & n , & err , w , escapeIdentifier (t .Value ))
419421 } else {
420- return io . WriteString ( w , escapeHashName (t .Value ))
422+ stickyWriteString ( & n , & err , w , escapeHashName (t .Value ))
421423 }
424+ return
422425 case TokenPercentage :
423426 stickyWriteString (& n , & err , w , t .Value )
424427 stickyWriteString (& n , & err , w , "%" )
@@ -429,14 +432,16 @@ func (t *Token) WriteTo(w io.Writer) (n int, err error) {
429432 stickyWriteString (& n , & err , w , escapeDimension (e .Dimension ))
430433 return
431434 case TokenString :
432- return io .WriteString (w , escapeString (t .Value , '"' ))
435+ stickyWriteString (& n , & err , w , escapeString (t .Value , '"' ))
436+ return
433437 case TokenURI :
434438 stickyWriteString (& n , & err , w , "url(" )
435439 stickyWriteString (& n , & err , w , escapeString (t .Value , '"' ))
436440 stickyWriteString (& n , & err , w , ")" )
437441 return
438442 case TokenUnicodeRange :
439- return io .WriteString (w , t .Extra .String ())
443+ stickyWriteString (& n , & err , w , t .Extra .String ())
444+ return
440445 case TokenComment :
441446 stickyWriteString (& n , & err , w , "/*" )
442447 stickyWriteString (& n , & err , w , t .Value )
@@ -447,7 +452,8 @@ func (t *Token) WriteTo(w io.Writer) (n int, err error) {
447452 stickyWriteString (& n , & err , w , "(" )
448453 return
449454 case TokenBadEscape :
450- return io .WriteString (w , "\\ \n " )
455+ stickyWriteString (& n , & err , w , "\\ \n " )
456+ return
451457 case TokenBadString :
452458 stickyWriteString (& n , & err , w , "\" " )
453459 stickyWriteString (& n , & err , w , escapeString (t .Value , 0 ))
@@ -461,7 +467,8 @@ func (t *Token) WriteTo(w io.Writer) (n int, err error) {
461467 stickyWriteString (& n , & err , w , "\n )" )
462468 return
463469 default :
464- return io .WriteString (w , t .Value )
470+ stickyWriteString (& n , & err , w , t .Value )
471+ return
465472 }
466473}
467474
@@ -475,10 +482,7 @@ type TokenRenderer struct {
475482
476483// Write a token to the given io.Writer, potentially inserting an empty comment
477484// in front based on what the previous token was.
478- //
479- // In the event of a writing error, the TokenRenderer is left in an
480- // indeterminate state. (TODO: maybe fix that?)
481- func (r * TokenRenderer ) WriteTokenTo (w io.Writer , t Token ) (n int , err error ) {
485+ func (r * TokenRenderer ) WriteTokenTo (w io.Writer , t Token ) (n int64 , err error ) {
482486 var prevKey , curKey interface {}
483487 if r .lastToken .Type == TokenDelim {
484488 prevKey = r .lastToken .Value [0 ]
@@ -494,21 +498,18 @@ func (r *TokenRenderer) WriteTokenTo(w io.Writer, t Token) (n int, err error) {
494498 m1 , ok := commentInsertionRules [prevKey ]
495499 if ok {
496500 if m1 [curKey ] {
497- n2 , err2 := io .WriteString (w , "/**/" )
498- if err2 != nil {
499- return n2 , err2
500- } else if n2 != 4 {
501- return n2 , io .ErrShortWrite
502- } else {
503- n += n2
504- }
501+ stickyWriteString (& n , & err , w , "/**/" )
505502 }
506503 }
507504
508505 n2 , err2 := t .WriteTo (w )
509506 r .lastToken = t
507+
510508 n += n2
511- return n , err2
509+ if err2 != nil && err == nil {
510+ err = err2
511+ }
512+ return n , err
512513}
513514
514515// CSS Syntax Level 3 - Section 9
0 commit comments