Class: Formatter::Delimited

Inherits:
Object show all
Defined in:
lib/livetext/formatter.rb

Direct Known Subclasses

Bracketed, Double, Single

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(str, marker, tag) ⇒ Delimited

Returns a new instance of Delimited.



20
21
22
23
24
25
# File 'lib/livetext/formatter.rb', line 20

def initialize(str, marker, tag)
  @str, @marker, @tag = str.dup, marker, tag
  @buffer = ""
  @cdata  = ""
  @state  = :INITIAL
end

Class Method Details

.process(str) ⇒ Object



154
155
156
157
158
159
160
161
162
163
164
165
# File 'lib/livetext/formatter.rb', line 154

def self.process(str)
  bold = self.new(str, "*", "b")
  sb   = bold.handle
# return sb
  ital = self.new(sb, "_", "i")
  si   = ital.handle
  code = self.new(si, "`", "tt")
  sc   = code.handle
  stri = self.new(sc, "~", "strike")
  si   = stri.handle
  si
end

Instance Method Details

#bufferObject



103
104
105
106
# File 'lib/livetext/formatter.rb', line 103

def buffer
  @buffer << grab
  @state = :LOOPING
end

#cdataObject



108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
# File 'lib/livetext/formatter.rb', line 108

def cdata
  case
  when eol?
    if @cdata.empty?
      @buffer << @marker unless @marker[1] == "["
    else
      @buffer << wrap(@cdata)
    end
    @state = :FINAL
  when terminated?
    @buffer << wrap(@cdata)
    grab_terminator    # "*a *b"  case???
    @cdata = ""
    @state = :LOOPING
  else
    @cdata << grab
    @state = :CDATA
  end
end

#eol?Boolean

Returns:

  • (Boolean)


50
51
52
# File 'lib/livetext/formatter.rb', line 50

def eol?
  @str.empty?
end

#escape?Boolean

Returns:

  • (Boolean)


58
59
60
# File 'lib/livetext/formatter.rb', line 58

def escape?
  front == "\\"
end

#frontObject



34
35
36
# File 'lib/livetext/formatter.rb', line 34

def front
  @str[0]
end

#grab(n = 1) ⇒ Object



38
39
40
41
# File 'lib/livetext/formatter.rb', line 38

def grab(n=1)
  char = @str.slice!(0..(n-1))   # grab n chars
  char
end

#grab_terminatorObject



43
44
45
46
47
48
# File 'lib/livetext/formatter.rb', line 43

def grab_terminator
  @state = :LOOPING
  # goes onto buffer by default
  # Don't? what if searching for space_marker?
  # @buffer << grab  
end

#handleObject



145
146
147
148
149
150
151
152
# File 'lib/livetext/formatter.rb', line 145

def handle
  loop do
    break if @state == :FINAL
    meth = @state.downcase
    send(meth)
  end
  return @buffer
end

#initialObject



83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
# File 'lib/livetext/formatter.rb', line 83

def initial
  n = @marker.length
  case
  when escape?
    grab               # backslash
    @buffer << grab    # char
  when space_marker?
    @buffer << grab   # append the space
    grab(n)           # eat the marker
    @state = :CDATA
  when marker?
    grab(n)  # Eat the marker
    @state = :CDATA
  when eol?
    @state = :FINAL
  else
    @state = :BUFFER
  end
end

#loopingObject



128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
# File 'lib/livetext/formatter.rb', line 128

def looping
  n = @marker.length
  case
  when escape?
    grab               # backslash
    @buffer << grab    # char
  when space_marker?
    @buffer << grab   # append the space
    grab(n)           # eat the marker
    @state = :CDATA
  when eol?
    @state = :FINAL
  else   # includes marker not preceded by space!
    @buffer << grab
  end
end

#marker?Boolean

Returns:

  • (Boolean)


66
67
68
# File 'lib/livetext/formatter.rb', line 66

def marker?
  @str.start_with?(@marker)
end

#space?Boolean

Returns:

  • (Boolean)


54
55
56
# File 'lib/livetext/formatter.rb', line 54

def space?
  front == " "
end

#space_marker?Boolean

Returns:

  • (Boolean)


70
71
72
# File 'lib/livetext/formatter.rb', line 70

def space_marker?
  @str.start_with?(" " + @marker)
end

#status(where) ⇒ Object



27
28
29
30
31
32
# File 'lib/livetext/formatter.rb', line 27

def status(where)
  if $debug
    STDERR.printf "%-11s %-7s #{@marker.inspect} \n #{' '*11} state = %-8s  str = %-20s  buffer = %-20s  cdata = %-20s\n", 
      where, self.class, @state, @str.inspect, @buffer.inspect, @cdata.inspect
  end
end

#terminated?Boolean

Returns:

  • (Boolean)


62
63
64
# File 'lib/livetext/formatter.rb', line 62

def terminated?
  space?   # Will be overridden except in Single
end

#wrap(text) ⇒ Object



74
75
76
77
78
79
80
81
# File 'lib/livetext/formatter.rb', line 74

def wrap(text)
  if text.empty?
    result = @marker
    result = "" if @marker[1] == "["
    return result
  end
  "<#{@tag}>#{text}</#{@tag}>"
end