Basic parser implementation
This commit is contained in:
parent
7e0640dc1c
commit
b150a808ab
1
Gemfile
1
Gemfile
@ -6,6 +6,7 @@ source "https://rubygems.org"
|
|||||||
gemspec
|
gemspec
|
||||||
|
|
||||||
gem "rake", "~> 13.0"
|
gem "rake", "~> 13.0"
|
||||||
|
gem "rackup"
|
||||||
|
|
||||||
gem "rspec", "~> 3.0"
|
gem "rspec", "~> 3.0"
|
||||||
|
|
||||||
|
89
Gemfile.lock
89
Gemfile.lock
@ -1,41 +1,82 @@
|
|||||||
|
PATH
|
||||||
|
remote: .
|
||||||
|
specs:
|
||||||
|
skeksis (0.1.0)
|
||||||
|
|
||||||
GEM
|
GEM
|
||||||
remote: https://rubygems.org/
|
remote: https://rubygems.org/
|
||||||
specs:
|
specs:
|
||||||
eventmachine (1.2.7)
|
ast (2.4.2)
|
||||||
faraday (0.9.2)
|
diff-lcs (1.5.0)
|
||||||
multipart-post (>= 1.2, < 3)
|
json (2.6.3)
|
||||||
faraday-detailed_logger (1.0.0)
|
language_server-protocol (3.17.0.3)
|
||||||
faraday
|
lint_roller (1.1.0)
|
||||||
faraday_middleware (0.14.0)
|
parallel (1.23.0)
|
||||||
faraday (>= 0.7.4, < 1.0)
|
parser (3.2.2.3)
|
||||||
faye-websocket (0.10.9)
|
ast (~> 2.4.1)
|
||||||
eventmachine (>= 0.12.0)
|
racc
|
||||||
websocket-driver (>= 0.5.1)
|
racc (1.7.1)
|
||||||
gemini-rb (0.0.2)
|
|
||||||
eventmachine (~> 1.0, >= 1.0.9.1)
|
|
||||||
faraday (~> 0.9.2, >= 0.9.2)
|
|
||||||
faraday-detailed_logger (~> 1.0.0, >= 1.0.0)
|
|
||||||
faraday_middleware (~> 0.10, >= 0.10.0)
|
|
||||||
faye-websocket (~> 0.10.3)
|
|
||||||
json (~> 1.8.3, >= 1.8.3)
|
|
||||||
json (1.8.6)
|
|
||||||
multipart-post (2.3.0)
|
|
||||||
rack (3.0.8)
|
rack (3.0.8)
|
||||||
rackup (2.1.0)
|
rackup (2.1.0)
|
||||||
rack (>= 3)
|
rack (>= 3)
|
||||||
webrick (~> 1.8)
|
webrick (~> 1.8)
|
||||||
|
rainbow (3.1.1)
|
||||||
|
rake (13.0.6)
|
||||||
|
regexp_parser (2.8.1)
|
||||||
|
rexml (3.2.6)
|
||||||
|
rspec (3.12.0)
|
||||||
|
rspec-core (~> 3.12.0)
|
||||||
|
rspec-expectations (~> 3.12.0)
|
||||||
|
rspec-mocks (~> 3.12.0)
|
||||||
|
rspec-core (3.12.2)
|
||||||
|
rspec-support (~> 3.12.0)
|
||||||
|
rspec-expectations (3.12.3)
|
||||||
|
diff-lcs (>= 1.2.0, < 2.0)
|
||||||
|
rspec-support (~> 3.12.0)
|
||||||
|
rspec-mocks (3.12.6)
|
||||||
|
diff-lcs (>= 1.2.0, < 2.0)
|
||||||
|
rspec-support (~> 3.12.0)
|
||||||
|
rspec-support (3.12.1)
|
||||||
|
rubocop (1.52.1)
|
||||||
|
json (~> 2.3)
|
||||||
|
parallel (~> 1.10)
|
||||||
|
parser (>= 3.2.2.3)
|
||||||
|
rainbow (>= 2.2.2, < 4.0)
|
||||||
|
regexp_parser (>= 1.8, < 3.0)
|
||||||
|
rexml (>= 3.2.5, < 4.0)
|
||||||
|
rubocop-ast (>= 1.28.0, < 2.0)
|
||||||
|
ruby-progressbar (~> 1.7)
|
||||||
|
unicode-display_width (>= 2.4.0, < 3.0)
|
||||||
|
rubocop-ast (1.29.0)
|
||||||
|
parser (>= 3.2.1.0)
|
||||||
|
rubocop-performance (1.18.0)
|
||||||
|
rubocop (>= 1.7.0, < 2.0)
|
||||||
|
rubocop-ast (>= 0.4.0)
|
||||||
|
ruby-progressbar (1.13.0)
|
||||||
|
standard (1.30.1)
|
||||||
|
language_server-protocol (~> 3.17.0.2)
|
||||||
|
lint_roller (~> 1.0)
|
||||||
|
rubocop (~> 1.52.0)
|
||||||
|
standard-custom (~> 1.0.0)
|
||||||
|
standard-performance (~> 1.1.0)
|
||||||
|
standard-custom (1.0.2)
|
||||||
|
lint_roller (~> 1.0)
|
||||||
|
rubocop (~> 1.50)
|
||||||
|
standard-performance (1.1.2)
|
||||||
|
lint_roller (~> 1.1)
|
||||||
|
rubocop-performance (~> 1.18.0)
|
||||||
|
unicode-display_width (2.4.2)
|
||||||
webrick (1.8.1)
|
webrick (1.8.1)
|
||||||
websocket-driver (0.7.6)
|
|
||||||
websocket-extensions (>= 0.1.0)
|
|
||||||
websocket-extensions (0.1.5)
|
|
||||||
|
|
||||||
PLATFORMS
|
PLATFORMS
|
||||||
arm64-darwin-22
|
arm64-darwin-22
|
||||||
|
|
||||||
DEPENDENCIES
|
DEPENDENCIES
|
||||||
gemini-rb
|
|
||||||
rack
|
|
||||||
rackup
|
rackup
|
||||||
|
rake (~> 13.0)
|
||||||
|
rspec (~> 3.0)
|
||||||
|
skeksis!
|
||||||
|
standard (~> 1.3)
|
||||||
|
|
||||||
BUNDLED WITH
|
BUNDLED WITH
|
||||||
2.4.15
|
2.4.15
|
||||||
|
@ -1,4 +1,6 @@
|
|||||||
SERVE_DIR="/Volumes/Exodrive/Code/gemini-bridge-rack/skeksis/pub_gemini"
|
require 'skeksis'
|
||||||
|
|
||||||
|
SERVE_DIR="/Users/madeline/Code/gemini-bridge-rack/gemini"
|
||||||
|
|
||||||
class SkeksisApp
|
class SkeksisApp
|
||||||
def call(env)
|
def call(env)
|
||||||
@ -15,7 +17,9 @@ class SkeksisApp
|
|||||||
return Dir.each_child(path).map {|i| "#{i}\n"}
|
return Dir.each_child(path).map {|i| "#{i}\n"}
|
||||||
elsif File.exist?(path)
|
elsif File.exist?(path)
|
||||||
file = File.open(path, 'r')
|
file = File.open(path, 'r')
|
||||||
file.readlines
|
data = file.readlines
|
||||||
|
Skeksis::Parser.parse(data)
|
||||||
|
data
|
||||||
else # path is invalid
|
else # path is invalid
|
||||||
return nil
|
return nil
|
||||||
end
|
end
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
|
|
||||||
require_relative "skeksis/version"
|
require_relative "skeksis/version"
|
||||||
|
require_relative "skeksis/parser"
|
||||||
|
|
||||||
module Skeksis
|
module Skeksis
|
||||||
class Error < StandardError; end
|
class Error < StandardError; end
|
||||||
|
99
lib/skeksis/parser.rb
Normal file
99
lib/skeksis/parser.rb
Normal file
@ -0,0 +1,99 @@
|
|||||||
|
# Code adapted from MIT-licensed gemini-rb project
|
||||||
|
# parser.rb hosted at
|
||||||
|
# https://github.com/genenetwork/gemini-rb/blob/main/lib/gemini-rb/parser.rb
|
||||||
|
|
||||||
|
module Skeksis
|
||||||
|
module Parser
|
||||||
|
extend self
|
||||||
|
|
||||||
|
def parse(input)
|
||||||
|
puts("##### PARSING STARTED #####")
|
||||||
|
|
||||||
|
list = []
|
||||||
|
|
||||||
|
data = input.map(&:chomp)
|
||||||
|
|
||||||
|
in_verbatim_block = false
|
||||||
|
data.each do |line|
|
||||||
|
type = get_type(line)
|
||||||
|
if type == :verbatim and in_verbatim_block == false
|
||||||
|
in_verbatim_block = true
|
||||||
|
elsif type == :verbatim
|
||||||
|
in_verbatim_block = false
|
||||||
|
end
|
||||||
|
|
||||||
|
if in_verbatim_block == true
|
||||||
|
list.push({ type: :verbatim, content: [line] })
|
||||||
|
else
|
||||||
|
list.push({ type: type, content: [line] })
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
puts strip_markers(list)
|
||||||
|
puts("##### PARSING FINISHED #####")
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def strip_markers(gemtext)
|
||||||
|
gemtext.map do |line|
|
||||||
|
type = line[:type]
|
||||||
|
content = line[:content]
|
||||||
|
text = content[0]
|
||||||
|
|
||||||
|
case type
|
||||||
|
when :blank
|
||||||
|
#{ type: type, content: nil }
|
||||||
|
{ type: type }
|
||||||
|
when :header
|
||||||
|
m = /^(#+)(\s*)(.*)/.match(text)
|
||||||
|
level = m[1].count("#")
|
||||||
|
{ type: type, level: level, content: [m[3]] }
|
||||||
|
when :list
|
||||||
|
{ type: type, content: content.map { |t| t.sub(/^\*\s*/, "") } }
|
||||||
|
when :quote
|
||||||
|
{ type: type, content: content.map { |t| t.sub(/^\>\s?/, "") } }
|
||||||
|
when :uri
|
||||||
|
a = text.sub(/^=>\s*/, "").split(" ", 2)
|
||||||
|
link = a[0]
|
||||||
|
text = a[1]
|
||||||
|
{ type: type, link: link, text: text }
|
||||||
|
when :verbatim
|
||||||
|
# TODO: Match with syntax highlighting, maybe
|
||||||
|
m = /^```(.*)/.match(text)
|
||||||
|
unless m.nil?
|
||||||
|
nil
|
||||||
|
else
|
||||||
|
{ type: type, content: content }
|
||||||
|
end
|
||||||
|
else
|
||||||
|
{ type: type, content: content }
|
||||||
|
end
|
||||||
|
end.compact
|
||||||
|
end
|
||||||
|
|
||||||
|
def get_type(l)
|
||||||
|
case l
|
||||||
|
when ""
|
||||||
|
:blank
|
||||||
|
when /^#/
|
||||||
|
:header
|
||||||
|
when /^\*/
|
||||||
|
:list
|
||||||
|
when /^\>/
|
||||||
|
:quote
|
||||||
|
when /^\=>/
|
||||||
|
:uri
|
||||||
|
when /^```/
|
||||||
|
:verbatim
|
||||||
|
else
|
||||||
|
:text
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def parse_line(line)
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
end
|
@ -8,16 +8,16 @@ Gem::Specification.new do |spec|
|
|||||||
spec.authors = ["maddiebaka"]
|
spec.authors = ["maddiebaka"]
|
||||||
spec.email = ["madeline@cray.lgbt"]
|
spec.email = ["madeline@cray.lgbt"]
|
||||||
|
|
||||||
spec.summary = "TODO: Write a short summary, because RubyGems requires one."
|
spec.summary = "An http->gemini bridge in ruby"
|
||||||
spec.description = "TODO: Write a longer description or delete this line."
|
#spec.description = "TODO: Write a longer description or delete this line."
|
||||||
spec.homepage = "TODO: Put your gem's website or public repo URL here."
|
spec.homepage = "https://maddie.info"
|
||||||
spec.required_ruby_version = ">= 2.6.0"
|
spec.required_ruby_version = ">= 2.6.0"
|
||||||
|
|
||||||
spec.metadata["allowed_push_host"] = "TODO: Set to your gem server 'https://example.com'"
|
#spec.metadata["allowed_push_host"] = "TODO: Set to your gem server 'https://example.com'"
|
||||||
|
|
||||||
spec.metadata["homepage_uri"] = spec.homepage
|
spec.metadata["homepage_uri"] = spec.homepage
|
||||||
spec.metadata["source_code_uri"] = "TODO: Put your gem's public repo URL here."
|
#spec.metadata["source_code_uri"] = "TODO: Put your gem's public repo URL here."
|
||||||
spec.metadata["changelog_uri"] = "TODO: Put your gem's CHANGELOG.md URL here."
|
#spec.metadata["changelog_uri"] = "TODO: Put your gem's CHANGELOG.md URL here."
|
||||||
|
|
||||||
# Specify which files should be added to the gem when it is released.
|
# Specify which files should be added to the gem when it is released.
|
||||||
# The `git ls-files -z` loads the files in the RubyGem that have been added into git.
|
# The `git ls-files -z` loads the files in the RubyGem that have been added into git.
|
||||||
|
Loading…
Reference in New Issue
Block a user