Class: Rote::Filters::TextFilter

Inherits:
Object
  • Object
show all
Defined in:
lib/rote/filters/base.rb

Overview

Baseclass from which Rote filters can be derived if they want to process text without macros. This class replaces macro tags/bodies with simple placeholders, containing only characters [a-z0-9] before passing it the text to the block. On return, macro markers are replaced with the corresponding (numbered) original macro body.

Direct Known Subclasses

RDoc, RedCloth

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(&handler) ⇒ TextFilter

Create a new TextFilter. The supplied block will be called with the text to be rendered, with all macros replaced by plain-text macro markers:

{ |text, page| "replacement" }


36
37
38
39
# File 'lib/rote/filters/base.rb', line 36

def initialize(&handler)
  @handler_blk = handler
  @macro_data = []
end

Instance Attribute Details

#handler_blkObject

Returns the value of attribute handler_blk.



29
30
31
# File 'lib/rote/filters/base.rb', line 29

def handler_blk
  @handler_blk
end

#macro_dataObject

Returns the value of attribute macro_data.



29
30
31
# File 'lib/rote/filters/base.rb', line 29

def macro_data
  @macro_data
end

Instance Method Details

#filter(text, page) ⇒ Object



41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
# File 'lib/rote/filters/base.rb', line 41

def filter(text, page)
  # we need to remove any macros to stop them being touched
  n = -1        
  tmp = text.gsub(MACRO_RE) do
    macro_data << $&
    # we need make the marker a 'paragraph'
    "\nxmxmxmacro#{n += 1}orcamxmxmx\n"
  end
  
  tmp = handler(tmp,page)

  # Match the placeholder, including any (and greedily all) markup that's
  # been placed before or after it, and put the macro text back.
  tmp.gsub(/(?:<.*>)?xmxmxmacro(\d+)orcamxmxmx(?:<.*>)?/) { @macro_data[$1.to_i] }      
end