Class: Bridgetown::StaticFile

Inherits:
Object
  • Object
show all
Extended by:
Forwardable
Defined in:
bridgetown-core/lib/bridgetown-core/static_file.rb

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(site, base, dir, name, collection = nil) ⇒ StaticFile

Initialize a new StaticFile.

Parameters:

  • site (Bridgetown::Site)
  • base (String)

    path to the .

  • dir (String)

    path between and the file.

  • name (String)

    filename of the file.

  • collection (Bridgetown::Collection) (defaults to: nil)

    optional collection the file is attached to



30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
# File 'bridgetown-core/lib/bridgetown-core/static_file.rb', line 30

def initialize(site, base, dir, name, collection = nil) # rubocop:disable Metrics/ParameterLists
  @site = site
  @base = base
  @dir  = dir
  @name = name
  @collection = collection
  @relative_path = File.join(*[@dir, @name].compact)
  @extname = File.extname(@name)
  @data = @site.frontmatter_defaults.all(relative_path, type).as_dots
  data.permalink ||= if collection && !collection.builtin?
                       "#{collection.default_permalink.chomp("/").chomp(".*")}.*"
                     else
                       "/:path.*"
                     end
end

Instance Attribute Details

#collectionObject (readonly)

Returns the value of attribute collection.



8
9
10
# File 'bridgetown-core/lib/bridgetown-core/static_file.rb', line 8

def collection
  @collection
end

#dataObject (readonly)

Returns the value of attribute data.



8
9
10
# File 'bridgetown-core/lib/bridgetown-core/static_file.rb', line 8

def data
  @data
end

#extnameObject (readonly)

Returns the value of attribute extname.



8
9
10
# File 'bridgetown-core/lib/bridgetown-core/static_file.rb', line 8

def extname
  @extname
end

#nameObject (readonly)

Returns the value of attribute name.



8
9
10
# File 'bridgetown-core/lib/bridgetown-core/static_file.rb', line 8

def name
  @name
end

#relative_pathObject (readonly)

Returns the value of attribute relative_path.



8
9
10
# File 'bridgetown-core/lib/bridgetown-core/static_file.rb', line 8

def relative_path
  @relative_path
end

#siteObject (readonly)

Returns the value of attribute site.



8
9
10
# File 'bridgetown-core/lib/bridgetown-core/static_file.rb', line 8

def site
  @site
end

Class Method Details

.mtimesObject

The cache of last modification times [path] -> mtime.



14
15
16
# File 'bridgetown-core/lib/bridgetown-core/static_file.rb', line 14

def mtimes
  @mtimes ||= {}
end

.reset_cacheObject



18
19
20
# File 'bridgetown-core/lib/bridgetown-core/static_file.rb', line 18

def reset_cache
  @mtimes = nil
end

Instance Method Details

#basenameObject Also known as: basename_without_ext



122
123
124
# File 'bridgetown-core/lib/bridgetown-core/static_file.rb', line 122

def basename
  @basename ||= File.basename(name, ".*")
end

#cleaned_relative_pathString

Generates a relative path with the collection’s directory removed when applicable and additionally removes any multiple periods in the string.

NOTE: String#gsub! removes all trailing periods (in comparison to String#chomp!)

Examples:

When `relative_path` is "_methods/site/my-cool-avatar...png":
  cleaned_relative_path
  # => "/site/my-cool-avatar"

Returns:

  • (String)

    cleaned relative path of the static file



158
159
160
161
162
163
164
165
# File 'bridgetown-core/lib/bridgetown-core/static_file.rb', line 158

def cleaned_relative_path
  @cleaned_relative_path ||= begin
    cleaned = relative_path[0..-extname.length - 1]
    cleaned.gsub!(%r!\.*\z!, "")
    cleaned.sub!(@collection.relative_path, "") if @collection
    cleaned
  end
end

#defaultsHash

Returns front matter defaults defined for the file’s URL and/or type.

Returns:

  • (Hash)

    front matter defaults defined for the file’s URL and/or type



189
190
191
# File 'bridgetown-core/lib/bridgetown-core/static_file.rb', line 189

def defaults
  @defaults ||= site.frontmatter_defaults.all url, type
end

#destination(dest) ⇒ String

Obtain destination path

Parameters:

  • dest (String)

    path to the destination dir

Returns:

  • (String)


55
56
57
58
59
60
61
62
# File 'bridgetown-core/lib/bridgetown-core/static_file.rb', line 55

