#!/bin/env ruby #-*- coding: utf-8 -*- require("rexml/document"); def compare_entry_by_property_value(e1,e2,property) p1 = REXML::XPath.first(e1,"apps:property[@name='#{property}']"); p2 = REXML::XPath.first(e2,"apps:property[@name='#{property}']"); return p1.attribute("value").value <=> p2.attribute("value").value if (p1 && p2); return -1 if (p1); return +1 if (p2); return 0; end def compare_entry_by_property_exists(e1,e2,property) p1 = REXML::XPath.first(e1,"apps:property[@name='#{property}']"); p2 = REXML::XPath.first(e1,"apps:property[@name='#{property}']"); return -1 if (p1 && !p2); return +1 if (!p1 && p2); return 0; end def compare_entry(e1,e2) c = compare_entry_by_property_value(e1,e2,"label"); return c if (c!=0); c = compare_entry_by_property_exists(e1,e2,"shouldTrash"); return -c if (c!=0); c = compare_entry_by_property_exists(e1,e2,"shouldArchive"); return -c if (c!=0); c = compare_entry_by_property_exists(e1,e2,"shouldMarkAsRead"); return -c if (c!=0); c = compare_entry_by_property_exists(e1,e2,"shouldStar"); return c if (c!=0); c = compare_entry_by_property_value(e1,e2,"from"); return c if (c!=0); return 0; end doc = REXML::Document.new(File.open(ARGV[0])); entries = REXML::XPath.match(doc,"/feed/entry"); entries.sort! { |e1,e2| compare_entry(e1,e2); } puts(""); entries.each { |entry| puts(entry); } puts("");