github.com/keysonZZZ/kmg@v0.0.0-20151121023212-05317bfd7d39/kmgGoSource/kmgFormat/source.go (about)

     1  package kmgFormat
     2  
     3  import (
     4  	"bytes"
     5  	"github.com/bronze1man/kmg/kmgGoSource/kmgGoReader"
     6  	"go/format"
     7  )
     8  
     9  func Source(src []byte) ([]byte, error) {
    10  	src = RemoteEmptyLine(src)
    11  	out, err := format.Source(src)
    12  	if err != nil {
    13  		return out, err
    14  	}
    15  	return out, nil
    16  }
    17  
    18  func RemoteEmptyLine(src []byte) []byte {
    19  	r := kmgGoReader.NewReader(src, nil)
    20  	outBuf := &bytes.Buffer{}
    21  	r.ReadAllSpaceWithoutLineBreak()
    22  	if r.IsEof() {
    23  		return []byte{}
    24  	}
    25  	b := r.ReadByte()
    26  	if b != '\n' {
    27  		outBuf.Write(r.BufToCurrent(0))
    28  	}
    29  	for {
    30  		if r.IsEof() {
    31  			return outBuf.Bytes()
    32  		}
    33  		b := r.ReadByte()
    34  		if b == '\n' {
    35  			startPos := r.Pos() - 1 // 包括那个\n
    36  			r.ReadAllSpaceWithoutLineBreak()
    37  			if r.IsEof() {
    38  				outBuf.WriteByte('\n')
    39  				return outBuf.Bytes()
    40  			}
    41  			b := r.ReadByte()
    42  			if b == '\n' {
    43  				r.UnreadByte()
    44  			} else {
    45  				outBuf.Write(r.BufToCurrent(startPos))
    46  			}
    47  		} else {
    48  			outBuf.WriteByte(b)
    49  		}
    50  	}
    51  }