Sparkle: Replace Nokogiri with REXML
This commit is contained in:
parent
196ec61a3a
commit
2c4a7ae2cb
@ -2,7 +2,6 @@
|
|||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
|
|
||||||
require "bundle_version"
|
require "bundle_version"
|
||||||
require_relative "page_match"
|
|
||||||
|
|
||||||
module Homebrew
|
module Homebrew
|
||||||
module Livecheck
|
module Livecheck
|
||||||
@ -57,25 +56,50 @@ module Homebrew
|
|||||||
|
|
||||||
sig { params(content: String).returns(T.nilable(Item)) }
|
sig { params(content: String).returns(T.nilable(Item)) }
|
||||||
def self.item_from_content(content)
|
def self.item_from_content(content)
|
||||||
Homebrew.install_bundler_gems!
|
require "rexml/document"
|
||||||
require "nokogiri"
|
|
||||||
|
|
||||||
xml = Nokogiri::XML(content)
|
parsing_tries = 0
|
||||||
xml.remove_namespaces!
|
xml = begin
|
||||||
|
REXML::Document.new(content)
|
||||||
|
rescue REXML::UndefinedNamespaceException => e
|
||||||
|
undefined_prefix = e.to_s[/Undefined prefix ([^ ]+) found/i, 1]
|
||||||
|
raise if undefined_prefix.blank?
|
||||||
|
|
||||||
items = xml.xpath("//rss//channel//item").map do |item|
|
# Only retry parsing once after removing prefix from content
|
||||||
enclosure = (item > "enclosure").first
|
parsing_tries += 1
|
||||||
|
raise if parsing_tries > 1
|
||||||
|
|
||||||
url = enclosure&.attr("url")
|
# When an XML document contains a prefix without a corresponding
|
||||||
short_version = enclosure&.attr("shortVersionString")
|
# namespace, it's necessary to remove the the prefix from the
|
||||||
version = enclosure&.attr("version")
|
# content to be able to successfully parse it using REXML
|
||||||
|
content = content.gsub(%r{(</?| )#{Regexp.escape(undefined_prefix)}:}, '\1')
|
||||||
|
retry
|
||||||
|
end
|
||||||
|
|
||||||
url ||= (item > "link").first&.text
|
# Remove prefixes, so we can reliably identify elements and attributes
|
||||||
short_version ||= (item > "shortVersionString").first&.text&.strip
|
xml.root&.each_recursive do |node|
|
||||||
version ||= (item > "version").first&.text&.strip
|
node.prefix = ""
|
||||||
|
node.attributes.each_attribute do |attribute|
|
||||||
|
attribute.prefix = ""
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
title = (item > "title").first&.text&.strip
|
items = xml.get_elements("//rss//channel//item").map do |item|
|
||||||
pub_date = (item > "pubDate").first&.text&.strip&.presence&.yield_self do |date_string|
|
enclosure = item.elements["enclosure"]
|
||||||
|
|
||||||
|
if enclosure
|
||||||
|
url = enclosure["url"]
|
||||||
|
short_version = enclosure["shortVersionString"]
|
||||||
|
version = enclosure["version"]
|
||||||
|
os = enclosure["os"]
|
||||||
|
end
|
||||||
|
|
||||||
|
url ||= item.elements["link"]&.text
|
||||||
|
short_version ||= item.elements["shortVersionString"]&.text&.strip
|
||||||
|
version ||= item.elements["version"]&.text&.strip
|
||||||
|
|
||||||
|
title = item.elements["title"]&.text&.strip
|
||||||
|
pub_date = item.elements["pubDate"]&.text&.strip&.presence&.yield_self do |date_string|
|
||||||
Time.parse(date_string)
|
Time.parse(date_string)
|
||||||
rescue ArgumentError
|
rescue ArgumentError
|
||||||
# Omit unparseable strings (e.g. non-English dates)
|
# Omit unparseable strings (e.g. non-English dates)
|
||||||
@ -89,7 +113,7 @@ module Homebrew
|
|||||||
|
|
||||||
bundle_version = BundleVersion.new(short_version, version) if short_version || version
|
bundle_version = BundleVersion.new(short_version, version) if short_version || version
|
||||||
|
|
||||||
next if (os = enclosure&.attr("os")) && os != "osx"
|
next if os && os != "osx"
|
||||||
|
|
||||||
data = {
|
data = {
|
||||||
title: title,
|
title: title,
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user