142 lines
3.4 KiB
Ruby
Executable File
142 lines
3.4 KiB
Ruby
Executable File
#!/usr/bin/env ruby
|
|
require "stringio"
|
|
|
|
def usage
|
|
puts "Usage: #{$0} <kamal_site_repo>"
|
|
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
|