require 'fileutils' require 'liquid' require 'yaml' if File.exist?("config.yml") config = YAML.load_file("config.yml") else raise "Error: config.yml not found." end settings = YAML.load_file("config.yml") || {} # source_dir = "./themes/#{settings["theme"] || "default"}" destination_dir = "./_output/" # Clean _output folder if Dir.exist?(destination_dir) Dir.foreach(destination_dir) do |file| next if file == '.' || file == '..' || file == 'AUTO_GEN_FOLDER_DO_NOT_EDIT_FILE_HERE' file_path = File.join(destination_dir, file) if File.file?(file_path) FileUtils.rm(file_path) end end else FileUtils.mkdir_p(destination_dir) end # Copy all files and directories while preserving the structure Dir.glob("#{source_dir}/**/*").each do |entry| relative_path = entry.sub("#{source_dir}/", '') new_location = File.join(destination_dir, relative_path) if File.directory?(entry) FileUtils.mkdir_p(new_location) else FileUtils.cp(entry, new_location) end end template_file = "#{destination_dir}/index.html" if !File.exist?(template_file) raise "Error: #{template_file} file not found." end template_content = File.read(template_file) settings["vars"] = {} if !settings["plugins"].nil? settings["plugins"].each do |plugin| pluginFileName = plugin.keys[0] if File.exist?("./plugins/#{pluginFileName}.rb") require_relative "./plugins/#{pluginFileName}.rb" pluginObject = Object.const_get(pluginFileName).new(plugin.values) settings["vars"][pluginFileName] = pluginObject.execute() end end end if !settings["links"].nil? settings["links"].each_with_index do |link, index| settings["links"][index]["link"]["icon"] = Liquid::Template.parse(settings["links"][index]["link"]["icon"]).render(settings) settings["links"][index]["link"]["url"] = Liquid::Template.parse(settings["links"][index]["link"]["url"]).render(settings) settings["links"][index]["link"]["alt"] = Liquid::Template.parse(settings["links"][index]["link"]["alt"]).render(settings) settings["links"][index]["link"]["title"] = Liquid::Template.parse(settings["links"][index]["link"]["title"]).render(settings) settings["links"][index]["link"]["text"] = Liquid::Template.parse(settings["links"][index]["link"]["text"]).render(settings) end end if !settings["socials"].nil? settings["socials"].each_with_index do |link, index| settings["socials"][index]["social"]["icon"] = Liquid::Template.parse(settings["socials"][index]["social"]["icon"]).render(settings) settings["socials"][index]["social"]["url"] = Liquid::Template.parse(settings["socials"][index]["social"]["url"]).render(settings) settings["socials"][index]["social"]["alt"] = Liquid::Template.parse(settings["socials"][index]["social"]["alt"]).render(settings) settings["socials"][index]["social"]["title"] = Liquid::Template.parse(settings["socials"][index]["social"]["title"]).render(settings) end end settings["title"] = Liquid::Template.parse(settings["title"]).render(settings) settings["footer"] = Liquid::Template.parse(settings["footer"]).render(settings) settings["tagline"] = Liquid::Template.parse(settings["tagline"]).render(settings) settings["name"] = Liquid::Template.parse(settings["name"]).render(settings) settings["last_modified_at"] = Time.now.strftime("%Y-%m-%dT%H:%M:%S%z") # Parse the Liquid template liquid_template = Liquid::Template.parse(template_content) rendered_content = liquid_template.render(settings) File.open(template_file, 'w') do |file| file.write(rendered_content) end