Class: Mdextab::Layer

Inherits:
Object
  • Object
show all
Defined in:
lib/mdextab/layer.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(mes, output) ⇒ Layer

Returns a new instance of Layer.



5
6
7
8
9
10
11
12
13
# File 'lib/mdextab/layer.rb', line 5

def initialize(mes, output)
  @mes = mes
  @output = output
  @return_from_nested_env = false

  @layer_struct = Struct.new(:table, :star, :cur_state, :fname, :lineno)
  @cur_layer = nil
  @layers = []
end

Instance Attribute Details

#cur_layerObject

Returns the value of attribute cur_layer.



3
4
5
# File 'lib/mdextab/layer.rb', line 3

def cur_layer
  @cur_layer
end

#return_from_nested_envObject

Returns the value of attribute return_from_nested_env.



3
4
5
# File 'lib/mdextab/layer.rb', line 3

def return_from_nested_env
  @return_from_nested_env
end

#sizeObject

Returns the value of attribute size.



3
4
5
# File 'lib/mdextab/layer.rb', line 3

def size
  @size
end

Instance Method Details

#add_layer(fname, lineno, state = :START) ⇒ Object



41
42
43
44
45
46
47
48
49
50
51
52
53
# File 'lib/mdextab/layer.rb', line 41

def add_layer(fname, lineno, state=:START)
  new_layer = @layer_struct.new(nil, nil, nil, fname, lineno)
  @layers << new_layer
  @size = @layers.size
  # raise if state.class != Symbol
  new_layer.cur_state = state
  if @cur_layer
    new_layer.star = @cur_layer.star
  else
    new_layer.star = false
  end
  @cur_layer = new_layer
end

#check_layers(fname) ⇒ Object



120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
# File 'lib/mdextab/layer.rb', line 120

def check_layers(fname)
  case @cur_layer.cur_state
  when :OUT_OF_TABLE
    if @layers.size > 1
      @mes.output_fatal("illeagal nested env after parsing|:OUT_OF_TABLE")
      @mes.output_fatal("@layers.size=#{@layers.size} :TABLE_START #{fname} #{table.lineno}")
      @layers.map {|x| @mes.output_debug("== @layers.cur_state=#{x.cur_state} :TABLE_START #{fname} #{x.table.lineno}") }
      @mes.output_debug("== table")
      @mes.output_info(table)
      exit(@mes.ec("EXIT_CODE_EXCEPTION"))
    end
  when :START
    if @layers.size > 1
      @mes.output_fatal("illeagal nested env after parsing|:START")
      @mes.output_fatal("@layers.size=#{@layers.size}")
      @layers.map {|x| @mes.output_error("== @layers.cur_state=#{x.cur_state} :TABLE_START #{fname} #{x.table.lineno}") }
      @mes.output_error("== table")
      @mes.output_error(table)
      exit(@mes.ec("EXIT_CODE_EXCEPTION"))
    end
  else
    @mes.output_fatal("illeagal state after parsing(@cur_layer.cur_state=#{@cur_layer.cur_state}|fname=#{fname}")
    @mes.output_fatal("@layers.size=#{@layers.size}")
    @mes.output_error("== cur_state=#{@cur_layer.cur_state}")
    @layers.map {|x| @mes.output_error("== @layers.cur_state=#{x.cur_state} #{fname}:#{x.table.lineno}") }
    @mes.output_error("")
    exit(@mes.ec("EXIT_CODE_ILLEAG<AL_STATE"))
  end
end

#cur_stateObject



20
21
22
23
# File 'lib/mdextab/layer.rb', line 20

def cur_state
  raise if @cur_layer.cur_state.class != Symbol
  @cur_layer.cur_state
end

#cur_state=(val) ⇒ Object



15
16
17
18
# File 'lib/mdextab/layer.rb', line 15

def cur_state=(val)
  # raise if val.class != Symbol
  @cur_layer.cur_state = val
end

#debug(nth, token) ⇒ Object



150
151
152
153
154
155
# File 'lib/mdextab/layer.rb', line 150

