URI proxying support
This commit is contained in:
parent
4d0f9802fc
commit
a68a88bd1a
@ -67,6 +67,7 @@ GEM
|
|||||||
rubocop-performance (~> 1.18.0)
|
rubocop-performance (~> 1.18.0)
|
||||||
unicode-display_width (2.4.2)
|
unicode-display_width (2.4.2)
|
||||||
webrick (1.8.1)
|
webrick (1.8.1)
|
||||||
|
yaml (0.2.1)
|
||||||
|
|
||||||
PLATFORMS
|
PLATFORMS
|
||||||
arm64-darwin-22
|
arm64-darwin-22
|
||||||
@ -77,6 +78,7 @@ DEPENDENCIES
|
|||||||
rspec (~> 3.0)
|
rspec (~> 3.0)
|
||||||
skeksis!
|
skeksis!
|
||||||
standard (~> 1.3)
|
standard (~> 1.3)
|
||||||
|
yaml
|
||||||
|
|
||||||
BUNDLED WITH
|
BUNDLED WITH
|
||||||
2.4.15
|
2.4.15
|
||||||
|
18
config.ru
18
config.ru
@ -3,26 +3,18 @@ require 'skeksis'
|
|||||||
SERVE_DIR="/Users/madeline/Code/gemini-bridge-rack/gemini"
|
SERVE_DIR="/Users/madeline/Code/gemini-bridge-rack/gemini"
|
||||||
|
|
||||||
class SkeksisApp
|
class SkeksisApp
|
||||||
|
def initialize
|
||||||
|
@skeksis = Skeksis::GemBridge.new
|
||||||
|
end
|
||||||
|
|
||||||
def call(env)
|
def call(env)
|
||||||
status = 200
|
status = 200
|
||||||
headers = { "content-type" => "text/html" }
|
headers = { "content-type" => "text/html" }
|
||||||
#headers = {}
|
body = @skeksis.query(SERVE_DIR + env['PATH_INFO'], env)
|
||||||
body = resolve_path(SERVE_DIR + env['PATH_INFO'])
|
|
||||||
|
|
||||||
[status, headers, body]
|
[status, headers, body]
|
||||||
end
|
end
|
||||||
|
|
||||||
def resolve_path(path)
|
|
||||||
if Dir.exist?(path)
|
|
||||||
return Dir.each_child(path).map {|i| "#{i}\n"}
|
|
||||||
elsif File.exist?(path)
|
|
||||||
file = File.open(path, 'r')
|
|
||||||
data = file.readlines
|
|
||||||
[Skeksis.htmlize(data)]
|
|
||||||
else # path is invalid
|
|
||||||
return nil
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
run SkeksisApp.new
|
run SkeksisApp.new
|
||||||
|
2
config.yml
Normal file
2
config.yml
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
skeksis_config:
|
||||||
|
gemini_uri: "gemini://gemini.hackers.town/"
|
@ -1,16 +1,33 @@
|
|||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
require "yaml"
|
||||||
|
|
||||||
require_relative "skeksis/version"
|
require_relative "skeksis/version"
|
||||||
require_relative "skeksis/parser"
|
require_relative "skeksis/parser"
|
||||||
require_relative "skeksis/htmlize"
|
require_relative "skeksis/htmlize"
|
||||||
|
|
||||||
module Skeksis
|
module Skeksis
|
||||||
class Error < StandardError; end
|
#class Error < StandardError; end
|
||||||
# Your code goes here...
|
|
||||||
extend self
|
|
||||||
|
|
||||||
def htmlize(data)
|
class GemBridge
|
||||||
#puts Skeksis::Parser.parse(data).htmlize
|
def initialize
|
||||||
Skeksis::Parser.parse(data).htmlize
|
@gemini_uri = YAML.load(File.read("config.yml"))['skeksis_config']['gemini_uri']
|
||||||
|
end
|
||||||
|
|
||||||
|
def query(path, env)
|
||||||
|
if Dir.exist?(path)
|
||||||
|
return Dir.each_child(path).map {|i| "#{i}\n"}
|
||||||
|
elsif File.exist?(path)
|
||||||
|
file = File.open(path, 'r')
|
||||||
|
data = file.readlines
|
||||||
|
[htmlize(data, env)]
|
||||||
|
else # path is invalid
|
||||||
|
return nil
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def htmlize(data, env)
|
||||||
|
Skeksis::Parser.parse(data, strip_blanks=true).htmlize(env['REQUEST_URI'], @gemini_uri)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -13,16 +13,17 @@ module Skeksis
|
|||||||
</html>
|
</html>
|
||||||
HTML
|
HTML
|
||||||
|
|
||||||
def htmlize
|
def htmlize(request_uri, proxied_uri=nil, port=80)
|
||||||
build_html_doc
|
@http = URI.parse(request_uri)
|
||||||
end
|
unless proxied_uri.nil?
|
||||||
|
@proxied_uri = URI.parse(proxied_uri)
|
||||||
|
end
|
||||||
|
|
||||||
private
|
|
||||||
def build_html_doc
|
|
||||||
content = self.parse_ir.join("\n")
|
content = self.parse_ir.join("\n")
|
||||||
Header + "#{content}\n" + Footer
|
Header + "#{content}\n" + Footer
|
||||||
end
|
end
|
||||||
|
|
||||||
|
private
|
||||||
def parse_ir
|
def parse_ir
|
||||||
html = self.map do |entry|
|
html = self.map do |entry|
|
||||||
content = lambda { |entry|
|
content = lambda { |entry|
|
||||||
@ -38,15 +39,17 @@ module Skeksis
|
|||||||
level = entry[:level]
|
level = entry[:level]
|
||||||
"<h#{level}>#{text}</h#{level}>"
|
"<h#{level}>#{text}</h#{level}>"
|
||||||
when :list
|
when :list
|
||||||
# TODO: Does not handle lists properly, only one <ul> tag per group of lists needs to be
|
list = entry[:content].map do |textline|
|
||||||
# created instead
|
"<li>" + textline + "</li>"
|
||||||
"<ul><li>#{text}</li></ul>"
|
end.join("\n")
|
||||||
|
"<ul>" + list + "</ul>"
|
||||||
when :quote
|
when :quote
|
||||||
"<pre>#{text}</pre>"
|
"<pre>#{text}</pre>"
|
||||||
when :uri
|
when :uri
|
||||||
uri = entry[:uri]
|
uri = entry[:uri]
|
||||||
text = entry[:text]
|
text = entry[:text]
|
||||||
"<a href=\"#{uri}\">#{text}</a>"
|
http_link = build_uri(uri)
|
||||||
|
"<a href=\"#{http_link}\">#{text}</a>"
|
||||||
when :verbatim
|
when :verbatim
|
||||||
"<pre>" + entry[:content].join("\n") + "</pre>"
|
"<pre>" + entry[:content].join("\n") + "</pre>"
|
||||||
when :text
|
when :text
|
||||||
@ -56,5 +59,15 @@ module Skeksis
|
|||||||
|
|
||||||
html
|
html
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def build_uri(link)
|
||||||
|
uri = URI.parse(link)
|
||||||
|
|
||||||
|
if uri.host == @proxied_uri.host
|
||||||
|
URI::HTTP.build(host: @http.host, path: uri.path, port: @http.port)
|
||||||
|
else
|
||||||
|
link
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -36,7 +36,7 @@ module Skeksis
|
|||||||
a = text.sub(/^=>\s*/, "").split(" ", 2)
|
a = text.sub(/^=>\s*/, "").split(" ", 2)
|
||||||
link = a[0]
|
link = a[0]
|
||||||
text = a[1]
|
text = a[1]
|
||||||
{ type: type, link: link, text: text }
|
{ type: type, uri: link, text: text }
|
||||||
when :verbatim
|
when :verbatim
|
||||||
# TODO: Match with syntax highlighting, maybe
|
# TODO: Match with syntax highlighting, maybe
|
||||||
content.map! do |line|
|
content.map! do |line|
|
||||||
@ -52,15 +52,15 @@ module Skeksis
|
|||||||
{ type: type, content: content }
|
{ type: type, content: content }
|
||||||
end
|
end
|
||||||
end.compact!
|
end.compact!
|
||||||
|
|
||||||
|
self
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
module Parser
|
module Parser
|
||||||
extend self
|
extend self
|
||||||
|
|
||||||
def parse(input)
|
def parse(input, strip_blanks=false)
|
||||||
puts("##### PARSING STARTED #####")
|
|
||||||
|
|
||||||
list = IR.new
|
list = IR.new
|
||||||
|
|
||||||
data = input.map(&:chomp)
|
data = input.map(&:chomp)
|
||||||
@ -93,7 +93,6 @@ module Skeksis
|
|||||||
end
|
end
|
||||||
else
|
else
|
||||||
if in_multiline_block == true
|
if in_multiline_block == true
|
||||||
#puts("in multiline block")
|
|
||||||
list.push({ type: in_block, content: content })
|
list.push({ type: in_block, content: content })
|
||||||
in_multiline_block = false
|
in_multiline_block = false
|
||||||
content = []
|
content = []
|
||||||
@ -104,40 +103,18 @@ module Skeksis
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
if type == :blank and strip_blanks == true then next end
|
||||||
|
|
||||||
#if type == :verbatim and in_verbatim_block == false
|
|
||||||
# in_verbatim_block = true
|
|
||||||
# content.push(line)
|
|
||||||
#elsif type != :verbatim and in_verbatim_block == true
|
|
||||||
# content.push(line)
|
|
||||||
#elsif type == :verbatim and in_verbatim_block == true
|
|
||||||
# in_verbatim_block = false
|
|
||||||
# content.push(line)
|
|
||||||
# list.push({ type: :verbatim, content: content })
|
|
||||||
# content = []
|
|
||||||
# next
|
|
||||||
#end
|
|
||||||
|
|
||||||
if in_verbatim_block == false and in_multiline_block == false
|
if in_verbatim_block == false and in_multiline_block == false
|
||||||
#puts("catch-all push")
|
|
||||||
list.push({ type: type, content: [line] })
|
list.push({ type: type, content: [line] })
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
list.strip_markers!
|
list.strip_markers!
|
||||||
puts list
|
|
||||||
#puts strip_markers(list)
|
|
||||||
puts("##### PARSING FINISHED #####")
|
|
||||||
|
|
||||||
list
|
|
||||||
end
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
def collapse_verbatim_blocks(gemtext)
|
|
||||||
|
|
||||||
end
|
|
||||||
|
|
||||||
def get_type(l)
|
def get_type(l)
|
||||||
case l
|
case l
|
||||||
when ""
|
when ""
|
||||||
|
Loading…
Reference in New Issue
Block a user