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

     1  package escape
     2  
     3  import (
     4  	"html"
     5  	"net/url"
     6  	"strconv"
     7  	"strings"
     8  
     9  	"github.com/lmorg/murex/lang"
    10  	"github.com/lmorg/murex/lang/types"
    11  	"github.com/lmorg/murex/utils/escape"
    12  )
    13  
    14  func init() {
    15  	lang.DefineMethod("escape", cmdEscape, types.Text, types.String)
    16  	lang.DefineMethod("!escape", cmdEscape, types.Text, types.String)
    17  	lang.DefineMethod("eschtml", cmdHtml, types.Text, types.String)
    18  	lang.DefineMethod("!eschtml", cmdHtml, types.Text, types.String)
    19  	lang.DefineMethod("escurl", cmdUrl, types.Text, types.String)
    20  	lang.DefineMethod("!escurl", cmdUrl, types.Text, types.String)
    21  	lang.DefineMethod("esccli", cmdEscapeCli, types.Text, types.String)
    22  }
    23  
    24  func cmdEscape(p *lang.Process) error {
    25  	p.Stdout.SetDataType(types.String)
    26  
    27  	var str string
    28  	if p.Parameters.Len() == 0 {
    29  		b, err := p.Stdin.ReadAll()
    30  		if err != nil {
    31  			return err
    32  		}
    33  		str = string(b)
    34  
    35  	} else {
    36  		str = p.Parameters.StringAll()
    37  
    38  	}
    39  
    40  	if p.IsNot {
    41  		unescape, err := strconv.Unquote(str)
    42  		if err != nil {
    43  			unescape = html.UnescapeString(str)
    44  		}
    45  		str = unescape
    46  
    47  	} else {
    48  		str = strconv.Quote(str)
    49  	}
    50  
    51  	_, err := p.Stdout.Write([]byte(str))
    52  	return err
    53  }
    54  
    55  func cmdHtml(p *lang.Process) error {
    56  	p.Stdout.SetDataType(types.String)
    57  
    58  	var str string
    59  	if p.Parameters.Len() == 0 {
    60  		b, err := p.Stdin.ReadAll()
    61  		if err != nil {
    62  			return err
    63  		}
    64  		str = string(b)
    65  
    66  	} else {
    67  		str = p.Parameters.StringAll()
    68  
    69  	}
    70  
    71  	if p.IsNot {
    72  		str = html.UnescapeString(str)
    73  
    74  	} else {
    75  		str = html.EscapeString(str)
    76  	}
    77  
    78  	_, err := p.Stdout.Write([]byte(str))
    79  	return err
    80  }
    81  
    82  func cmdUrl(p *lang.Process) (err error) {
    83  	p.Stdout.SetDataType(types.String)
    84  
    85  	var str string
    86  	if p.Parameters.Len() == 0 {
    87  		b, err := p.Stdin.ReadAll()
    88  		if err != nil {
    89  			return err
    90  		}
    91  		str = string(b)
    92  
    93  	} else {
    94  		str = p.Parameters.StringAll()
    95  
    96  	}
    97  
    98  	if p.IsNot {
    99  		str, err = url.PathUnescape(str)
   100  		if err != nil {
   101  			return err
   102  		}
   103  
   104  	} else {
   105  		str = url.PathEscape(str)
   106  	}
   107  
   108  	_, err = p.Stdout.Write([]byte(str))
   109  	return err
   110  }
   111  
   112  func cmdEscapeCli(p *lang.Process) error {
   113  	p.Stdout.SetDataType(types.String)
   114  
   115  	var s []string
   116  
   117  	if p.IsMethod {
   118  		err := p.Stdin.ReadArray(p.Context, func(b []byte) {
   119  			s = append(s, string(b))
   120  		})
   121  		if err != nil {
   122  			return err
   123  		}
   124  	} else {
   125  		s = p.Parameters.StringArray()
   126  	}
   127  
   128  	escape.CommandLine(s)
   129  
   130  	_, err := p.Stdout.Writeln([]byte(strings.Join(s, " ")))
   131  	return err
   132  }