github.com/lmorg/murex@v0.0.0-20240217211045-e081c89cd4ef/builtins/core/lists/jsplit.go (about)

     1  package lists
     2  
     3  import (
     4  	"regexp"
     5  
     6  	"github.com/lmorg/murex/lang"
     7  	"github.com/lmorg/murex/lang/types"
     8  	"github.com/lmorg/murex/utils"
     9  	"github.com/lmorg/murex/utils/json"
    10  )
    11  
    12  func init() {
    13  	lang.DefineMethod("jsplit", cmdJsplit, types.Text, types.Json)
    14  }
    15  
    16  func cmdJsplit(p *lang.Process) error {
    17  	p.Stdout.SetDataType(types.Json)
    18  
    19  	b, err := p.Stdin.ReadAll()
    20  	if err != nil {
    21  		return err
    22  	}
    23  
    24  	pattern := p.Parameters.StringAll()
    25  	rx, err := regexp.Compile(pattern)
    26  	if err != nil {
    27  		return err
    28  	}
    29  
    30  	split := rx.Split(string(b), -1)
    31  	// remove trailing \n
    32  	for i := range split {
    33  	trimString:
    34  		if len(split[i]) > 0 &&
    35  			(split[i][len(split[i])-1] == '\r' || split[i][len(split[i])-1] == '\n') {
    36  			split[i] = utils.CrLfTrimString(split[i])
    37  			goto trimString
    38  		}
    39  	}
    40  
    41  trimArray:
    42  	if len(split) > 0 && split[len(split)-1] == "" {
    43  		split = split[:len(split)-1]
    44  		goto trimArray
    45  	}
    46  
    47  	json, err := json.Marshal(split, p.Stdout.IsTTY())
    48  	if err != nil {
    49  		return err
    50  	}
    51  
    52  	_, err = p.Stdout.Write(json)
    53  	return err
    54  }