def destination(dest)
  dest = site.in_dest_dir(dest)
  dest_url = url
  if site.base_path.present? && collection
    dest_url = dest_url.delete_prefix site.base_path(strip_slash_only: true)
  end
  site.in_dest_dir(dest, Bridgetown::Utils.unencode_uri(dest_url))
end

#destination_rel_dirObject



64
65
66
67
68
69
70
# File 'bridgetown-core/lib/bridgetown-core/static_file.rb', line 64

def destination_rel_dir
  if @collection
    File.dirname(url)
  else
    @dir
  end
end

#inspectString

Returns includes only the relative path of the object.

Returns:

  • (String)

    includes only the relative path of the object



194
195
196
# File 'bridgetown-core/lib/bridgetown-core/static_file.rb', line 194

def inspect
  "#<#{self.class} @relative_path=#{relative_path.inspect}>"
end

#modified?Boolean

Is source path modified?

Returns:

  • (Boolean)

    true if modified since last write



86
87
88
# File 'bridgetown-core/lib/bridgetown-core/static_file.rb', line 86

def modified?
  self.class.mtimes[path] != mtime
end

#modified_timeObject Also known as: date



72
73
74
# File 'bridgetown-core/lib/bridgetown-core/static_file.rb', line 72

def modified_time
  @modified_time ||= File.stat(path).mtime
end

#mtimeInteger

Returns last modification time for this file.

Returns:

  • (Integer)

    last modification time for this file



79
80
81
# File 'bridgetown-core/lib/bridgetown-core/static_file.rb', line 79

def mtime
  modified_time.to_i
end

#pathObject

Returns source file path.



47
48
49
# File 'bridgetown-core/lib/bridgetown-core/static_file.rb', line 47

def path
  @path ||= File.join(*[@base, @dir, @name].compact)
end

#placeholdersObject



137
138
139
140
141
142
143
144
145
# File 'bridgetown-core/lib/bridgetown-core/static_file.rb', line 137

def placeholders
  {
    collection: @collection.label,
    path: cleaned_relative_path,
    output_ext: "",
    name: "",
    title: "",
  }
end

#relative_path_basename_without_prefixObject



128
129
130
131
132
133
134
135
# File 'bridgetown-core/lib/bridgetown-core/static_file.rb', line 128

def relative_path_basename_without_prefix
  return_path = Pathname.new("")
  Pathname.new(cleaned_relative_path).each_filename do |filename|
    return_path += filename unless filename.starts_with?("_")
  end

  (return_path.dirname + return_path.basename(".*")).to_s
end

#to_liquidObject



118
119
120
# File 'bridgetown-core/lib/bridgetown-core/static_file.rb', line 118

def to_liquid
  @to_liquid ||= Drops::StaticFileDrop.new(self)
end

#typeSymbol?

Returns type of the collection if present.

Returns:

  • (Symbol, nil)

    type of the collection if present



184
185
186
# File 'bridgetown-core/lib/bridgetown-core/static_file.rb', line 184

def type
  @type ||= @collection&.label&.to_sym
end

#urlObject

Applies a similar URL-building technique as resources that takes the collection’s URL template into account. The default URL template can be overriden in the collection’s configuration



170
171
172
173
174
175
176
177
178
179
180
181
# File 'bridgetown-core/lib/bridgetown-core/static_file.rb', line 170

def url
  @url ||= begin
    newly_processed = false
    base = if @collection.nil?
             cleaned_relative_path
           else
             newly_processed = true
             Bridgetown::Resource::PermalinkProcessor.new(self).transform
           end.to_s.chomp("/")
    newly_processed ? base : "#{base}#{extname}"
  end
end

#write(dest) ⇒ Boolean

Write the static file to the destination directory (if modified)

Parameters:

  • dest (String)

    path to the destination dir

Returns:

  • (Boolean)

    false if the file was not modified since last time (no-op)



104
105
106
107
108
109
110
111
112
113
114
115
116
# File 'bridgetown-core/lib/bridgetown-core/static_file.rb', line 104

def write(dest)
  dest_path = destination(dest)
  return false if File.exist?(dest_path) && !modified?

  self.class.mtimes[path] = mtime

  FileUtils.mkdir_p(File.dirname(dest_path))
  FileUtils.rm_rf(dest_path)
  Bridgetown.logger.debug "Saving file:", dest_path
  copy_file(dest_path)

  true
end

#write?Boolean

Whether to write the file to the filesystem

Returns:

  • (Boolean)

    true unless the defaults for the destination path contain published: false



93
94
95
96
97
98
# File 'bridgetown-core/lib/bridgetown-core/static_file.rb', line 93

def write?
  publishable = defaults.fetch("published", true)
  return publishable unless @collection

  publishable && @collection.write?
end