# Copyright (C) 2005 Laurent Sansonetti <lrz@gnome.org>
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.
#
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA

module MARC
    class Record
        attr_reader :values

        def initialize(string)
            @values = {}
            parse(string) 
        end

        def title
            if value = @values[200]
                value['a']
            elsif value = @values[245]
                if title = value['a']
                    full_title = if remainder = value['b']
                        title + ' ' + remainder
                    else
                        title
                    end
                    full_title.sub(/\s+\/$/, '')
                end
            end
        end

        def isbn
            if value = @values[20]
                value = value.first if value.kind_of?(Array)
                if isbn = value['a'] 
                    isbn[0..9]
                end
            end
        end

        def authors
            authors = []
            if value = @values[700]
                if value.kind_of?(Array)
                    value.each do |value|
                        if name = value['a']
                            authors << name
                        end
                    end
                else
                    if name = value['a']
                        authors << name
                    end
                end
            end
            authors.map { |x| x.sub(/\s*,$/, '') }
        end

        def edition 
            if value = @values[200]
                value['b']
            end
        end

        def publisher
            if value = @values[260]
                if publisher = value['b']
                    publisher.sub(/\s*,$/, '')
                end
            end
        end

        #######
        private
        #######

        def parse(string)
            regex = /^(\d\d\d)[\s\d\|]+(\$.+$)$/
            @values.clear
            string.split(/\n/).each do |line|
                next unless md = regex.match(line)
                tag, value = md[1].to_i, md[2]
                next if tag == 0
                value = hash_for_value(value)
                if @values.has_key?(tag)
                    existing_value = @values[tag]
                    if existing_value.kind_of?(Array)
                        existing_value << value
                    else
                        ary = []
                        ary << existing_value
                        ary << value
                        @values[tag] = ary
                    end
                else
                    @values[tag] = value
                end
            end
        end

        def hash_for_value(string)
            hash = {}
            string.split('$').each do |token|
                token.strip!
                next if token.length < 3
                code = token[0..0]
                value = token[2..-1]
                hash[code] = value 
            end
            return hash
        end
    end
end


syntax highlighted by Code2HTML, v. 0.9.1