Class: LtdTemplate::Proxy::String

Inherits:
LtdTemplate::Proxy show all
Defined in:
lib/ltdtemplate/proxy/string.rb

Instance Attribute Summary

Attributes included from Value

#runtime_methods

Instance Method Summary collapse

Methods inherited from LtdTemplate::Proxy

#initialize, #rubyverse_original, #rubyversed

Methods included from Value

#do_methods, #do_run_method, included, #initialize, #inspect, #rubyversed, #tpl_boolean

Constructor Details

This class inherits a constructor from LtdTemplate::Proxy

Instance Method Details

#do_add(opts) ⇒ Object

“Add” (concatenate) strings



61
62
63
64
65
66
67
68
69
70
71
# File 'lib/ltdtemplate/proxy/string.rb', line 61

def do_add (opts)
	combined = @original
	if params = opts[:parameters]
 params.each(:seq) do |key, val|
		val = rubyversed(val).tpl_text
		@template.using :string_length, (combined.length + val.length)
		combined += val
 end
	end
	meter combined
end

#do_compare(opts) ⇒ Object

Implement string comparison operators



103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
# File 'lib/ltdtemplate/proxy/string.rb', line 103

def do_compare (opts)
	if (params = opts[:parameters]) && (params.size(:seq) > 0)
 diff = rubyversed(params[0]).tpl_text
	else
 diff = ''
	end

	diff = @original <=> diff
	case opts[:method]
	when '<' then diff < 0
	when '<=' then diff <= 0
	when '==' then diff == 0
	when '!=' then diff != 0
	when '>=' then diff >= 0
	when '>' then diff > 0
	end
end

#do_index(opts) ⇒ Object

Index and rindex str.index(substring[, offset]) str.rindex(substring[, offset]



124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
# File 'lib/ltdtemplate/proxy/string.rb', line 124

def do_index (opts)
	substr, offset = '', nil
	params = opts[:parameters]
	if params && params.size(:seq) > 0
 substr = rubyversed(params[0]).tpl_text
	end
	offset = params[1] if params && params.size(:seq) > 1
	case opts[:method][0]
	when 'r'
 offset = -1 unless offset.is_a? Integer
 @original.rindex(substr, offset) || -1
	else
 offset = 0 unless offset.is_a? Integer
 @original.index(substr, offset) || -1
	end
end

#do_join(opts) ⇒ Object

String join str.join(list)



143
144
145
146
147
148
149
150
# File 'lib/ltdtemplate/proxy/string.rb', line 143

def do_join (opts)
	params = opts[:parameters]
	if params && params.size(:seq) > 0
 meter(params.values(:seq).map { |val| rubyversed(val).tpl_text }.
   join(@original))
	else ''
	end
end

#do_match(opts) ⇒ Object

Match a regular expression



74
75
76
77
78
79
80
81
# File 'lib/ltdtemplate/proxy/string.rb', line 74

def do_match (opts)
	if (params = opts[:parameters]) && params.size(:seq) > 0 &&
	  params[0].is_a?(::Regexp)
 params[0].in_rubyverse(@template).evaluate :method => 'match',
   :parameters => Sarah[ @original, *params[1..-1].values ]
	else nil
	end
end

#do_multiply(opts) ⇒ Object

“Multiply” (repeat) strings



84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
# File 'lib/ltdtemplate/proxy/string.rb', line 84

def do_multiply (opts)
	str = ''
	if (params = opts[:parameters]) && params.size(:seq) > 0
 times = params[0]
 if times.is_a? Integer
		str = @original
		if times < 0
  str = str.reverse
  times = -times
		end
		@template.use :string_total, (str.length * times)
		@template.using :string_length, (str.length * times)
		str = str * times
 end
	end
	meter str
end

#do_range_slice(opts) ⇒ Object

Range and slice: str.range([begin[, end]]) str.slice([begin[, length]])



155
156
157
158
159
160
161
162
163
164
165
# File 'lib/ltdtemplate/proxy/string.rb', line 155

def do_range_slice (opts)
	op1, op2 = 0, -1
	params = opts[:parameters]
	op1 = params[0] if params && params.size(:seq) > 0
	op2 = params[1] if params && params.size(:seq) > 1
	if opts[:method][0] == 'r' || op2 < 0
 str = @original[op1..op2]
	else str = @original[op1, op2]
	end
	meter(str || '')
end

#do_replace(opts) ⇒ Object

Replace and replace one str.replace(pattern, replacement) str.replace1(pattern, replacement)



170
171
172
173
174
175
176
177
178
179
180
181
182
# File 'lib/ltdtemplate/proxy/string.rb', line 170

def do_replace (opts)
	if (params = opts[:parameters]) && params.size(:seq) > 1
 pat, repl = params[0..1]
 if opts[:method][-1] == '1'
		# replace one
		meter @original.sub(pat, repl)
 else
		# replace all
		meter @original.gsub(pat, repl)
 end
	else @original
	end
end

#do_split(opts) ⇒ Object

Split str.split(pattern[, limit])



186
187
188
189
190
191
192
# File 'lib/ltdtemplate/proxy/string.rb', line 186

def do_split (opts)
	if opts[:parameters]
 params = opts[:parameters][0..1].values
	else params = []
	end
	@original.split(*params).tap { |ary| ary.each { |str| meter str } }
end

#evaluate(opts = {}) ⇒ Object

Evaluate supported methods for strings.



13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# File 'lib/ltdtemplate/proxy/string.rb', line 13

def evaluate (opts = {})
	case opts[:method]
	when nil, 'call', 'str', 'string' then @original
	when 'capcase' then meter @original.capitalize
	when 'class' then 'String'
	when 'downcase' then meter @original.downcase
	when 'flt', 'float' then @original.to_f
	when 'html'
 require 'htmlentities'
 meter(HTMLEntities.new(:html4).encode(@original, :basic,
   :named, :decimal))
	when 'idx', 'index', 'ridx', 'rindex' then do_index opts
	when 'int' then @original.to_i
	when 'join' then do_join opts
	when 'len', 'length' then @original.length
	when 'match' then do_match opts
	when 'pcte'
	  meter(@original.gsub(/[^a-z0-9]/i) { |c| sprintf "%%%2x", c.ord })
	when 'regexp'
 if @template.options[:regexp] then ::Regexp.new @original
 else nil
 end
	when 'rep', 'rep1', 'replace', 'replace1' then do_replace opts
	when 'rng', 'range', 'slc', 'slice' then do_range_slice opts
	when 'split' then do_split opts
	when 'type' then 'string'
	when 'upcase' then meter @original.upcase
	when '+' then do_add opts
	when '*' then do_multiply opts
	when '<', '<=', '==', '!=', '>=', '>' then do_compare opts
	else super opts
	end
end

#meter(str) ⇒ Object

Meter string resource usage



48
49
50
51
52
53
54
# File 'lib/ltdtemplate/proxy/string.rb', line 48

def meter (str)
	# RESOURCE string_total: Combined length of computed strings
	@template.use :string_total, str.size
	# RESOURCE string_length: Length of longest modified string
	@template.using :string_length, str.size
	str
end

#tpl_textObject



56
# File 'lib/ltdtemplate/proxy/string.rb', line 56

def tpl_text; @original; end