lib/modules/input/style/console.rb in aio_elin-1.0.1 vs lib/modules/input/style/console.rb in aio_elin-1.0.2

- old
+ new

@@ -1,222 +1,223 @@ #coding=utf-8 require "aio/core" class Aio::Module::InputStyle::Console < Aio::Module::InputStyle - include Aio::Module - include Aio::Ui::Verbose + include Aio::Module + include Aio::Ui::Verbose - class Machine + class Machine - attr_accessor :regs, :state + attr_accessor :regs, :state - def initialize - @cmd_state = CmdState.new(self) - @context_state = ContextState.new(self) - @empty_state = EmptyState.new(self) - @cmd_context = CmdContext.new + def initialize + @cmd_state = CmdState.new(self) + @context_state = ContextState.new(self) + @empty_state = EmptyState.new(self) + @cmd_context = CmdContext.new - @state = @empty_state - end + @state = @empty_state + end - def state - @state.class - end + def state + @state.class + end - def cmd_context - @cmd_context - end + def cmd_context + @cmd_context + end - def to_cmd_state - @state = @cmd_state - end + def to_cmd_state + @state = @cmd_state + end - def to_context_state - @state = @context_state - end + def to_context_state + @state = @context_state + end - def to_empty_state - @state = @empty_state - end + def to_empty_state + @state = @empty_state + end - def parse_line(line) - @state.parse_line(line) - end - end + def parse_line(line) + @state.parse_line(line) + end + end - class CmdContext + class CmdContext - attr_accessor :device_name, :cmd, :context + attr_accessor :device_name, :cmd, :context - # all_info = [[device_name, cmd, context] ... ] - attr_accessor :all_info + # all_info = [[device_name, cmd, context] ... ] + attr_accessor :all_info - def initialize - @device_name = "" - @cmd = "" - @context = [] - @all_info = [] - end + def initialize + @device_name = "" + @cmd = "" + @context = [] + @all_info = [] + end - def done - # 当之前有cmd内容的时候,比较两个的长度 - # 长的保留 - info_idx = has_cmd? - if info_idx - if @all_info[info_idx][2].size < context.size - @all_info[info_idx][2] = context - end - else - - # 如果都没有,那么就直接添加 - @all_info << [device_name, cmd, context] - end - self.clear - end + def done + # 当之前有cmd内容的时候,比较两个的长度 + # 长的保留 + info_idx = has_cmd? + if info_idx + if @all_info[info_idx][2].size < context.size + @all_info[info_idx][2] = context + end + else - def has_cmd? - @all_info.each_with_index do |info, idx| - next unless info[1] == device_name - return idx if info[2] == cmd - end + # 如果都没有,那么就直接添加 + @all_info << [device_name, cmd, context] + end + self.clear + end - return nil - end + def has_cmd? + @all_info.each_with_index do |info, idx| + next unless info[0] == device_name + return idx if info[1] == cmd + end - def clear - @device_name = "" - @cmd = "" - @context = [] - end - end + return nil + end - class State + def clear + @device_name = "" + @cmd = "" + @context = [] + end + end - include Aio::Ui::Verbose + class State - def initialize(machine) - @machine = machine - end + include Aio::Ui::Verbose - def cmd_context - @machine.cmd_context - end - end + def initialize(machine) + @machine = machine + end - class EmptyState < State - def parse_line(line) + def cmd_context + @machine.cmd_context + end + end - # 当前是空的状态 - # 判断当前行有没有模块中的命令 - line = Aio::Base::Toolkit::String.safe(line) - return unless @machine.regs.match(line) + class EmptyState < State + def parse_line(line) - @machine.to_cmd_state - @machine.parse_line(line) - end - end + # 当前是空的状态 + # 判断当前行有没有模块中的命令 + line = Aio::Base::Toolkit::String.safe(line) + return unless @machine.regs.match(line) - class CmdState < State - def parse_line(line) - # 判断是不是cmd命令行 - res = /^[\[|<]?(?<name>.*)(#|>|\])(?<cmd>.*)/.match(line) - if res.nil? - @machine.to_empty_state - return - end + @machine.to_cmd_state + @machine.parse_line(line) + end + end - # 当已经发现了是cmd行,那么紧接下来就是收集文本内容 - cmd_context.device_name = res[:name] - cmd_context.cmd = res[:cmd] - @machine.to_context_state - end - end + class CmdState < State + def parse_line(line) + # 判断是不是cmd命令行 + res = /^[\[|<]?(?<name>.*)(#|>|\])(?<cmd>.*)/.match(line) + if res.nil? + @machine.to_empty_state + return + end - class ContextState < State + # 当已经发现了是cmd行,那么紧接下来就是收集文本内容 + cmd_context.device_name = res[:name] + cmd_context.cmd = res[:cmd] + @machine.to_context_state + end + end - def parse_line(line) - # 如果这行是命令行格式,那么就代表上一个cmd内容结束 - tmp_reg = ::Regexp.new "^[\\[|<]?#{cmd_context.device_name}(#|>|\\])" + class ContextState < State - # 可能会出现UTF-8识别不出摄氏度符号的问题 - # 已经通过安全字符解决 - begin - if tmp_reg.match(line) - cmd_context.done - - # 完成后将状态设置为空,并且重新分析这一行 - # 毕竟如果这行也cmd行呢 - @machine.to_empty_state - return @machine.parse_line(line) - end - rescue => e - print_error cmd_context.device_name + " 设备巡检信息编码出现问题" - print_error line + " : " + e.message - end + def parse_line(line) + # 如果这行是命令行格式,那么就代表上一个cmd内容结束 + tmp_reg = ::Regexp.new "^[\\[|<]?#{cmd_context.device_name}(#|>|\\])" + # 可能会出现UTF-8识别不出摄氏度符号的问题 + # 已经通过安全字符解决 + begin + if tmp_reg.match(line) + cmd_context.done - cmd_context.context << line - end - end - - def initialize - super({ - :author => "Elin", - :description => "这个模块用于对命令行格式的输入处理", - :platform => "all", - }) - @machine = Machine.new - end + # 完成后将状态设置为空,并且重新分析这一行 + # 毕竟如果这行也cmd行呢 + @machine.to_empty_state + return @machine.parse_line(line) + end + rescue => e + print_error cmd_context.device_name + " 设备巡检信息编码出现问题" + print_error line + " : " + e.message + end - def parse - dir = self.input_file - dir_pn = Pathname.new(dir) - # 加载所有的cmd正则表达式 - @machine.regs = merge_regs(ext_info[:cmds_reg]) + cmd_context.context << line + end + end - # 如果是单个文件的话,直接进入文件解析模式 - if dir_pn.file? - parse_file(dir_pn) - else - - # 如果是文件夹的话,那么就对每个文件进行解析 - Find.find(dir) do |file| - fn = Pathname.new(file) - parse_file(file) if fn.file? - end - end + def initialize + super({ + :author => "Elin", + :description => "这个模块用于对命令行格式的输入处理", + :platform => "all", + }) + @machine = Machine.new + end - @machine.cmd_context.all_info.each do |info| - yield info[0], info[1], info[2] - end - end + def parse + dir = self.input_file + dir_pn = Pathname.new(dir) - def parse_file(file) - fo = File.open(file, "r+", :encoding => "utf-8") - - fo.each_line do |line| - begin - line = Aio::Base::Toolkit::String.safe(line) - line = line.strip - rescue => e - print_error line + " : " + e.message - end + # 加载所有的cmd正则表达式 + @machine.regs = merge_regs(ext_info[:cmds_reg]) - @machine.parse_line(line) - end - - # 如果最后没有done结束,则手动结束 - if @machine.state == ContextState - @machine.cmd_context.done - end - end + # 如果是单个文件的话,直接进入文件解析模式 + if dir_pn.file? + parse_file(dir_pn) + else - def merge_regs(arr_regs) - regs = Aio::Base::Toolkit::Regexp.merge(arr_regs).to_s - regs.gsub!('(^', '(') - ::Regexp.new(regs) - end + # 如果是文件夹的话,那么就对每个文件进行解析 + Find.find(dir) do |file| + fn = Pathname.new(file) + parse_file(file) if fn.file? + end + end + + @machine.cmd_context.all_info.each do |info| + yield info[0], info[1], info[2] + end + end + + def parse_file(file) + fo = File.open(file, "r+", :encoding => "utf-8") + + fo.each_line do |line| + begin + line = Aio::Base::Toolkit::String.safe(line) + line = line.strip + rescue => e + print_error line + " : " + e.message + end + + @machine.parse_line(line) + end + + # 如果最后没有done结束,则手动结束 + if @machine.state == ContextState + @machine.cmd_context.done + @machine.to_cmd_state + end + end + + def merge_regs(arr_regs) + regs = Aio::Base::Toolkit::Regexp.merge(arr_regs).to_s + regs.gsub!('(^', '(') + ::Regexp.new(regs) + end end