URI proxying support
This commit is contained in:
		@@ -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 ""
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user