Class: View

Inherits:
Object
  • Object
show all
Includes:
ErbHelper, PageNameToUrlNameConversion
Defined in:
lib/soks-view.rb

Constant Summary collapse

REDCLOTH_CACHE_NAME =
'redcloth'

Instance Attribute Summary collapse

Attributes included from ErbHelper

#author_to_email_conversion, #description, #name

Instance Method Summary collapse

Methods included from PageNameToUrlNameConversion

#add_url_name_for_page_name, #change_caps_for, #create_url_name, #increment_url_name, #page_name_for_url_name, #setup_page_name_to_url_name_conversion, #url_name_for_page_name

Methods included from ErbHelper

#file, #file2, #url

Constructor Details

#initialize(wiki, root_url, view_folder) ⇒ View

Returns a new instance of View.



319
320
321
322
323
324
325
326
327
328
329
330
# File 'lib/soks-view.rb', line 319

def initialize( wiki, root_url, view_folder )
	@wiki, @root_url, @view_folder = wiki, root_url, view_folder
	@rollingmatch, @links = BruteMatch.new, Links.new
	@redcloth_cache = wiki.load_cache(REDCLOTH_CACHE_NAME) || Hash.new
	@erb_cache = Hash.new
	@reload_erb_each_request = false
	@dont_frame_views = []
	@redcloth_hard_breaks = false
	setup_page_name_to_url_name_conversion
	wiki.watch_attentively_for( :page_revised ) { |event,page,revision| refresh_redcloth( page ) }
	wiki.watch_for(:shutdown) { wiki.save_cache(REDCLOTH_CACHE_NAME,@redcloth_cache) }
end

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missing(method, *args, &block) ⇒ Object



395
396
397
398
# File 'lib/soks-view.rb', line 395

def method_missing( method, *args, &block )
		# $LOG.debug "View method missing called for #{method} with #{args.inspect}" 
		@wiki.send( method, *args, &block ) 
end

Instance Attribute Details

#dont_frame_viewsObject

Returns the value of attribute dont_frame_views.



316
317
318
# File 'lib/soks-view.rb', line 316

def dont_frame_views
  @dont_frame_views
end

Returns the value of attribute links.



312
313
314
# File 'lib/soks-view.rb', line 312

def links
  @links
end

#redcloth_hard_breaksObject

Returns the value of attribute redcloth_hard_breaks.



317
318
319
# File 'lib/soks-view.rb', line 317

def redcloth_hard_breaks
  @redcloth_hard_breaks
end

#reload_erb_each_requestObject

Returns the value of attribute reload_erb_each_request.



315
316
317
# File 'lib/soks-view.rb', line 315

def reload_erb_each_request
  @reload_erb_each_request
end

#rollingmatchObject (readonly)

Returns the value of attribute rollingmatch.



312
313
314
# File 'lib/soks-view.rb', line 312

def rollingmatch
  @rollingmatch
end

#root_urlObject

Returns the value of attribute root_url.



314
315
316
# File 'lib/soks-view.rb', line 314

def root_url
  @root_url
end

#view_folderObject

Returns the value of attribute view_folder.



313
314
315
# File 'lib/soks-view.rb', line 313

def view_folder
  @view_folder
end

Instance Method Details

#clear_redcloth_cache(page = :all_pages) ⇒ Object



354
355
356
# File 'lib/soks-view.rb', line 354

def clear_redcloth_cache( page = :all_pages )
	( page == :all_pages ) ? @redcloth_cache.clear : @redcloth_cache.delete( page )
end

#erb_filename(klass, view) ⇒ Object



363
364
365
366
367
368
369
370
371
372
373
374
# File 'lib/soks-view.rb', line 363

def erb_filename( klass, view )
	$LOG.info "Looking for #{path_for( klass, view)}"
	 until File.exists?( path_for( klass, view ) )
	 	if klass.superclass
	   		klass = klass.superclass
	   	else
			$LOG.warn "Not found #{path_for( klass, view)}"
			raise WEBrick::HTTPStatus::NotFound
	   	end
    end
    path_for( klass, view )
end

#frame_erbObject



382
383
384
385
# File 'lib/soks-view.rb', line 382

def frame_erb
	@frame_erb = nil if reload_erb_each_request
	@frame_erb ||= load_frame_erb
end

#html(klass, view, _binding) ⇒ Object



358
359
360
361
# File 'lib/soks-view.rb', line 358

def html( klass, view, _binding )
	@erb_cache.clear if reload_erb_each_request
	( @erb_cache[ path_for( klass, view ) ] ||= ERB.new( IO.readlines( erb_filename( klass, view ) ).join ) ).result( _binding )
end

#load_frame_erbObject



387
388
389
390
391
392
393
# File 'lib/soks-view.rb', line 387

def load_frame_erb
	if File.exists? "#{view_folder}/frame.rhtml"
		ERB.new( IO.readlines( "#{view_folder}/frame.rhtml" ).join )
	else
		ERB.new( "<%= content_of_page %>" )
	end
end

#path_for(klass, view) ⇒ Object



376
# File 'lib/soks-view.rb', line 376

def path_for( klass, view ) "#{view_folder}/#{klass}_#{view.downcase}.rhtml" end

#redcloth(page) ⇒ Object



349
350
351
352
# File 'lib/soks-view.rb', line 349

def redcloth( page )
	textile = page.textile(self)
	@redcloth_cache[ page.name ] || refresh_redcloth( page )
end

#refresh_redcloth(page) ⇒ Object



344
345
346
347
# File 'lib/soks-view.rb', line 344

def refresh_redcloth( page )
	$LOG.info "Refreshing #{page}"
	@redcloth_cache[ page.name ] = WikiRedCloth.new( self, page, page.textile(self), redcloth_hard_breaks).to_html
end

#render(pagename, view = 'view', person = 'Anon.', query = {}) ⇒ Object



332
333
334
335
336
337
338
339
340
341
342
# File 'lib/soks-view.rb', line 332

def render( pagename, view = 'view', person = 'Anon.', query = {} )
	page = @wiki.page( pagename )
   	renderedview = redcloth( page )
	content_of_page = html( page.class, view, binding )
	@wiki.notify(:page_viewed, page, view, person)
	if should_frame? view 
		return frame_erb.result(binding)
	else
		return content_of_page
	end
end

#should_frame?(view) ⇒ Boolean

Returns:

  • (Boolean)


378
379
380
# File 'lib/soks-view.rb', line 378

def should_frame?( view )
	not( dont_frame_views.include? view.downcase )
end