Browse Source

Extract directory logic to a dedicated class to simplify rendering code

Lukasz Badura 5 months ago
parent
commit
a06ec572d7
3 changed files with 53 additions and 23 deletions
  1. 4 1
      lib/fotos.rb
  2. 7 22
      lib/fotos/html_generator.rb
  3. 42 0
      lib/fotos/source_directory.rb

+ 4 - 1
lib/fotos.rb

@@ -4,5 +4,8 @@ require_relative "fotos/version"
 require_relative "fotos/zip_extractor"
 require_relative "fotos/html_generator"
 require_relative "fotos/thumbnail"
+require_relative "fotos/source_directory"
 
-DATE_FORMAT = "%d-%m-%Y".freeze
+module Fotos
+  DATE_FORMAT = "%d-%m-%Y".freeze
+end

+ 7 - 22
lib/fotos/html_generator.rb

@@ -6,32 +6,17 @@ module Fotos
     MONTHS = %w(Styczeń Luty Marzec Kwiecień Maj Czerwiec Lipiec Sierpień Wrzesień Październik Listopad Grudzień)
 
     def initialize(options)
-      @src_path = options[:source]
+      @source_dir = Fotos::SourceDirectory.new(options[:source])
     end
 
     def call
-      dirs = Dir.glob("#{@src_path}/*")
-      dir_names = dirs.map {|d| d.split('/').last}
-      dates = dir_names.map do |d|
-        Date.strptime(d, DATE_FORMAT)
-      rescue Date::Error
-        next
-      end.compact!.sort.reverse
-      render_period(dates)
-
-      dates.each do |d|
-        dir_name = d.strftime(DATE_FORMAT)
-        puts "<h2 id=\"#{dir_name}\">#{dir_name} <small><a href=\"#toc\">top</a></small></h2>"
-        files = Dir.glob("#{@src_path}/#{dir_name}/*.JPEG")
-        files.each do |file|
-          basename = File.basename(file)
-          thumbnail_name = "TH_#{basename}"
-          thumbnail_path = File.join(dir_name, thumbnail_name)
-          file_path = File.join(dir_name, basename)
-          if File.exist?(thumbnail_path)
-            puts "<a href=\"#{dir_name}/#{basename}\"><img src=\"#{thumbnail_path}\" /></a>"
+      @source_dir.files_by_date.each do |date, images|
+        puts "<h2 id=\"#{date}\">#{date} <small><a href=\"#toc\">top</a></small></h2>"
+        images.each do |file|
+          if File.exist?(file.thumbnail_path)
+            puts "<a href=\"#{file.dir_name}/#{file.file_name}\"><img src=\"#{file.thumbnail_path}\" /></a>"
           else
-            puts "<a href=\"#{dir_name}/#{basename}\"><img src=\"#{file_path}\" /></a>"
+            puts "<a href=\"#{file.dir_name}/#{file.file_name}\"><img src=\"#{file.file_path}\" /></a>"
           end
         end
       end

+ 42 - 0
lib/fotos/source_directory.rb

@@ -0,0 +1,42 @@
+module Fotos
+  class SourceDirectory
+    Image = Data.define(:dir_name, :file_name, :file_path, :thumbnail_name, :thumbnail_path)
+
+    def initialize(path)
+      @path = path
+    end
+
+    #TODO: Filter out non image subdirecories
+    def subdirectories
+      Dir.glob("#{@path}/*").map {|d| d.split('/').last}
+    end
+
+    def dates
+      subdirectories.map do |d|
+        Date.strptime(d, DATE_FORMAT)
+      rescue Date::Error
+        next
+      end.compact!
+    end
+
+    def files_by_date
+      result = {}
+      dates.each do |date|
+        dir_name = date.strftime(DATE_FORMAT)
+        files = Dir.glob(File.join(@path, dir_name, "*.JPEG"))
+        result[date] = files.map do |file|
+          file_basename = File.basename(file)
+          thumbnail_name = "TH_#{file_basename}"
+          Image.new(
+            dir_name: dir_name,
+            file_name: file_basename,
+            file_path: File.join(dir_name, file_basename),
+            thumbnail_name: thumbnail_name,
+            thumbnail_path: File.join(dir_name, thumbnail_name)
+          )
+        end
+      end
+      return result
+    end
+  end
+end