diff --git a/.gitignore b/.gitignore index 3a20835..bf65b63 100644 --- a/.gitignore +++ b/.gitignore @@ -53,9 +53,7 @@ Thumbs.db .netrwhist *.un~ -# YARD Related # -################ -# doc/ is the generated documentation for Yard, which can easily be generated -# locally with yardoc -# .yardoc/ is yard metadata, not necessary to be uploaded to GH -.yardoc/ +# Ruby # +######## +*.gem +/.yardoc/ diff --git a/.ruby-version b/.ruby-version new file mode 100644 index 0000000..951d42f --- /dev/null +++ b/.ruby-version @@ -0,0 +1 @@ +ruby-2.4.2 diff --git a/Gemfile b/Gemfile index f52d7ba..b8028e2 100644 --- a/Gemfile +++ b/Gemfile @@ -1,12 +1,21 @@ # frozen_string_literal: true -source "https://rubygems.org" +source 'https://rubygems.org' -# Documentation -gem "rdoc" -gem "redcarpet" -gem "thor" -gem "yard" -gem "yard-ghpages" +ruby '2.4.2' -# Testing -gem "rubocop" +gem 'thor' + +group :documentation do + gem 'rdoc' + gem 'redcarpet' + gem 'yard' + gem 'yard-ghpages' +end + +group :test do + gem 'rubocop' +end + +group :web do + gem 'rack' +end diff --git a/Gemfile.lock b/Gemfile.lock index bd564d0..a13aa84 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -6,6 +6,7 @@ GEM parser (2.4.0.0) ast (~> 2.2) powerpack (0.1.1) + rack (2.0.3) rainbow (2.2.2) rake rake (11.3.0) @@ -30,6 +31,7 @@ PLATFORMS ruby DEPENDENCIES + rack rdoc redcarpet rubocop @@ -37,5 +39,8 @@ DEPENDENCIES yard yard-ghpages +RUBY VERSION + ruby 2.4.2p198 + BUNDLED WITH - 1.14.6 + 1.15.4 diff --git a/lib/sapling.rb b/lib/sapling.rb index 901094b..721455a 100644 --- a/lib/sapling.rb +++ b/lib/sapling.rb @@ -1,5 +1,7 @@ #!/usr/bin/env ruby +# frozen string literal: true +require 'rack' require 'thor' require 'yaml' @@ -7,6 +9,7 @@ Dir[File.join(__dir__, 'sapling', '*.rb')].each { |file| require file } # The main Sapling interface. class Sapling < Thor + # CLI-based options desc 'read TREE', 'Load and traverse the TREE' def read(file) puts 'Welcome to Sapling, a Dialogue Tree Utility.' @@ -30,10 +33,16 @@ class Sapling < Thor gardner.plant end + # Web-based options desc 'serve TREE', 'Load TREE in a web-based interface' - def serve(tree) - exit unless verify_tree(tree) - puts 'Sinatra will be cool.' + def serve(file) + exit unless verify_tree(file) + tree = Gardner::Plot.new(YAML.load_file(file)) + Rack::Server.new( + app: Greenhouse.new(tree), + server: 'webrick', + Port: 9000 + ).start end desc 'export TREE', 'Save a portable HTML version of TREE' @@ -41,4 +50,15 @@ class Sapling < Thor exit unless verify_tree(tree) puts 'Cool feature, bro!' end + + # Miscellaneous options + desc 'example', 'Play Example Quest!' + def example + file = File.join(__dir__, '..', 'var', 'trees', 'example_quest.yaml') + puts 'Welcome to Sapling, a Dialogue Tree Utility.' + exit unless verify_tree(file) + tree = Gardner::Plot.new(YAML.load_file(file)) + speaker = Dialogue::Speaker.new(tree, false) + speaker.conversation + end end diff --git a/lib/sapling/greenhouse.rb b/lib/sapling/greenhouse.rb new file mode 100644 index 0000000..cf88e19 --- /dev/null +++ b/lib/sapling/greenhouse.rb @@ -0,0 +1,15 @@ +require 'erb' + +# The rack application +class Greenhouse + attr_reader :tree + + def initialize(file) + @tree = file + @response = ERB.new(File.read('lib/sapling/index.erb')).result(binding) + end + + def call(_env) + ['200', { 'Content-Type' => 'text/html' }, [@response]] + end +end diff --git a/lib/sapling/index.erb b/lib/sapling/index.erb new file mode 100644 index 0000000..949984a --- /dev/null +++ b/lib/sapling/index.erb @@ -0,0 +1,20 @@ + + + + + + Sapling: Adventure Awaits! + + +
+

Sapling

+
+ GitHub +
+
+
+ <%= @tree.trunk %> + + diff --git a/sapling-dialogue.gemspec b/sapling-dialogue.gemspec index 3aebab3..ad7550a 100644 --- a/sapling-dialogue.gemspec +++ b/sapling-dialogue.gemspec @@ -7,7 +7,9 @@ Gem::Specification.new do |s| s.description = 'Create, edit, and traverse dialogue trees' s.authors = ['Bill Niblock'] s.email = 'azulien@gmail.com' - s.files = Dir['lib/**/*.rb'] + Dir['bin/*'] + s.files = Dir['lib/**/*.rb'] + + Dir['bin/*'] + + Dir['var/trees/*'] s.homepage = 'http://www.theinternetvagabond.com/sapling/' s.license = 'MIT' end