Sha256: cc4861c38a94d1ac29b4add1e242d8aff2dd58ddd8436e4ec4a0a6a54b0207df

Contents?: true

Size: 1.93 KB

Versions: 1

Compression:

Stored size: 1.93 KB

Contents

class Servel::EntryFactory
  IMAGE_EXTS = %w(.jpg .jpeg .png .gif)
  VIDEO_EXTS = %w(.webm .mp4 .mkv)
  AUDIO_EXTS = %w(.mp3 .m4a .wav)
  TEXT_EXTS = %w(.txt)

  def self.home(href)
    Servel::Entry.new(
      type: "Dir",
      listing_classes: "home directory",
      icon: "🏠",
      href: href,
      name: "Listings Home"
    )
  end

  def self.top(href)
    Servel::Entry.new(
      type: "Dir",
      listing_classes: "top directory",
      icon: "🔝",
      href: href,
      name: "Top Directory"
    )
  end

  def self.parent(href)
    Servel::Entry.new(
      type: "Dir",
      listing_classes: "parent directory",
      icon: "⬆️",
      href: href,
      name: "Parent Directory"
    )
  end

  def self.for(path)
    new(path).entry
  end

  def initialize(path)
    @path = Pathname.new(path)
  end

  def entry
    Servel::Entry.new(
      type: type,
      media_type: media_type,
      listing_classes: listing_classes,
      icon: icon,
      href: @path.basename,
      name: @path.basename,
      size: size,
      mtime: @path.mtime
    )
  end

  def type
    if @path.directory?
      "Dir"
    elsif @path.file?
      @path.extname.sub(/^\./, "")
    else
      ""
    end
  end

  def media_type
    return nil unless @path.file? && @path.extname

    case @path.extname.downcase
    when *IMAGE_EXTS
      :image
    when *VIDEO_EXTS
      :video
    when *AUDIO_EXTS
      :audio
    when *TEXT_EXTS
      :text
    else
      nil
    end
  end

  def listing_classes
    klasses = []
    klasses << "file" if @path.file?
    klasses << "directory" if @path.directory?
    klasses << "media" if media_type
    klasses << media_type if media_type
    klasses.join(" ")
  end

  def icon
    return "📁" if @path.directory?
    case media_type
    when :video
      "🎞️"
    when :image
      "🖼️"
    when :audio
      "🔊"
    else
      "📝"
    end
  end

  def size
    @path.directory? ? nil : @path.size
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
servel-0.11.0 lib/servel/entry_factory.rb