#!/usr/bin/env ruby require "stringio" def usage puts "Usage: #{$0} " exit 1 end usage if ARGV.size != 1 kamal_site_repo = ARGV[0] if !File.directory?(kamal_site_repo) puts "Error: #{kamal_site_repo} is not a directory" exit 1 end DOCS = { "accessory" => "Accessories", "alias" => "Aliases", "boot" => "Booting", "builder" => "Builders", "configuration" => "Configuration overview", "env" => "Environment variables", "logging" => "Logging", "proxy" => "Proxy", "registry" => "Docker Registry", "role" => "Roles", "servers" => "Servers", "ssh" => "SSH", "sshkit" => "SSHKit" } DOCS_PATH = "lib/kamal/configuration/docs" class DocWriter attr_reader :from_file, :to_file, :key, :heading, :body, :output, :in_yaml def initialize(from_file, to_dir) @from_file = from_file @key = File.basename(from_file, ".yml") @to_file = File.join(to_dir, "#{linkify(DOCS[key])}.md") @body = File.readlines(from_file) @heading = body.shift.chomp("\n") @output = nil end def write puts "Writing #{to_file}" generate_markdown File.write(to_file, output.string) end private def generate_markdown @output = StringIO.new generate_header place = :in_section loop do line = body.shift&.chomp("\n") break if line.nil? case place when :new_section, :in_section if line.empty? output.puts place = :new_section elsif line =~ /^ *#/ generate_line(line, heading: place == :new_section) place = :in_section else output.puts output.puts "```yaml" output.puts line place = :in_yaml end when :in_yaml, :in_empty_line_yaml if line =~ /^ *#/ output.puts "```" output.puts generate_line(line, heading: place == :in_empty_line_yaml) place = :in_section elsif line.empty? place = :in_empty_line_yaml else output.puts line end end end output.puts "```" if place == :in_yaml end def generate_header output.puts "---" output.puts "# This file has been generated from the Kamal source, do not edit directly." output.puts "# Find the source of this file at #{DOCS_PATH}/#{key}.yml in the Kamal repository." output.puts "title: #{heading[2..-1]}" output.puts "---" output.puts output.puts heading end def generate_line(line, heading: false) line = line.gsub(/^ *#\s?/, "") if line =~ /(.*)kamal docs ([a-z]*)(.*)/ line = "#{$1}[#{DOCS[$2]}](../#{linkify(DOCS[$2])})#{$3}" end if line =~ /(.*)https:\/\/kamal-deploy.org([a-z\/-]*)(.*)/ line = "#{$1}[#{titlify($2.split("/").last)}](#{$2})#{$3}" end if heading output.puts "## [#{line}](##{linkify(line)})" else output.puts line end end def linkify(text) if text == "Configuration overview" "overview" else text.downcase.gsub(" ", "-") end end def titlify(text) text.capitalize.gsub("-", " ") end end from_dir = File.join(File.dirname(__FILE__), "../#{DOCS_PATH}") to_dir = File.join(kamal_site_repo, "docs/configuration") Dir.glob("#{from_dir}/*") do |from_file| DocWriter.new(from_file, to_dir).write end