code.gitea.io/gitea@v1.19.3/modules/charset/breakwriter.go (about)

     1  // Copyright 2022 The Gitea Authors. All rights reserved.
     2  // SPDX-License-Identifier: MIT
     3  
     4  package charset
     5  
     6  import (
     7  	"bytes"
     8  	"io"
     9  )
    10  
    11  // BreakWriter wraps an io.Writer to always write '\n' as '<br>'
    12  type BreakWriter struct {
    13  	io.Writer
    14  }
    15  
    16  // Write writes the provided byte slice transparently replacing '\n' with '<br>'
    17  func (b *BreakWriter) Write(bs []byte) (n int, err error) {
    18  	pos := 0
    19  	for pos < len(bs) {
    20  		idx := bytes.IndexByte(bs[pos:], '\n')
    21  		if idx < 0 {
    22  			wn, err := b.Writer.Write(bs[pos:])
    23  			return n + wn, err
    24  		}
    25  
    26  		if idx > 0 {
    27  			wn, err := b.Writer.Write(bs[pos : pos+idx])
    28  			n += wn
    29  			if err != nil {
    30  				return n, err
    31  			}
    32  		}
    33  
    34  		if _, err = b.Writer.Write([]byte("<br>")); err != nil {
    35  			return n, err
    36  		}
    37  		pos += idx + 1
    38  
    39  		n++
    40  	}
    41  
    42  	return n, err
    43  }