24 lines
848 B
Ruby
24 lines
848 B
Ruby
# frozen_string_literal: true
|
|
|
|
module Gitlab
|
|
module Utils
|
|
class Nokogiri
|
|
class << self
|
|
# Use Nokogiri to convert a css selector into an xpath selector.
|
|
# Nokogiri can use css selectors with `doc.search()`. However
|
|
# for large node trees, it is _much_ slower than using xpath,
|
|
# by several orders of magnitude.
|
|
# https://gitlab.com/gitlab-org/gitlab/-/issues/329186
|
|
def css_to_xpath(css)
|
|
xpath = ::Nokogiri::CSS.xpath_for(css)
|
|
|
|
# Due to https://github.com/sparklemotion/nokogiri/issues/572,
|
|
# we remove the leading `//` and add `descendant-or-self::`
|
|
# in order to ensure we're searching from this node and all
|
|
# descendants.
|
|
xpath.map { |t| "descendant-or-self::#{t[2..-1]}" }.join('|')
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|