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 }