skeksis/lib/skeksis.rb

71 lines
1.7 KiB
Ruby
Raw Normal View History

# frozen_string_literal: true
2023-08-05 01:49:40 +00:00
require "yaml"
require_relative "skeksis/version"
2023-08-02 02:53:54 +00:00
require_relative "skeksis/parser"
2023-08-03 17:42:28 +00:00
require_relative "skeksis/htmlize"
module Skeksis
2023-08-05 01:49:40 +00:00
#class Error < StandardError; end
2023-08-07 18:04:55 +00:00
Header = <<~HTML
<html>
<head>
<title>Gembridge</title>
</head>
<body>
<h1>Directory Listing</h1>
HTML
Footer = <<~HTML
</body>
</html>
HTML
2023-08-05 01:49:40 +00:00
class GemBridge
def initialize
2023-08-08 01:02:09 +00:00
config = YAML.load(File.read("config.yml"))
@gemini_uri = config['skeksis_config']['gemini_uri']
@serve_dir = config['skeksis_config']['serve_dir']
2023-08-05 01:49:40 +00:00
end
def query(path, env)
2023-08-08 01:02:09 +00:00
# Chomps the first / and builds path
full_path = Pathname.new(@serve_dir) + path[1..-1]
puts full_path.to_s
if Dir.exist?(full_path)
index_file = full_path + "index.gmi"
if File.exist?(index_file)
data = File.open(index_file, 'r').readlines
[htmlize(data, env)]
else
create_dir_listing(full_path, env)
end
elsif File.exist?(full_path)
file = File.open(full_path, 'r')
2023-08-05 01:49:40 +00:00
data = file.readlines
[htmlize(data, env)]
else # path is invalid
return nil
end
end
2023-08-03 17:42:28 +00:00
2023-08-05 01:49:40 +00:00
def htmlize(data, env)
Skeksis::Parser.parse(data, strip_blanks=true).htmlize(env['REQUEST_URI'], @gemini_uri)
end
2023-08-07 18:04:55 +00:00
private
def create_dir_listing(path, env)
http = URI.parse(env['REQUEST_URI'])
listing = Dir.each_child(path).map do |i|
path = Pathname.new(env['PATH_INFO']).join(i)
uri = URI::HTTP.build(host: http.host, port: http.port, path: path.to_s)
"<a href=\"#{uri.to_s}\">#{i}</a><br/>"
end.join("\n")
[Header + listing + Footer]
end
2023-08-03 17:42:28 +00:00
end
end