返回

Go-figure Introduction

Go第三方库之go-figure: 用于从普通文本生成 ASCII 艺术字。


介绍

go-figure可从文本打印出精美的 ASCII 艺术图。它支持FIGlet文件及其大部分功能。

这个包的灵感来自于 Ruby gem artii,但是是从头开始构建,并且具有不同的功能集。

它在go语言中通常用于在终端中生成 ASCII 艺术字。该库提供了多种字体和样式,让用户可以轻松地创建视觉上吸引人的文本输出。


快速使用

首先,使用以下命令安装 go-figure 包:

1
go get -u github.com/common-nighthawk/go-figure

基本使用

1
2
3
4
5
6
7
8
package main

import "github.com/common-nighthawk/go-figure"

func main() {
    myFigure := figure.NewFigure("Hello World", "", true)
    myFigure.Print()
}

在上面的代码中,NewFigure 函数创建了一个新的图形对象。第一个参数是要显示的文本,第二个参数是字体名称(默认为标准字体),第三个参数是严格模式开关(true:非ASCII字符报错,反之用?替代)。Print 方法将图形打印到控制台。

运行上面代码输出:

1
2
3
4
5
6
$ go run main.go 
  _   _          _   _                                       _       _
 | | | |   ___  | | | |   ___     __      __   ___    _ __  | |   __| |
 | |_| |  / _ \ | | | |  / _ \    \ \ /\ / /  / _ \  | '__| | |  / _` |
 |  _  | |  __/ | | | | | (_) |    \ V  V /  | (_) | | |    | | | (_| |
 |_| |_|  \___| |_| |_|  \___/      \_/\_/    \___/  |_|    |_|  \__,_|

创建figure对象

有三种方法可以创建图形对象。它们是: func NewFigurefunc NewColorFigurefunc NewFigureWithFont

每个构造函数都接受以下参数:文本、字体和严格模式。“color”构造函数接受颜色作为附加参数。“with font”以不同方式指定字体。具体方法如下:

1
2
3
func NewFigure(phrase, fontName string, strict bool) figure
func NewColorFigure(phrase, fontName string, color string, strict bool) figure
func NewFigureWithFont(phrase string, reader io.Reader, strict bool) figure
  • NewFigure只需要字体的名称,并使用存储在 bindata 此包中附带的字体文件。

    • 如果传递了字体名称的空字符串,则提供默认值(标准字体)。也就是说,这两个都是有效的:

      1
      2
      3
      4
      5
      
      myFigure := figure.NewFigure("Foo Bar", "", true)
      
      // go-figure/font.go
      // const defaultFont = "standard"
      myFigure := figure.NewFigure("Foo Bar", "standard", true)
      
    • 请注意字体名称区分大小写。

      默认支持的字体如下(用空格分隔):

      3-d 3x5 5lineoblique acrobatic alligator alligator2 alphabet avatar banner banner3-D banner3 banner4 barbwire basic bell big bigchief binary block bubble bulbhead calgphy2 caligraphy catwalk chunky coinstak colossal computer contessa contrast cosmic cosmike cricket cursive cyberlarge cybermedium cybersmall diamond digital doh doom dotmatrix drpepper eftichess eftifont eftipiti eftirobot eftitalic eftiwall eftiwater epic fender fourtops fuzzy goofy gothic graffiti hollywood invita isometric1 isometric2 isometric3 isometric4 italic ivrit jazmine jerusalem katakana kban larry3d lcd lean letters linux lockergnome madrid marquee maxfour mike mini mirror mnemonic morse moscow nancyj-fancy nancyj-underlined nancyj nipples ntgreek o8 ogre pawp peaks pebbles pepper poison puffy pyramid rectangles relief relief2 rev roman rot13 rounded rowancap rozzo runic runyc sblood script serifcap shadow short slant slide slscript small smisome1 smkeyboard smscript smshadow smslant smtengwar speed stampatello standard starwars stellar stop straight tanja tengwar term thick thin threepoint ticks ticksslant tinker-toy tombstone trek tsalagi twopoint univers usaflag wavy weird

  • NewFigureWithFont,直接接受字体文件的reader。这允许您 BYOF(自带字体)。提供 flf 的io.Reader即可。

  • NewColorFigure可以制作色彩鲜艳的图形!目前支持的颜色有:蓝色blue,青色cyan,灰色gray,绿色green,紫色purple,红色red,白色white,黄色yellow。

    • 示例:figure.NewColorFigure("Hello World", "", "cyan", true).Print()
  • 严格模式规定如何处理标准 ASCII 以外的字符。设置为 true 时,非 ASCII 字符(字符代码 32-127 之外)将导致程序崩溃。设置为 false 时,这些字符将被替换为问号(“?”)。每个示例如下:

    figure.NewFigure("Foo 👍 Bar", "alphabet", true).Print()

    1
    
    2016/12/01 19:35:38 invalid input.
    

    figure.NewFigure("Foo 👍 Bar", "alphabet", false).Print()

    1
    2
    3
    4
    5
    
     _____                     ___     ____                 
     |  ___|   ___     ___     |__ \   | __ )    __ _   _ __ 
     | |_     / _ \   / _ \      / /   |  _ \   / _` | | '__|
     |  _|   | (_) | | (_) |    |_|    | |_) | | (_| | | |   
     |_|      \___/   \___/     (_)    |____/   \__,_| |_|   
    

打印figure对象

调用figure对象的Print方法即可将对应艺术字输出的终端。没有返回值。myFigure.Print()

默认字体推荐

  • figure.NewFigure("Arlettebrook", "standard", true).Print()

    1
    2
    3
    4
    5
    
         _             _          _     _            _                              _
        / \     _ __  | |   ___  | |_  | |_    ___  | |__    _ __    ___     ___   | | __
       / _ \   | '__| | |  / _ \ | __| | __|  / _ \ | '_ \  | '__|  / _ \   / _ \  | |/ /
      / ___ \  | |    | | |  __/ | |_  | |_  |  __/ | |_) | | |    | (_) | | (_) | |   < 
     /_/   \_\ |_|    |_|  \___|  \__|  \__|  \___| |_.__/  |_|     \___/   \___/  |_|\_\
    
  • figure.NewFigure("Arlettebrook", "doom", true).Print()

    1
    2
    3
    4
    5
    6
    
      ___         _        _    _          _                          _
     / _ \       | |      | |  | |        | |                        | |   
    / /_\ \ _ __ | |  ___ | |_ | |_   ___ | |__   _ __   ___    ___  | | __
    |  _  || '__|| | / _ \| __|| __| / _ \| '_ \ | '__| / _ \  / _ \ | |/ /
    | | | || |   | ||  __/| |_ | |_ |  __/| |_) || |   | (_) || (_) ||   <
    \_| |_/|_|   |_| \___| \__| \__| \___||_.__/ |_|    \___/  \___/ |_|\_\
    
  • figure.NewFigure("Arlettebrook", "puffy", true).Print()

    1
    2
    3
    4
    5
    6
    
     _____        _           _    _           _                          _
    (  _  )      (_ )        ( )_ ( )_        ( )                        ( )
    | (_) | _ __  | |    __  | ,_)| ,_)   __  | |_    _ __    _      _   | |/')
    |  _  |( '__) | |  /'__`\| |  | |   /'__`\| '_`\ ( '__) /'_`\  /'_`\ | , <
    | | | || |    | | (  ___/| |_ | |_ (  ___/| |_) )| |   ( (_) )( (_) )| |\`\
    (_) (_)(_)   (___)`\____)`\__)`\__)`\____)(_,__/'(_)   `\___/'`\___/'(_) (_)
    
  • figure.NewFigure("Arlettebrook", "big", true).Print()

    1
    2
    3
    4
    5
    6
    
                        _          _     _            _                              _
         /\            | |        | |   | |          | |                            | |
        /  \     _ __  | |   ___  | |_  | |_    ___  | |__    _ __    ___     ___   | | __
       / /\ \   | '__| | |  / _ \ | __| | __|  / _ \ | '_ \  | '__|  / _ \   / _ \  | |/ /
      / ____ \  | |    | | |  __/ | |_  | |_  |  __/ | |_) | | |    | (_) | | (_) | |   <
     /_/    \_\ |_|    |_|  \___|  \__|  \__|  \___| |_.__/  |_|     \___/   \___/  |_|\_\
    
  • figure.NewFigure("Arlettebrook", "rounded", true).Print()

    1
    2
    3
    4
    5
    6
    
     _______         _                               _                           _
    (_______)       | |           _      _          | |                         | |
     _______   ____ | |  _____  _| |_  _| |_  _____ | |__    ____   ___    ___  | |  _
    |  ___  | / ___)| | | ___ |(_   _)(_   _)| ___ ||  _ \  / ___) / _ \  / _ \ | |_/ )
    | |   | || |    | | | ____|  | |_   | |_ | ____|| |_) )| |    | |_| || |_| ||  _ (
    |_|   |_||_|     \_)|_____)   \__)   \__)|_____)|____/ |_|     \___/  \___/ |_| \_)
    
  • 更多样式参考


