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  }