def debug(nth, token)
  @mes.output_debug("***#{nth}")
  @layers.each_with_index {|_x, ind| @mes.output_debug("@layers[#{ind}]=#{@layers[ind]}") }
  @mes.output_debug("******#{nth}")
  @mes.output_debug("Layer#debug 1 token.kind=#{token.kind} @layer.cur_state=#{@cur_layer.cur_state}")
end

#peek_prev_layerObject



63
64
65
66
67
# File 'lib/mdextab/layer.rb', line 63

def peek_prev_layer
  return nil unless @layers.size > 1

  @layers[@layers.size - 2]
end

#pop_prev_layerObject



55
56
57
58
59
60
61
# File 'lib/mdextab/layer.rb', line 55

def pop_prev_layer
  tmp_ = @layers.pop
  @size = @layers.size
  @cur_layer = @layers.last

  tmp_
end

#process_nested_table_start(token, lineno, fname) ⇒ Object



69
70
71
72
73
74
75
76
77
# File 'lib/mdextab/layer.rb', line 69

def process_nested_table_start(token, lineno, fname)
  if table.tbody.nil?
    table.add_tbody(lineno)
  end
  @mes.output_debug("B process_nested_table_start 1 @cur_layer.table=#{@cur_layer.table.object_id} token.kind=#{token.kind} token.opt[:lineno]=#{token.opt[:lineno]} cur_state=#{@cur_layer.cur_state}")
  add_layer(fname, lineno, :OUT_OF_TABLE)
  @cur_layer.table = Table.new(token.opt[:lineno], @mes, token.opt[:attr])
  @mes.output_debug("process_nested_table_start 3 token.kind=#{token.kind} cur_state=#{@cur_layer.cur_state}")
end

#process_table_end(token) ⇒ Object



79
80
81
82
83
84
# File 'lib/mdextab/layer.rb', line 79

def process_table_end(token)
  prev_layer = peek_prev_layer
  return unless prev_layer

  process_table_end_for_prev_env(token, prev_layer)
end

#process_table_end_for_prev_env(token, prev_layer) ⇒ Object



86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
# File 'lib/mdextab/layer.rb', line 86

def process_table_end_for_prev_env(token, prev_layer)
  tmp_table = @cur_layer.table
  pop_prev_layer
  @return_from_nested_env = true

  case @cur_layer.cur_state
  when :IN_TD
    prev_layer.table.td_append(tmp_table, prev_layer.star)
  when :IN_TD_NO_TBODY
    prev_layer.table.td_append(tmp_table, prev_layer.star)
  when :IN_TH
    prev_layer.table.th_append(tmp_table, prev_layer.star)
  when :IN_TH_NO_TBODY
    prev_layer.table.th_append(tmp_table, prev_layer.star)
  when :IN_TABLE
    if prev_layer.table.nil?
      @mes.output_debug("In process_nested_table_env_for_prev_env: table=nil token.kind=#{token.kind} token.opt[:lineno]=#{token.opt[:lineno]} cur_state=#{@cur_layer.cur_state}")
      raise
    end
    prev_layer.table.add(tmp_table)
  when :IN_TABLE_BODY
    prev_layer.table.add(tmp_table)
  when :START
    @mes.output_debug("In process_nested_table_env_for_prev_env: table=nil token.kind=#{token.kind} token.opt[:lineno]=#{token.opt[:lineno]} cur_state=#{@cur_layer.cur_state}")
    raise
  else
    v = prev_layer.cur_state || "nil"
    @mes.output_fatal("E100 cur_state=#{v}")
    @mes.output_fatal("table=#{prev_layer.table}")
    @mes.output_fatal("IllegalState(#{@cur_layer.cur_state} in process_table_end(#{token})")
    exit(@mes.ec("EXIT_CODE_TABLE_END"))
  end
end

#starObject



37
38
39
# File 'lib/mdextab/layer.rb', line 37

def star
  @cur_layer.star
end

#star=(val) ⇒ Object



33
34
35
# File 'lib/mdextab/layer.rb', line 33

def star=(val)
  @cur_layer.star = val
end

#tableObject



25
26
27
# File 'lib/mdextab/layer.rb', line 25

def table
  @cur_layer.table
end

#table=(val) ⇒ Object



29
30
31
# File 'lib/mdextab/layer.rb', line 29

def table=(val)
  @cur_layer.table = val
end