高级用法

动画效果

go-figure 还支持简单的动画效果,如闪烁、滚动和跳舞。

闪烁

闪烁用到的方法是:func (fig figure) Blink(duration, timeOn, timeOff int)

  • duration: 动画持续时间(毫秒)。整个闪烁过程将持续这么长时间。

  • timeOn: 文字亮起的时间(毫秒)。在这段时间内,文字将显示在屏幕上。

  • timeOff: 文字熄灭的时间(毫秒)。在这段时间内,文字将从屏幕上消失。如果 timeOff 设置为 -1,闪烁的间隔将与 timeOn 相同,从而实现均匀的闪烁效果。

示例:

1
2
3
	colorFigure := figure.NewColorFigure("Hello World", "", "cyan", true)
	colorFigure.Blink(3000, 500, -1)
	colorFigure.Print()

闪烁、滚动和跳舞完成之后,不会打印艺术字,再次调用Print方法打印,效果更好。

滚动

滚动用到的方法是:func (fig figure) Scroll(duration, stillness int, direction string)

  • duration: 动画持续时间(毫秒)。整个滚动过程将持续这么长时间。

  • stillness: 文字在移动前静止的时间(毫秒)。时间越短,滚动速度越快。

  • direction: 滚动的方向,可以是 “left” 或 “right”(不区分大小写)。如果提供的方向无效,将默认为 “left”。

