# Reopening...
module RuneBlog::REPL
Patterns =
{"help" => :cmd_help,
"h" => :cmd_help,
"version" => :cmd_version,
"v" => :cmd_version,
"list views" => :cmd_list_views,
"lsv" => :cmd_list_views,
"new view $name" => :cmd_new_view,
"new post" => :cmd_new_post,
"p" => :cmd_new_post,
"post" => :cmd_new_post,
"change view $name" => :cmd_change_view,
"cv $name" => :cmd_change_view,
"cv" => :cmd_change_view, # 0-arity must come second
"list posts" => :cmd_list_posts,
"lsp" => :cmd_list_posts,
"list drafts" => :cmd_list_drafts,
"lsd" => :cmd_list_drafts,
"rm $postid" => :cmd_remove_post,
"kill >postid" => :cmd_kill,
"edit $postid" => :cmd_edit_post,
"ed $postid" => :cmd_edit_post,
"e $postid" => :cmd_edit_post,
"preview" => :cmd_preview,
"pre" => :cmd_preview,
"browse" => :cmd_browse,
"relink" => :cmd_relink,
"rebuild" => :cmd_rebuild,
"deploy" => :cmd_deploy,
"q" => :cmd_quit,
"quit" => :cmd_quit
}
Regexes = {}
Patterns.each_pair do |pat, meth|
rx = "^" + pat
rx.gsub!(/ /, " +")
rx.gsub!(/\$(\w+) */) { " *(?<#{$1}>\\w+)" }
# How to handle multiple optional args?
rx.sub!(/>(\w+)$/) { "(.+)" }
p rx if rx =~ /kill/
rx << "$"
rx = Regexp.new(rx)
Regexes[rx] = meth
end
def self.choose_method(cmd)
found = nil
params = []
Regexes.each_pair do |rx, meth|
m = cmd.match(rx)
# puts "#{rx} =~ #{cmd.inspect} --> #{m.to_a.inspect}"
result = m ? m.to_a : nil
next unless result
found = meth
params = m[1..-1]
end
meth = found || :cmd_INVALID
params = cmd if meth == :cmd_INVALID
[meth, params]
end
def error(err)
str = "\n Error: #{red(err)}"
puts str
puts err.backtrace
end
def ask(prompt, meth = :to_s)
print prompt
STDOUT.flush
STDIN.gets.chomp.send(meth)
end
def yesno(prompt, meth = :to_s)
print prompt
STDOUT.flush
STDIN.gets.chomp.upcase[0] == "Y"
end
def clear
puts "\e[H\e[2J" # clear screen
end
def red(text)
"\e[31m#{text}\e[0m"
end
def blue(text)
"\e[34m#{text}\e[0m"
end
def bold(str)
"\e[1m#{str}\e[22m"
end
def interpolate(str)
wrap = "<<-EOS\n#{str}\nEOS"
eval wrap
end
def colored_slug(slug)
red(slug[0..3])+blue(slug[4..-1])
end
### process_post
def process_post(file)
@main ||= Livetext.new
@main.main.output = File.new("/tmp/WHOA","w")
path = @root + "/src/#{file}"
@meta = @main.process_file(path, binding)
raise "process_file returned nil" if @meta.nil?
slug = @blog.make_slug(@meta.title, @blog.sequence)
slug = file.sub(/.lt3$/, "")
@meta.slug = slug
@meta
rescue => err
error(err)
end
### reload_post
def reload_post(file)
@main ||= Livetext.new
@main.main.output = File.new("/tmp/WHOA","w") # FIXME srsly?
@meta = process_post(file)
@meta.slug = file.sub(/.lt3$/, "")
@meta
rescue => err
error(err)
end
### posting
def posting(view, meta)
# FIXME clean up and generalize
ref = "#{view}/#{meta.slug}/index.html"
<<-HTML
#{meta.pubdate}
#{meta.title}
#{meta.teaser}
Read more...