github.com/yinchengtsinghua/golang-Eos-dpos-Ethereum@v0.0.0-20190121132951-92cc4225ed8e/console/prompter.go (about) 1 2 //此源码被清华学神尹成大魔王专业翻译分析并修改 3 //尹成QQ77025077 4 //尹成微信18510341407 5 //尹成所在QQ群721929980 6 //尹成邮箱 yinc13@mails.tsinghua.edu.cn 7 //尹成毕业于清华大学,微软区块链领域全球最有价值专家 8 //https://mvp.microsoft.com/zh-cn/PublicProfile/4033620 9 //版权所有2016 Go Ethereum作者 10 //此文件是Go以太坊库的一部分。 11 // 12 //Go-Ethereum库是免费软件:您可以重新分发它和/或修改 13 //根据GNU发布的较低通用公共许可证的条款 14 //自由软件基金会,或者许可证的第3版,或者 15 //(由您选择)任何更高版本。 16 // 17 //Go以太坊图书馆的发行目的是希望它会有用, 18 //但没有任何保证;甚至没有 19 //适销性或特定用途的适用性。见 20 //GNU较低的通用公共许可证,了解更多详细信息。 21 // 22 //你应该收到一份GNU较低级别的公共许可证副本 23 //以及Go以太坊图书馆。如果没有,请参见<http://www.gnu.org/licenses/>。 24 25 package console 26 27 import ( 28 "fmt" 29 "strings" 30 31 "github.com/peterh/liner" 32 ) 33 34 //stdin保存stdin行阅读器(也使用stdout进行打印提示)。 35 // 36 var Stdin = newTerminalPrompter() 37 38 //userprompter定义控制台提示用户 39 //各种类型的输入。 40 type UserPrompter interface { 41 //promptinput向用户显示给定的提示并请求一些文本 42 // 43 PromptInput(prompt string) (string, error) 44 45 // 46 //要输入的数据,但不能回送到终端。 47 //方法返回用户提供的输入。 48 PromptPassword(prompt string) (string, error) 49 50 //promptconfirm向用户显示给定的提示并请求布尔值 51 //做出选择,返回该选择。 52 PromptConfirm(prompt string) (bool, error) 53 54 //setHistory设置prompter允许的输入回滚历史记录 55 //the user to scroll back to. 56 SetHistory(history []string) 57 58 //AppendHistory将一个条目追加到回滚历史记录。应该叫它 59 //如果且仅当追加提示是有效命令时。 60 AppendHistory(command string) 61 62 //清除历史记录清除整个历史记录 63 ClearHistory() 64 65 //setwordCompleter设置提示器将调用的完成函数 66 //当用户按Tab键时获取完成候选项。 67 SetWordCompleter(completer WordCompleter) 68 } 69 70 //WordCompleter使用光标位置获取当前编辑的行,并 71 //返回要完成的部分单词的完成候选词。如果 72 //电话是“你好,我!!光标在第一个“!”之前,(“你好, 73 //哇!!,9)传递给可能返回的完成者(“hello,”,“world”, 74 //“Word”},“!!!!“你好,世界!!. 75 type WordCompleter func(line string, pos int) (string, []string, string) 76 77 //TerminalPrompter是一个由liner包支持的用户Prompter。它支持 78 //提示用户输入各种输入,其中包括不回显密码 79 //输入。 80 type terminalPrompter struct { 81 *liner.State 82 warned bool 83 supported bool 84 normalMode liner.ModeApplier 85 rawMode liner.ModeApplier 86 } 87 88 // 89 //standard input and output streams. 90 func newTerminalPrompter() *terminalPrompter { 91 p := new(terminalPrompter) 92 //在调用newliner之前获取原始模式。 93 //这通常是常规的“煮熟”模式,其中字符回音。 94 normalMode, _ := liner.TerminalMode() 95 //打开班轮。它切换到原始模式。 96 p.State = liner.NewLiner() 97 rawMode, err := liner.TerminalMode() 98 if err != nil || !liner.TerminalSupported() { 99 p.supported = false 100 } else { 101 p.supported = true 102 p.normalMode = normalMode 103 p.rawMode = rawMode 104 //在不提示的情况下切换回正常模式。 105 normalMode.ApplyMode() 106 } 107 p.SetCtrlCAborts(true) 108 p.SetTabCompletionStyle(liner.TabPrints) 109 p.SetMultiLineMode(true) 110 return p 111 } 112 113 //promptinput向用户显示给定的提示并请求一些文本 114 //要输入的数据,返回用户的输入。 115 func (p *terminalPrompter) PromptInput(prompt string) (string, error) { 116 if p.supported { 117 p.rawMode.ApplyMode() 118 defer p.normalMode.ApplyMode() 119 } else { 120 //liner试图巧妙地打印提示 121 //如果输入被重定向,则不打印任何内容。 122 //总是通过打印提示来取消智能。 123 fmt.Print(prompt) 124 prompt = "" 125 defer fmt.Println() 126 } 127 return p.State.Prompt(prompt) 128 } 129 130 //提示密码向用户显示给定的提示并请求一些文本 131 //要输入的数据,但不能回送到终端。 132 //方法返回用户提供的输入。 133 func (p *terminalPrompter) PromptPassword(prompt string) (passwd string, err error) { 134 if p.supported { 135 p.rawMode.ApplyMode() 136 defer p.normalMode.ApplyMode() 137 return p.State.PasswordPrompt(prompt) 138 } 139 if !p.warned { 140 fmt.Println("!! Unsupported terminal, password will be echoed.") 141 p.warned = true 142 } 143 //正如在提示中一样,在这里处理打印提示,而不是依赖于衬线。 144 fmt.Print(prompt) 145 passwd, err = p.State.Prompt("") 146 fmt.Println() 147 return passwd, err 148 } 149 150 //promptconfirm向用户显示给定的提示并请求布尔值 151 //做出选择,返回该选择。 152 func (p *terminalPrompter) PromptConfirm(prompt string) (bool, error) { 153 input, err := p.Prompt(prompt + " [y/N] ") 154 if len(input) > 0 && strings.ToUpper(input[:1]) == "Y" { 155 return true, nil 156 } 157 return false, err 158 } 159 160 //setHistory设置prompter允许的输入回滚历史记录 161 //要回滚到的用户。 162 func (p *terminalPrompter) SetHistory(history []string) { 163 p.State.ReadHistory(strings.NewReader(strings.Join(history, "\n"))) 164 } 165 166 //AppendHistory将一个条目追加到回滚历史记录。 167 func (p *terminalPrompter) AppendHistory(command string) { 168 p.State.AppendHistory(command) 169 } 170 171 //清除历史记录清除整个历史记录 172 func (p *terminalPrompter) ClearHistory() { 173 p.State.ClearHistory() 174 } 175 176 //setwordCompleter设置提示器将调用的完成函数 177 //当用户按Tab键时获取完成候选项。 178 func (p *terminalPrompter) SetWordCompleter(completer WordCompleter) { 179 p.State.SetWordCompleter(liner.WordCompleter(completer)) 180 }