Initial commit: extracted from impostor-bbs gems/bbs
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
48
lib/bbs/renderer.rb
Normal file
48
lib/bbs/renderer.rb
Normal file
@@ -0,0 +1,48 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
require 'erb'
|
||||
require 'artii'
|
||||
|
||||
module BBS
|
||||
class Renderer
|
||||
def self.render(name, vars = {})
|
||||
dir = BBS.config.screens_dir or raise "BBS.config.screens_dir is not set"
|
||||
path = File.join(dir, "#{name}.erb")
|
||||
ctx = Context.new(vars)
|
||||
ERB.new(File.read(path), trim_mode: '-').result(ctx.ctx_binding).gsub("\n", "\r\n")
|
||||
end
|
||||
|
||||
class Context
|
||||
def initialize(vars)
|
||||
vars.each { |k, v| instance_variable_set(:"@#{k}", v) }
|
||||
end
|
||||
|
||||
def ctx_binding = binding
|
||||
|
||||
def banner(text, padding: 2)
|
||||
inner = "#{' ' * padding}#{text}#{' ' * padding}"
|
||||
bar = '═' * inner.length
|
||||
"#{green}╔#{bar}╗#{reset}\n" \
|
||||
"#{green}║#{inner}║#{reset}\n" \
|
||||
"#{green}╚#{bar}╝#{reset}"
|
||||
end
|
||||
|
||||
def big_banner(text, font: 'slant')
|
||||
Artii::Base.new(font: font).asciify(text)
|
||||
.split("\n")
|
||||
.map { |l| " #{green}#{l}#{reset}" }
|
||||
.join("\n")
|
||||
end
|
||||
|
||||
def clr = "\e[2J\e[H"
|
||||
def reset = "\e[0m"
|
||||
def green = "\e[1;32m"
|
||||
def yellow = "\e[1;33m"
|
||||
def cyan = "\e[1;36m"
|
||||
def white = "\e[1;37m"
|
||||
def gray = "\e[0;37m"
|
||||
def red = "\e[1;31m"
|
||||
def dim_green = "\e[0;32m"
|
||||
end
|
||||
end
|
||||
end
|
||||
Reference in New Issue
Block a user