func Example_1() { z := zalgo.NewCorrupter(os.Stdout) z.Zalgo = func(n int, r rune, z *zalgo.Corrupter) bool { z.Up += 0.1 z.Middle += complex(0.01, 0.01) z.Down += complex(real(z.Down)*0.1, 0) return false } z.Up = complex(0, 0.2) z.Middle = complex(0, 0.2) z.Down = complex(0.001, 0.3) fmt.Fprintln(z, invoke) // Output: // Eternal happiness. }
// String returns a string representing a millipede func (m *Millipede) String() string { paddingOffsets := []string{""} if m.Curve > 0 { for n := uint64(1); n < m.Curve*2; n++ { size := int(math.Min(float64(n%(m.Curve*2)), float64(m.Curve*2-n%(m.Curve*2)))) paddingOffsets = append(paddingOffsets, strings.Repeat(" ", size)) } // --opposite support if m.Opposite { paddingOffsets = append(paddingOffsets[m.Curve:], paddingOffsets[:m.Curve]...) } } skins := map[string]Skin{ "default": { Head: " ╚⊙ ⊙╝ ", Pede: "╚═(███)═╝", Reverse: &Skin{ Head: " ╔⊙ ⊙╗ ", Pede: "╔═(███)═╗", }, }, "frozen": { Head: " ╚⊙ ⊙╝ ", Pede: "╚═(❄❄❄)═╝", Reverse: &Skin{ Head: " ╔⊙ ⊙╗ ", Pede: "╔═(❄❄❄)═╗", }, }, "corporate": { Head: " ╚⊙ ⊙╝ ", Pede: "╚═(©©©)═╝", Reverse: &Skin{ Head: " ╔⊙ ⊙╗ ", Pede: "╔═(©©©)═╗", }, }, "love": { Head: " ╚⊙ ⊙╝ ", Pede: "╚═(♥♥♥)═╝", Reverse: &Skin{ Head: " ╔⊙ ⊙╗ ", Pede: "╔═(♥♥♥)═╗", }, }, "musician": { Head: " ╚⊙ ⊙╝ ", Pede: "╚═(♫♩♬)═╝", Reverse: &Skin{ Head: " ╔⊙ ⊙╗ ", Pede: "╔═(♫♩♬)═╗", }, }, "bocal": { Head: " ╚⊙ ⊙╝ ", Pede: "╚═(🐟🐟🐟)═╝", Reverse: &Skin{ Head: " ╔⊙ ⊙╗ ", Pede: "╔═(🐟🐟🐟)═╗", }, }, "ascii": { Head: " \\o o/ ", Pede: "|=(###)=|", Reverse: &Skin{ Head: " /o o\\ ", Pede: "|=(###)=|", }, }, "inception": { Head: " 👀 ", Pede: "╚═(🐛🐛🐛)═╝", Reverse: &Skin{ Head: " 👀 ", Pede: "╔═(🐛🐛🐛)═╗", }, }, "humancentipede": { Head: " 👀 ", Pede: "╚═(😷😷😷)═╝", Reverse: &Skin{ Head: " 👀 ", Pede: "╔═(😷😷😷)═╗", }, }, "finger": { Head: " 👀 ", Pede: "👈~~~ ~~~👉", Reverse: &Skin{ Head: " 👀 ", Pede: "👈~~~~~~~~👉", }, }, } // --skin support skin := skins[m.Skin] if skin.Head == "" { logrus.Fatalf("no such skin: '%s'", m.Skin) } // --reverse support if m.Reverse && skin.Reverse != nil && skin.Reverse.Head != "" { skin = *skin.Reverse } // --width support if m.Width < 3 { logrus.Fatalf("millipede cannot have a witch < 3") } if m.Width > 3 { w := utf8.RuneCountInString(skin.Head) head := StringToRuneSlice(skin.Head) skin.Head = string(head[:w/2]) + strings.Repeat(string(head[w/2:w/2+1]), int(m.Width-2)) + string(head[w/2+1:]) pede := StringToRuneSlice(skin.Pede) skin.Pede = string(pede[:w/2]) + strings.Repeat(string(pede[w/2:w/2+1]), int(m.Width-2)) + string(pede[w/2+1:]) } // build the millipede body var body []string if m.Curve > 0 { body = []string{paddingOffsets[m.Steps%(m.Curve*2)] + strings.TrimRight(skin.Head, " ")} } else { body = []string{strings.TrimRight(skin.Head, " ")} } var x uint64 for x = 0; x < m.Size; x++ { var line string if m.Curve > 0 { line = paddingOffsets[(m.Steps+x)%(m.Curve*2)] + skin.Pede } else { line = "" + skin.Pede } body = append(body, line) } // --reverse support if m.Reverse { for i, j := 0, len(body)-1; i < j; i, j = i+1, j-1 { body[i], body[j] = body[j], body[i] } } // --chameleon and --rainbow support for idx, line := range body { colors := []string{"red", "green", "yellow", "blue", "magenta", "cyan", "white"} fgColor := "" bgColor := "" // --chameleon support if m.Chameleon { fgColor = "black" } // --rainbow if m.Rainbow { bgColor = colors[idx%len(colors)] if m.Chameleon { fgColor = bgColor fgColor = "black" } } if fgColor != "" || bgColor != "" { paddingSize := len(line) - len(strings.TrimSpace(line)) line = strings.Repeat(" ", paddingSize) + ansi.Color(line[paddingSize:], fgColor+":"+bgColor) } if m.PadRight { line = line + strings.Repeat(" ", int(m.Curve)) } body[idx] = line } output := strings.Join(body, "\n") // --zalgo support if m.Zalgo { buf := new(bytes.Buffer) z := zalgo.NewCorrupter(buf) z.Zalgo = func(n int, r rune, z *zalgo.Corrupter) bool { if string(r) == " " || r == 10 { z.Up = 0 z.Middle = 0 z.Down = 0 } else { if z.Up == 0 { z.Up = complex(0, 0.2) z.Middle = complex(0, 0.2) z.Down = complex(0.001, 0.3) } z.Up += 0.1 z.Middle += complex(0.1, 0.2) z.Down += 0.1 } return false } fmt.Fprintln(z, output) output = buf.String() } return output }