# frozen_string_literal: true # = Public Suffix # # Domain name parser based on the Public Suffix List. # # Copyright (c) 2009-2024 Simone Carletti module PublicSuffix # Domain represents a domain name, composed by a TLD, SLD and TRD. class Domain # Splits a string into the labels, that is the dot-separated parts. # # The input is not validated, but it is assumed to be a valid domain name. # # @example # # name_to_labels('example.com') # # => ['example', 'com'] # # name_to_labels('example.co.uk') # # => ['example', 'co', 'uk'] # # @param name [String, #to_s] The domain name to split. # @return [Array] def self.name_to_labels(name) name.to_s.split(DOT) end attr_reader :tld, :sld, :trd # Creates and returns a new {PublicSuffix::Domain} instance. # # @overload initialize(tld) # Initializes with a +tld+. # @param [String] tld The TLD (extension) # @overload initialize(tld, sld) # Initializes with a +tld+ and +sld+. # @param [String] tld The TLD (extension) # @param [String] sld The TRD (domain) # @overload initialize(tld, sld, trd) # Initializes with a +tld+, +sld+ and +trd+. # @param [String] tld The TLD (extension) # @param [String] sld The SLD (domain) # @param [String] trd The TRD (subdomain) # # @yield [self] Yields on self. # @yieldparam [PublicSuffix::Domain] self The newly creates instance # # @example Initialize with a TLD # PublicSuffix::Domain.new("com") # # => # # # @example Initialize with a TLD and SLD # PublicSuffix::Domain.new("com", "example") # # => # # # @example Initialize with a TLD, SLD and TRD # PublicSuffix::Domain.new("com", "example", "wwww") # # => # # def initialize(*args) @tld, @sld, @trd = args yield(self) if block_given? end # Returns a string representation of this object. # # @return [String] def to_s name end # Returns an array containing the domain parts. # # @return [Array] # # @example # # PublicSuffix::Domain.new("google.com").to_a # # => [nil, "google", "com"] # # PublicSuffix::Domain.new("www.google.com").to_a # # => [nil, "google", "com"] # def to_a [@trd, @sld, @tld] end # Returns the full domain name. # # @return [String] # # @example Gets the domain name of a domain # PublicSuffix::Domain.new("com", "google").name # # => "google.com" # # @example Gets the domain name of a subdomain # PublicSuffix::Domain.new("com", "google", "www").name # # => "www.google.com" # def name [@trd, @sld, @tld].compact.join(DOT) end # Returns a domain-like representation of this object # if the object is a {#domain?}, nil otherwise. # # PublicSuffix::Domain.new("com").domain # # => nil # # PublicSuffix::Domain.new("com", "google").domain # # => "google.com" # # PublicSuffix::Domain.new("com", "google", "www").domain # # => "www.google.com" # # This method doesn't validate the input. It handles the domain # as a valid domain name and simply applies the necessary transformations. # # This method returns a FQD, not just the domain part. # To get the domain part, use #sld (aka second level domain). # # PublicSuffix::Domain.new("com", "google", "www").domain # # => "google.com" # # PublicSuffix::Domain.new("com", "google", "www").sld # # => "google" # # @see #domain? # @see #subdomain # # @return [String] def domain [@sld, @tld].join(DOT) if domain? end # Returns a subdomain-like representation of this object # if the object is a {#subdomain?}, nil otherwise. # # PublicSuffix::Domain.new("com").subdomain # # => nil # # PublicSuffix::Domain.new("com", "google").subdomain # # => nil # # PublicSuffix::Domain.new("com", "google", "www").subdomain # # => "www.google.com" # # This method doesn't validate the input. It handles the domain # as a valid domain name and simply applies the necessary transformations. # # This method returns a FQD, not just the subdomain part. # To get the subdomain part, use #trd (aka third level domain). # # PublicSuffix::Domain.new("com", "google", "www").subdomain # # => "www.google.com" # # PublicSuffix::Domain.new("com", "google", "www").trd # # => "www" # # @see #subdomain? # @see #domain # # @return [String] def subdomain [@trd, @sld, @tld].join(DOT) if subdomain? end # Checks whether self looks like a domain. # # This method doesn't actually validate the domain. # It only checks whether the instance contains # a value for the {#tld} and {#sld} attributes. # # @example # # PublicSuffix::Domain.new("com").domain? # # => false # # PublicSuffix::Domain.new("com", "google").domain? # # => true # # PublicSuffix::Domain.new("com", "google", "www").domain? # # => true # # # This is an invalid domain, but returns true # # because this method doesn't validate the content. # PublicSuffix::Domain.new("com", nil).domain? # # => true # # @see #subdomain? # # @return [Boolean] def domain? !(@tld.nil? || @sld.nil?) end # Checks whether self looks like a subdomain. # # This method doesn't actually validate the subdomain. # It only checks whether the instance contains # a value for the {#tld}, {#sld} and {#trd} attributes. # If you also want to validate the domain, # use {#valid_subdomain?} instead. # # @example # # PublicSuffix::Domain.new("com").subdomain? # # => false # # PublicSuffix::Domain.new("com", "google").subdomain? # # => false # # PublicSuffix::Domain.new("com", "google", "www").subdomain? # # => true # # # This is an invalid domain, but returns true # # because this method doesn't validate the content. # PublicSuffix::Domain.new("com", "example", nil).subdomain? # # => true # # @see #domain? # # @return [Boolean] def subdomain? !(@tld.nil? || @sld.nil? || @trd.nil?) end end end