89 lines
1.8 KiB
Go
89 lines
1.8 KiB
Go
// For more tutorials: https://blog.learngoprogramming.com
|
|
//
|
|
// Copyright © 2018 Inanc Gumus
|
|
// Learn Go Programming Course
|
|
// License: https://creativecommons.org/licenses/by-nc-sa/4.0/
|
|
//
|
|
|
|
/*
|
|
#1- Get and check the input
|
|
#2- Create a buffer with a sufficient size
|
|
#3- Write input to the buffer as it is and print it
|
|
#4- Detect the link
|
|
#5- Mask the link
|
|
#6- Detect white spaces and disable the masking
|
|
#7- Write http:// to the buffer, just before the link
|
|
*/
|
|
|
|
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"os"
|
|
)
|
|
|
|
const (
|
|
link = "http://"
|
|
mask = '*'
|
|
)
|
|
|
|
func main() {
|
|
args := os.Args[1:]
|
|
if len(args) != 1 {
|
|
fmt.Println("gimme somethin' to censor!")
|
|
return
|
|
}
|
|
|
|
var (
|
|
text = args[0]
|
|
size = len(text)
|
|
|
|
// create a sufficient buffer for the output
|
|
//
|
|
// and adjust its slice pointer to the first element
|
|
// of the backing array! -> make(..., 0, ...)
|
|
buf = make([]byte, 0, size)
|
|
|
|
in bool
|
|
)
|
|
|
|
for i := 0; i < size; i++ {
|
|
nlink := len(link)
|
|
|
|
// slice the input and look for the link pattern
|
|
// do not slice it when it goes beyond the input text's capacity
|
|
if len(text[i:]) >= nlink && text[i:i+nlink] == link {
|
|
// jump to the next character after "http://"
|
|
i += nlink
|
|
|
|
// set the flag: we're in a link! -> "http://....."
|
|
in = true
|
|
|
|
// add the "http://" manually
|
|
buf = append(buf, link...)
|
|
}
|
|
|
|
// get the current byte from the input
|
|
c := text[i]
|
|
|
|
// disable the link detection flag
|
|
// this will prevent masking the rest of the bytes
|
|
switch c {
|
|
case ' ', '\t', '\n': // try -> unicode.IsSpace
|
|
in = false
|
|
}
|
|
|
|
// if we're in the link detection mode (inside the link bytes)
|
|
// then, mask the current character
|
|
if in {
|
|
c = mask
|
|
}
|
|
|
|
// add the current character to the buffer
|
|
buf = append(buf, c)
|
|
}
|
|
|
|
// print out the buffer as text (string)
|
|
fmt.Println(string(buf))
|
|
}
|