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!
+
+
+
+
+ <%= @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