# File lib/math_ml/util.rb, line 139
                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