Report abuse

def parse_zsff(url)
  uri = URI.parse(url)
  errors = []
  warnings = []
  attrs = {}
  begin
    results = Net::HTTP.get(uri)
  rescue
    errors.push("Invalid URL")
  end

  begin
    raw = results.split(/\n\n/)
    errors.push("Must have two line breaks between Attributes section and Links section") if raw.size < 2
    raw_attrs = raw.first.split(/\n/)[1..-1]
    links = raw.last.split(/\n/)
    attrs[:version] = raw.first.split(/\n/).first
    raw_attrs.each do |att|
      parts = att.split(":")
      errors.push("Invalid attribute declaration: #{att}") and next unless parts.size > 0
      attrs[parts.first.downcase.to_sym] = parts[1..-1].join(":").strip
    end

    errors.push("Invalid ZSFF Version declaration") if attrs[:version].nil? || attrs[:version].match(/ZSFF 1\.[0-9]/).nil?
    errors.push("Invalid Author declaration") if attrs[:author].nil? || attrs[:author].blank?
    errors.push("Invalid Title declaration") if attrs[:title].nil? || attrs[:title].blank?
    errors.push("Invalid Site declaration") if attrs[:site].nil? || attrs[:site].blank?
    warnings.push("Site declaration does not appear to be a valid URL") if attrs[:site].nil? || !is_valid_url?(attrs[:site])
    errors.push("Invalid Subtitle declaration") if attrs[:subtitle].nil? || attrs[:subtitle].blank?
    errors.push("Invalid Copyright declaration") if attrs[:copyright].nil? || attrs[:copyright].blank?
    errors.push("Invalid Content-type declaration") if attrs[:"content-type"].nil? || attrs[:"content-type"].match(/.*\/.*/).nil?

    links.each do |link|
      warnings.push("Link '#{link}' does not appear to be a valid URL") unless is_valid_url?(link)
    end
  rescue Exception => e
    errors.push("Cannot parse ZSFF file")
  end
  {:success => errors.size == 0, :errors => errors, :warnings => warnings, :attrs => attrs}
end

def is_valid_url?(url)
  !url.match(/(^$)|(^(http|https):\/\/[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,5}(([0-9]{1,5})?\/.*)?$)/ix).nil?
end