def encode(src, *proc_re, &proc)
if proc_re.size>0 && proc_re[0].is_a?(MathData)
data = proc_re.shift
else
data = MathData.new
end
proc_re = proc_re.size==0 ? @encode_proc_re : collect_regexp(proc_re)
proc = @encode_proc unless proc
s = StringScanner.new(src)
encoded = ""
until s.eos?
if s.scan(/(.*?)(((((#{@params[:throughs]})|#{@params[:dmath_envs]})|#{@params[:math_envs]})|#{proc_re})|#{@params[:escapes]})/m)
encoded << s[1]
case
when s[6]
encoded << s[6]
when s[5], s[4]
env_src = s[5] || s[4]
if @params[:dmath_envs]=~env_src
encoded << "#{@params[:delimiter]}d#{data.dsrc_list.size}#{@params[:delimiter]}"
data.dsrc_list << env_src
else
encoded << "#{@params[:delimiter]}m#{data.msrc_list.size}#{@params[:delimiter]}"
data.msrc_list << env_src
end
when s[3]
size = s[3].size
s.pos = left = s.pos-size
if r=proc.call(s)
right = s.pos
encoded << "#{@params[:delimiter]}u#{data.user_list.size}#{@params[:delimiter]}"
data.user_list << r
data.usrc_list << s.string[left...right]
else
encoded << s.peek(size)
s.pos = s.pos+size
end
when s[2]
encoded << "#{@params[:delimiter]}e#{data.escape_list.size}#{@params[:delimiter]}"
@params[:escapes]=~s[2]
data.esrc_list << s[2]
data.escape_list << escapeXML($+, true)
end
else
encoded << s.rest
s.terminate
end
end
parse(data, @params[:parser]) unless @params[:without_parse]
return encoded, data
end