Class: IpynbDiff::IpynbSymbolMap

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

Overview

Creates a symbol map for a ipynb file (JSON format)

Constant Summary collapse

WHITESPACE_CHARS =
["\t", "\r", ' ', "\n"].freeze
VALUE_STOPPERS =
[',', '[', ']', '{', '}', *WHITESPACE_CHARS].freeze

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(notebook, objects_to_ignore = []) ⇒ IpynbSymbolMap

Returns a new instance of IpynbSymbolMap.



21
22
23
24
25
26
27
# File 'lib/ipynb_symbol_map.rb', line 21

def initialize(notebook, objects_to_ignore = [])
  @chars = notebook.chars
  @current_line = 0
  @char_idx = 0
  @results = {}
  @objects_to_ignore = objects_to_ignore
end

Instance Attribute Details

#char_idxObject (readonly)

Returns the value of attribute char_idx.



15
16
17
# File 'lib/ipynb_symbol_map.rb', line 15

def char_idx
  @char_idx
end

#current_lineObject (readonly)

Returns the value of attribute current_line.



15
16
17
# File 'lib/ipynb_symbol_map.rb', line 15

def current_line
  @current_line
end

#resultsObject (readonly)

Returns the value of attribute results.



15
16
17
# File 'lib/ipynb_symbol_map.rb', line 15

def results
  @results
end

Class Method Details

.parse(notebook, objects_to_ignore = []) ⇒ Object



10
11
12
# File 'lib/ipynb_symbol_map.rb', line 10

def parse(notebook, objects_to_ignore = [])
  IpynbSymbolMap.new(notebook, objects_to_ignore).parse('')
end

Instance Method Details

#add_result(key, line_number) ⇒ Object



111
112
113
# File 'lib/ipynb_symbol_map.rb', line 111

def add_result(key, line_number)
  @results[key] = line_number
end

#check_for_new_lineObject



147
148
149
# File 'lib/ipynb_symbol_map.rb', line 147

def check_for_new_line
  @current_line += 1 if current_char == "\n"
end

#current_charObject



135
136
137
# File 'lib/ipynb_symbol_map.rb', line 135

def current_char
  @chars[@char_idx]
end

#current_should_be(another_char) ⇒ Object

Raises:



143
144
145
# File 'lib/ipynb_symbol_map.rb', line 143

def current_should_be(another_char)
  raise InvalidTokenError unless current_char == another_char
end

#increment_char_indexObject



126
127
128
# File 'lib/ipynb_symbol_map.rb', line 126

def increment_char_index
  @char_idx += 1
end

#next_and_skip_whitespacesObject



130
131
132
133
# File 'lib/ipynb_symbol_map.rb', line 130

def next_and_skip_whitespaces
  increment_char_index
  skip_whitespaces
end

#parse(prefix = '.') ⇒ Object



29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
# File 'lib/ipynb_symbol_map.rb', line 29

def parse(prefix = '.')
  skip_whitespaces

  if (c = current_char) == '"'
    parse_string
  elsif c == '['
    parse_array(prefix)
  elsif c == '{'
    parse_object(prefix)
  else
    parse_value
  end

  results
end

#parse_array(prefix) ⇒ Object



45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
# File 'lib/ipynb_symbol_map.rb', line 45

def parse_array(prefix)
  # [1, 2, {"some": "object"}, [1]]

  i = 0

  current_should_be '['

  loop do
    break if skip_beginning(']')

    new_prefix = "#{prefix}.#{i}"

    add_result(new_prefix, current_line)

    parse(new_prefix)

    i += 1
  end
end

#parse_object(prefix) ⇒ Object



65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
# File 'lib/ipynb_symbol_map.rb', line 65

def parse_object(prefix)
  # {"name":"value", "another_name": [1, 2, 3]}

  current_should_be '{'

  loop do
    break if skip_beginning('}')

    prop_name = parse_string(return_value: true)

    next_and_skip_whitespaces

    current_should_be ':'

    next_and_skip_whitespaces

    if @objects_to_ignore.include? prop_name
      skip
    else
      new_prefix = "#{prefix}.#{prop_name}"

      add_result(new_prefix, current_line)

      parse(new_prefix)
    end
  end
end

#parse_string(return_value: false) ⇒ Object



93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
# File 'lib/ipynb_symbol_map.rb', line 93

def parse_string(return_value: false)
  current_should_be '"'
  init_idx = @char_idx

  loop do
    increment_char_index

    break if @char_idx > @chars.length

    if current_char == '"' && prev_char != '\\'
      init_idx += 1
      break
    end
  end

  @chars[init_idx...@char_idx].join if return_value
end

#parse_valueObject



115
116
117
# File 'lib/ipynb_symbol_map.rb', line 115

def parse_value
  increment_char_index until VALUE_STOPPERS.include?(current_char)
end

#prev_charObject



139
140
141
# File 'lib/ipynb_symbol_map.rb', line 139

def prev_char
  @chars[@char_idx - 1]
end

#skipObject



151
152
153
154
155
156
157
158
159
160
161
162
163
# File 'lib/ipynb_symbol_map.rb', line 151

def skip
  skip_whitespaces

  if (c = current_char) == '"'
    parse_string
  elsif c == '['
    skip_array
  elsif c == '{'
    skip_object
  else
    parse_value
  end
end

#skip_arrayObject



165
166
167
168
169
170
171
# File 'lib/ipynb_symbol_map.rb', line 165

def skip_array
  loop do
    break if skip_beginning(']')

    skip
  end
end

#skip_beginning(closing_char) ⇒ Object



190
191
192
193
194
195
196
197
198
199
# File 'lib/ipynb_symbol_map.rb', line 190

def skip_beginning(closing_char)

  check_for_new_line

  next_and_skip_whitespaces

  return true if current_char == closing_char

  next_and_skip_whitespaces if current_char == ','
end

#skip_objectObject



173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
# File 'lib/ipynb_symbol_map.rb', line 173

def skip_object

  loop do
    break if skip_beginning('}')

    parse_string

    next_and_skip_whitespaces

    current_should_be ':'

    next_and_skip_whitespaces

    skip
  end
end

#skip_whitespacesObject



119
120
121
122
123
124
# File 'lib/ipynb_symbol_map.rb', line 119

def skip_whitespaces
  while WHITESPACE_CHARS.include?(current_char)
    check_for_new_line
    increment_char_index
  end
end