Class: IsoDoc::XrefGen::Counter

Inherits:
Object
  • Object
show all
Defined in:
lib/isodoc/xref/xref_counter.rb

Instance Method Summary collapse

Constructor Details

#initialize(num = 0, opts = {numerals: :arabic}) ⇒ Counter

Returns a new instance of Counter.



5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# File 'lib/isodoc/xref/xref_counter.rb', line 5

def initialize(num = 0, opts = {numerals: :arabic})
  @num = num
  @letter = ""
  @subseq = ""
  @letter_override = nil
  @number_override = nil
  @style = opts[:numerals]
  @base = ""
  if num.is_a? String
    if /^\d+$/.match(num)
      @num = num.to_i
    else
      @num = nil
      @base = num[0..-2]
      @letter = num[-1]
    end
  end
end

Instance Method Details

#blank?(x) ⇒ Boolean

Returns:

  • (Boolean)


87
88
89
# File 'lib/isodoc/xref/xref_counter.rb', line 87

def blank?(x)
  x.nil? || x.empty?
end

#increment(node) ⇒ Object



91
92
93
94
95
96
97
98
99
100
101
102
103
# File 'lib/isodoc/xref/xref_counter.rb', line 91

def increment(node)
  return self if node["unnumbered"]
  @letter_override = nil
  @number_override = nil
  if node["subsequence"] != @subseq && !(blank?(node["subsequence"]) && blank?(@subseq))
    new_subseq_increment(node)
  elsif @letter.empty?
    sequence_increment(node)
  else
    subsequence_increment(node)
  end
  self
end

#listlabel(list, depth) ⇒ Object



121
122
123
124
125
126
127
128
129
# File 'lib/isodoc/xref/xref_counter.rb', line 121

def listlabel(list, depth)
  case ol_type(list, depth)
  when :arabic then @num.to_s
  when :alphabet then (96 + @num).chr.to_s
  when :alphabet_upper then (64 + @num).chr.to_s
  when :roman then RomanNumerals.to_roman(@num).downcase
  when :roman_upper then RomanNumerals.to_roman(@num).upcase
  end
end

#new_subseq_increment(node) ⇒ Object



24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# File 'lib/isodoc/xref/xref_counter.rb', line 24

def new_subseq_increment(node)
  @subseq = node["subsequence"]
  @num += 1 unless @num.nil?
  @letter = node["subsequence"] ? "a" : ""
  @base = ""
  if node["number"]
    /^(?<b>.*?)(?<n>\d*)(?<a>[a-zA-Z]*)$/ =~ node["number"]
    if !n.empty? || !a.empty?
      @letter_override = @letter = a unless a.empty?
      @number_override = @num = n.to_i unless n.empty?
      @base = b
    else
      @letter_override = node["number"]
      @letter = @letter_override if /^[a-zA-Z]$/.match(@letter_override)
    end
  end
end

#ol_type(list, depth) ⇒ Object



111
112
113
114
115
116
117
118
119
# File 'lib/isodoc/xref/xref_counter.rb', line 111

def ol_type(list, depth)
  return list["type"].to_sym if list["type"]
  return :arabic if [2, 7].include? depth
  return :alphabet if [1, 6].include? depth
  return :alphabet_upper if [4, 9].include? depth
  return :roman if [3, 8].include? depth
  return :roman_upper if [5, 10].include? depth
  return :arabic
end


105
106
107
108
109
# File 'lib/isodoc/xref/xref_counter.rb', line 105

def print
  num = @number_override || @num
  num_out = @style == :roman && !num.nil? ? RomanNumerals.to_roman(num) : num
  "#{@base}#{num_out}#{@letter_override || @letter}"
end

#sequence_increment(node) ⇒ Object



42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
# File 'lib/isodoc/xref/xref_counter.rb', line 42

def sequence_increment(node)
  if node["number"]
    @base = @letter_override = @number_override = ""
    /^(?<b>.*?)(?<n>\d+)$/ =~ node["number"]
    if blank?(n)
      @num = nil
      @base = node["number"][0..-2]
      @letter = @letter_override = node["number"][-1]
    else
      @number_override = node["number"]
      @num = n.to_i
      @base = b
      @letter = ""
    end
  else
    @num += 1
  end
end

#subsequence_increment(node) ⇒ Object



61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
# File 'lib/isodoc/xref/xref_counter.rb', line 61

def subsequence_increment(node)
  if node["number"]
    @base = ""
    @letter_override = node["number"]
    /^(?<b>.*?)(?<n>\d*)(?<a>[a-zA-Z])$/ =~ node["number"]
    if blank?(a)
      if /^\d+$/.match(node["number"])
        @letter_override = @letter = ""
        @number_override = @num = node["number"].to_i
      else
        /^(?<b>.*)(?<a>[a-zA-Z])$/ =~ node["number"]
        unless blank?(a)
          @letter = @letter_override = a
          @base = b
        end
      end
    else
      @letter_override = @letter = a
      @base = b
      @number_override = @num = n.to_i unless n.empty?
    end
  else
    @letter = (@letter.ord + 1).chr.to_s
  end
end