示例:

1
2
3
	colorFigure := figure.NewColorFigure("Hello World", "", "cyan", true)
	colorFigure.Scroll(3000, 300, "left")
	colorFigure.Print()

跳舞

跳舞用到的方法是:func (fig figure) Dance(duration, freeze int)

  • 效果不是特别好。不推荐使用。

  • duration: 动画持续时间(毫秒)。整个跳舞过程将持续这么长时间。

  • freeze: 每次跳舞姿势之间的停顿时间(毫秒)。时间越短,动作变化越快。

示例:

1
2
3
	colorFigure := figure.NewColorFigure("Hello World", "", "cyan", true)
	colorFigure.Dance(3000, 300)
	colorFigure.Print()

输出到其他地方

如果想将输出写入文件或其他 io.Writer,可以使用 Write 方法:

1
func Write(w io.Writer, fig figure)

该函数接受两个参数:w是一个实现 io.Writer 接口中所有方法的值。 fig是将要写入的图形。没有颜色。

示例:

  1. 写入文件:

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    
    	colorFigure := figure.NewColorFigure("Hello world",
    		"", "cyan", true)
    	colorFigure.Print()
    	file, err := os.OpenFile("./demo.txt",
    		os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0666)
    	if err != nil {
    		log.Panicf("OpenFile error: %s", err)
    	}
    
    	defer func(file *os.File) {
    		if err := file.Close(); err != nil {
    			log.Panicf("Close file error: %s", err)
    		}
    	}(file)
    
    	figure.Write(file, colorFigure)
    
  2. 响应请求:

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    
    	http.HandleFunc("/hi", func(w http.ResponseWriter, r *http.Request) {
    		newFigure := figure.NewFigure("Arlettebrook", "", true)
    		figure.Write(w, newFigure)
    	})
    
    	log.Println("HTTP serve Start running...")
    	err := http.ListenAndServe("localhost:8080", nil)
    	if err != nil {
    		log.Panicf("Start HTTP serve error: %s", err)
    	}
    

    启动程序之后,在浏览器中访问 http://localhost:8080/hi 即可输出指定艺术字。


参考