Module: Fontist::Utils

Defined in:
lib/fontist/utils.rb,
lib/fontist/utils/ui.rb,
lib/fontist/utils/cache.rb,
lib/fontist/utils/system.rb,
lib/fontist/utils/locking.rb,
lib/fontist/utils/file_ops.rb,
lib/fontist/utils/downloader.rb,
lib/fontist/utils/file_magic.rb,
lib/fontist/utils/github_url.rb,
lib/fontist/utils/github_client.rb

Defined Under Namespace

Modules: FileOps, Locking, System Classes: Cache, CacheIndex, CacheIndexItem, Downloader, FileMagic, GitHubClient, GitHubUrl, NullProgressBar, ProgressBar, UI

Class Method Summary collapse

Class Method Details

.case_insensitive_glob(pattern) ⇒ String

Converts a glob pattern to case-insensitive by replacing each alphabetic character with a character class [aA]

This is needed because File::FNM_CASEFOLD is ignored on case-sensitive filesystems (Linux) as of Ruby 3.1+

Examples:

case_insensitive_glob("*.ttf")
# => "*.[tT][tT][fF]"

case_insensitive_glob("*.{ttf,otf}")
# => "*.[tT][tT][fF]" (note: doesn't handle braces, use multiple calls)

Parameters:

  • pattern (String)

    Original glob pattern (e.g., “*.ttf”)

Returns:

  • (String)

    Case-insensitive pattern (e.g., “*.[tT][fF]”)



28
29
30
31
32
33
34
35
36
37
38
39
40
# File 'lib/fontist/utils.rb', line 28

def self.case_insensitive_glob(pattern)
  result = +""
  pattern.each_char do |char|
    result << if char.downcase == char.upcase
                # Non-alphabetic (numbers, punctuation) - keep as-is
                char
              else
                # Alphabetic character - create character class
                "[#{char.downcase}#{char.upcase}]"
              end
  end
  result
end

.font_file_patterns(prefix) ⇒ Array<String>

Returns array of case-insensitive glob patterns for font file extensions

Generates patterns that match font files regardless of extension case. On case-insensitive filesystems (Windows, macOS), uses simple lowercase patterns. On case-sensitive filesystems (Linux), uses character class patterns like [tT][fF].

Examples:

Linux (case-sensitive)

font_file_patterns("/fonts/**")
# => [
#   "/fonts/**/*.[tT][tT][fF]",
#   "/fonts/**/*.[oO][tT][fF]",
#   "/fonts/**/*.[tT][tT][cC]",
#   "/fonts/**/*.[o O][tT][cC]"
# ]

Windows/macOS (case-insensitive)

font_file_patterns("/fonts/**")
# => [
#   "/fonts/**/*.ttf",
#   "/fonts/**/*.otf",
#   "/fonts/**/*.ttc",
#   "/fonts/**/*.otc"
# ]

Parameters:

  • prefix (String)

    Path prefix (e.g., “/fonts/**”)

Returns:

  • (Array<String>)

    Array of patterns for each font extension



68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
# File 'lib/fontist/utils.rb', line 68

def self.font_file_patterns(prefix)
  extensions = %w[ttf otf ttc otc woff woff2]

  # On case-insensitive filesystems (Windows, macOS), use simple patterns
  # On case-sensitive filesystems (Linux), use character class patterns
  if %i[windows macosx].include?(Fontist::Utils::System.user_os)
    # Case-insensitive filesystem - simple patterns work fine
    extensions.map { |ext| File.join(prefix, "*.#{ext}") }
  else
    # Case-sensitive filesystem (Linux) - use character classes
    extensions.map do |ext|
      File.join(prefix, "*#{case_insensitive_glob(".#{ext}")}")
    end
  end
end