Class: Metrocot::BasePattern

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

Overview

base class for all other patterns. Provides some reasonable default behaviours.

Constant Summary collapse

@@instance_count =
0

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(source) ⇒ BasePattern

Returns a new instance of BasePattern.



170
171
172
173
174
# File 'lib/metrocot.rb', line 170

def initialize( source )
	@source = source 
	@pattern_no = @@instance_count
	@@instance_count += 1
end

Instance Attribute Details

#matchedObject

Returns the value of attribute matched.



166
167
168
# File 'lib/metrocot.rb', line 166

def matched
  @matched
end

#metrocotObject

Returns the value of attribute metrocot.



166
167
168
# File 'lib/metrocot.rb', line 166

def metrocot
  @metrocot
end

#nameObject

Returns the value of attribute name.



166
167
168
# File 'lib/metrocot.rb', line 166

def name
  @name
end

#node_scraperObject

Returns the value of attribute node_scraper.



166
167
168
# File 'lib/metrocot.rb', line 166

def node_scraper
  @node_scraper
end

#pattern_noObject

Returns the value of attribute pattern_no.



166
167
168
# File 'lib/metrocot.rb', line 166

def pattern_no
  @pattern_no
end

#predObject

Returns the value of attribute pred.



166
167
168
# File 'lib/metrocot.rb', line 166

def pred
  @pred
end

#sourceObject

Returns the value of attribute source.



166
167
168
# File 'lib/metrocot.rb', line 166

def source
  @source
end

#succObject

Returns the value of attribute succ.



166
167
168
# File 'lib/metrocot.rb', line 166

def succ
  @succ
end

Class Method Details

.parse(s) ⇒ Object



188
189
190
# File 'lib/metrocot.rb', line 188

def self.parse(s)
	raise "not supported"
end

Instance Method Details

#default_scannerObject



280
281
282
# File 'lib/metrocot.rb', line 280

def default_scanner
	nil
end

#descriptionObject



192
193
194
195
196
197
198
# File 'lib/metrocot.rb', line 192

def description
	if name 
		"#{self.class.name} \"#{name}\""
	else
		self.class.name
	end
end

#dump(level, out) ⇒ Object



184
185
186
# File 'lib/metrocot.rb', line 184

def dump( level, out ) 
	out << "  " * level + description + " p=#{priority}\n"
end

#dump_match_map(out, level, match_map) ⇒ Object



201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
# File 'lib/metrocot.rb', line 201

def dump_match_map( out, level, match_map )
	if match_map.is_a? Hash
		out << "{\n"
		level += 1
		match_map.each { |key, value|
			out << "  " * level + "#{key} => " 
			dump_match_map( out, level, value )
		}
		level -= 1
		out << "  " * level + "}\n"
	elsif match_map.is_a? Array
		out << "[\n"
		level += 1
		match_map.each { |value|
			out << "  " * level 
			dump_match_map( out, level, value )
		}
		level -= 1
		out << "  " * level + "]\n"
	elsif match_map.is_a? String
		out << "\"" + match_map + "\"\n"
	elsif match_map.is_a? Hpricot::Elem
		out << "<" + match_map.stag.name + ">\n"
	else
		out << match_map.class.to_s + "\n"
	end
end

#each_match(match_range, match_map) ⇒ Object



240
241
242
# File 'lib/metrocot.rb', line 240

def each_match( match_range, match_map )
	log_match_data("each_match", match_range, match_map)
end

#log(s) ⇒ Object



180
181
182
# File 'lib/metrocot.rb', line 180

def log( s ) 
	metrocot.log("#{self.description}: #{s}")
end

#log_match_data(msg, match_range, match_map) ⇒ Object



230
231
232
233
234
235
236
237
# File 'lib/metrocot.rb', line 230

def log_match_data( msg, match_range, match_map )
	log("#{msg} #{match_range.describe} map:")
	if @node_scraper.verbose	
		if ! match_map.nil? && match_map != {} 
			dump_match_map( STDOUT, 0, match_map )
		end
	end
end

#optionalObject



176
177
178
# File 'lib/metrocot.rb', line 176

def optional
	false
end

#priorityObject



244
245
246
# File 'lib/metrocot.rb', line 244

def priority
	0
end

#with_scanned_match_data(match_map, match_data) ⇒ Object



248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
# File 'lib/metrocot.rb', line 248

def with_scanned_match_data( match_map, match_data )
	
	scanner = if name 
		@node_scraper.scanner_by_name(name) 
	else 
		default_scanner
	end

	if scanner
#				begin
			match_map[name] = scanner.scan(match_data)
#				rescue
#					log("scanner error: #{$!}")
#					return nil
#				end
	elsif name
		match_map[name] = match_data
	elsif self.is_a?(CompositePattern) && match_data.is_a?(Hash)
		log("copying #{match_data.class.name} match data from #{self.description}")
		match_data.each { |key, value|
			match_map[key] = value
		}
	else
		log("not carrying #{match_data.class.name} match data from #{self.description}")
	end
	
	result = yield( match_map )
	match_map.delete(name) if name
	return result

end