require 'kramdown' require 'fileutils' require 'date' require 'rss' require 'find' require 'yaml' # Load configuration config = YAML.load_file('_config.yml') site_url = config['site_url'] site_name = config['site_name'] author_name = config['author_name'] posts_dir = config['directories']['posts'] pages_dir = config['directories']['pages'] public_dir = config['directories']['public'] output_dir = config['directories']['output'] posts_output_dir = config['directories']['posts_output'] pages_output_dir = config['directories']['pages_output'] header_file = config['files']['header'] footer_file = config['files']['footer'] root_index_file = config['files']['root_index'] posts_index_file = config['files']['posts_index'] rss_file = config['files']['rss'] post_count = config['misc']['post_count'] # Make sure output directories exist [posts_output_dir, pages_output_dir].each { |dir| FileUtils.mkdir_p(dir) } # Read the footer content footer_content = File.read(footer_file) # Replace the title meta tag in the header.html def replace_title_placeholder(header_content, title) header_content.gsub('{{TITLE}}', "#{title}") end # Grab the title from each markdown file def extract_title_from_md(lines) first_line = lines.first first_line&.start_with?('# ') ? first_line[2..-1].strip : 'Blog Index' end # Convert markdown files def process_markdown_files(input_directory, output_directory, header_content, footer_content) items = [] Find.find(input_directory) do |path| next unless path =~ /\.md\z/ md_content = File.read(path) lines = md_content.lines title = extract_title_from_md(lines) date = Date.parse(lines[2]&.strip || '') rescue Date.today html_content = Kramdown::Document.new(md_content).to_html relative_path = path.sub(input_directory + '/', '').sub('.md', '') item_dir = File.join(output_directory, relative_path) output_file = "#{item_dir}/index.html" FileUtils.mkdir_p(item_dir) header = replace_title_placeholder(header_content, title) File.write(output_file, header + html_content + footer_content) items << { title: title, date: date, link: relative_path + '/', content: html_content } end items end # Create the root index file def generate_index(posts, header_content, footer_content, root_index_file, post_count, output_dir, posts_dir) root_index_content = File.read(root_index_file) root_title = extract_title_from_md(root_index_content.lines) root_html = Kramdown::Document.new(root_index_content).to_html header = replace_title_placeholder(header_content, root_title) index_content = header + root_html + "