package syntax
import (
"bytes"
"strconv"
"strings"
"unicode"
)
func Escape (input string ) string {
b := &bytes .Buffer {}
for _ , r := range input {
escape (b , r , false )
}
return b .String ()
}
const meta = `\.+*?()|[]{}^$# `
func escape(b *bytes .Buffer , r rune , force bool ) {
if unicode .IsPrint (r ) {
if strings .IndexRune (meta , r ) >= 0 || force {
b .WriteRune ('\\' )
}
b .WriteRune (r )
return
}
switch r {
case '\a' :
b .WriteString (`\a` )
case '\f' :
b .WriteString (`\f` )
case '\n' :
b .WriteString (`\n` )
case '\r' :
b .WriteString (`\r` )
case '\t' :
b .WriteString (`\t` )
case '\v' :
b .WriteString (`\v` )
default :
if r < 0x100 {
b .WriteString (`\x` )
s := strconv .FormatInt (int64 (r ), 16 )
if len (s ) == 1 {
b .WriteRune ('0' )
}
b .WriteString (s )
break
}
b .WriteString (`\u` )
b .WriteString (strconv .FormatInt (int64 (r ), 16 ))
}
}
func Unescape (input string ) (string , error ) {
idx := strings .IndexRune (input , '\\' )
if idx == -1 {
return input , nil
}
buf := bytes .NewBufferString (input [:idx ])
p := parser {}
p .setPattern (input [idx +1 :])
for {
if p .rightMost () {
return "" , p .getErr (ErrIllegalEndEscape )
}
r , err := p .scanCharEscape ()
if err != nil {
return "" , err
}
buf .WriteRune (r )
if p .rightMost () {
return buf .String (), nil
}
r = p .moveRightGetChar ()
for r != '\\' {
buf .WriteRune (r )
if p .rightMost () {
return buf .String (), nil
}
r = p .moveRightGetChar ()
}
}
}
The pages are generated with Golds v0.8.2 . (GOOS=linux GOARCH=amd64)
Golds is a Go 101 project developed by Tapir Liu .
PR and bug reports are welcome and can be submitted to the issue list .
Please follow @zigo_101 (reachable from the left QR code) to get the latest news of Golds .