rscortool.rb / last modification: 2020-01-30 14:16
# program   : rscortool
# copyright : PRAGMA Publishing On Demand
# version   : 1.00 - 2002
# author    : Hans Hagen
#
# project   : eXaMpLe
# concept   : Hans Hagen
# info      : j.hagen@xs4all.nl
# www       : www.pragma-pod.com / www.pragma-ade.com

require 'rexml/document.rb'

class Array

    def downcase
        self.collect { |l| l.to_s.downcase }
    end

end

class SortedXML

    def initialize (filename)
        return nil if not filename or filename.empty? or not test(?e,filename)
        @data = REXML::Document.new(File.new(filename),
            {:ignore_whitespace_nodes => :all,
             :compress_whitespace     => :all})
    end

    def save (filename)
        # filename += '.xml' unless filename.match(/\..*?$/)
        filename += '.xml' unless filename =~ /\..*?$/
        if not filename.empty? and f = open(filename,'w')
            @data.write(f,0)
            f.close
        end
    end

    def sort
        keys = REXML::XPath.match(@data.root,"/contacts/contact/@label")
        return unless keys
        keys = keys.downcase
        records = @data.elements.to_a("/contacts/contact")
        @data.elements.delete_all("/contacts/contact")
        keys = keys.collect do |l| # prepare numbers
            l.gsub(/(\d+)/) do |d| sprintf('%05d', d) end
        end
        keys.sort.each do |s|
            @data.root.add_element(records[keys.index(s)])
        end
    end

end

def sortfile (filename)
    c = SortedXML.new(filename)
    c.sort
    c.save('test.xml')
end

exit if ARGV[0] == nil or ARGV[0].empty?

sortfile(ARGV[0])