twee2 0.2.0 → 0.2.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/twee2.rb +9 -79
- data/lib/twee2/story_file.rb +84 -0
- data/lib/twee2/story_format.rb +25 -0
- data/lib/twee2/version.rb +1 -1
- data/twee2.gemspec +8 -2
- metadata +134 -12
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b63cd0490f4dff22a79e5d67a667c6a433d899ba
|
4
|
+
data.tar.gz: db0132a07a752ac8700e44c2062550808ba74c26
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 74b26f90671c6f4b7e380ee4fab5f5ee0b8bc716dfaa863d85a5b0611eab6831834ecd3de0ab39ce9db69ba11ea364f7c822cecca08193bcbb946d7bdd283b2c
|
7
|
+
data.tar.gz: 9eeba4d00780facc6c2c112b7305596853f6771d53cebb51733d3612e1267f7da5b85c7408a36bb9158f4d154a69522f09ef4be4437b86ed371167f4e0ce1efe
|
data/lib/twee2.rb
CHANGED
@@ -1,93 +1,23 @@
|
|
1
|
-
Encoding.default_external = Encoding::UTF_8
|
2
|
-
Encoding.default_internal = Encoding::UTF_8
|
3
|
-
|
4
|
-
require "twee2/version"
|
1
|
+
Encoding.default_external = Encoding.default_internal = Encoding::UTF_8
|
5
2
|
|
6
3
|
# Prerequisites (managed by bundler)
|
7
|
-
|
8
|
-
|
9
|
-
require
|
10
|
-
|
11
|
-
require 'builder'
|
12
|
-
require 'filewatcher'
|
13
|
-
require 'haml'
|
14
|
-
require 'coffee_script'
|
4
|
+
%w{rubygems bundler/setup thor json builder filewatcher haml coffee_script
|
5
|
+
twee2/version twee2/story_format twee2/story_file}.each do |prerequisite|
|
6
|
+
require prerequisite
|
7
|
+
end
|
15
8
|
|
16
9
|
module Twee2
|
17
10
|
# Constants
|
18
11
|
DEFAULT_FORMAT = 'Harlowe'
|
19
|
-
HAML_OPTIONS = {
|
20
|
-
remove_whitespace: true
|
21
|
-
}
|
22
12
|
|
23
13
|
def self.build(input, output, options = {})
|
24
14
|
# Read and parse format file
|
25
|
-
|
26
|
-
format_data = format_file.match(/(["'])source\1 *: *(["']).*?[^\\]\2/)[0]
|
27
|
-
format_data_for_json = "\{#{format_data}\}"
|
28
|
-
result = JSON.parse(format_data_for_json)['source']
|
15
|
+
story_format = StoryFormat::new(options[:format])
|
29
16
|
# Read and parse input file
|
30
|
-
|
31
|
-
File::read(input).each_line do |line| # REFACTOR: switch this to using regular expressions, why not?
|
32
|
-
if line =~ /^:: *([^\[]*?) *(\[(.*?)\])? *[\r\n]+$/
|
33
|
-
passages[current_passage = $1.strip] = { tags: ($3 || '').split(' '), content: '', exclude_from_output: false, pid: nil}
|
34
|
-
elsif current_passage
|
35
|
-
passages[current_passage][:content] << line
|
36
|
-
end
|
37
|
-
end
|
38
|
-
passages.each_key{|k| passages[k][:content].strip!} # Strip excessive trailing whitespace
|
39
|
-
# Run each passage through a preprocessor, if required
|
40
|
-
passages.each_key do |k|
|
41
|
-
# HAML
|
42
|
-
if passages[k][:tags].include? 'haml'
|
43
|
-
passages[k][:content] = Haml::Engine.new(passages[k][:content], HAML_OPTIONS).render
|
44
|
-
passages[k][:tags].delete 'haml'
|
45
|
-
end
|
46
|
-
# Coffeescript
|
47
|
-
if passages[k][:tags].include? 'coffee'
|
48
|
-
passages[k][:content] = CoffeeScript.compile(passages[k][:content])
|
49
|
-
passages[k][:tags].delete 'coffee'
|
50
|
-
end
|
51
|
-
end
|
52
|
-
# Extract 'special' passages and mark them as not being included in output
|
53
|
-
story_name, story_css, story_js, pid, story_start_pid = 'An unnamed story', '', '', 0, 1
|
54
|
-
passages.each_key do |k|
|
55
|
-
if k == 'StoryTitle'
|
56
|
-
story_name = passages[k][:content]
|
57
|
-
passages[k][:exclude_from_output] = true
|
58
|
-
elsif %w{StorySubtitle StoryAuthor StoryMenu StorySettings StoryIncludes}.include? k
|
59
|
-
puts "WARNING: ignoring passage '#{k}'"
|
60
|
-
passages[k][:exclude_from_output] = true
|
61
|
-
elsif passages[k][:tags].include? 'stylesheet'
|
62
|
-
story_css << "#{passages[k][:content]}\n"
|
63
|
-
passages[k][:exclude_from_output] = true
|
64
|
-
elsif passages[k][:tags].include? 'script'
|
65
|
-
story_js << "#{passages[k][:content]}\n"
|
66
|
-
passages[k][:exclude_from_output] = true
|
67
|
-
elsif k == 'Start'
|
68
|
-
passages[k][:pid] = (pid += 1)
|
69
|
-
story_start_pid = pid
|
70
|
-
else
|
71
|
-
passages[k][:pid] = (pid += 1)
|
72
|
-
end
|
73
|
-
end
|
74
|
-
# Generate XML in Twine 2 format
|
75
|
-
story_data = Builder::XmlMarkup.new
|
76
|
-
# TODO: what is tw-storydata's "options" attribute for?
|
77
|
-
story_data.tag!('tw-storydata', { name: story_name, startnode: story_start_pid, creator: 'Twee2', 'creator-version' => Twee2::VERSION, ifid: 'TODO', format: options[:format], options: '' }) do
|
78
|
-
story_data.style(story_css, role: 'stylesheet', id: 'twine-user-stylesheet', type: 'text/twine-css')
|
79
|
-
story_data.script(story_js, role: 'script', id: 'twine-user-script', type: 'text/twine-javascript')
|
80
|
-
passages.each do |k,v|
|
81
|
-
unless v[:exclude_from_output]
|
82
|
-
story_data.tag!('tw-passagedata', { pid: v[:pid], name: k, tags: v[:tags].join(' ') }, v[:content])
|
83
|
-
end
|
84
|
-
end
|
85
|
-
end
|
17
|
+
story_file = StoryFile::new(input)
|
86
18
|
# Produce output file
|
87
|
-
result.gsub!('{{STORY_NAME}}', story_name)
|
88
|
-
result.gsub!('{{STORY_DATA}}', story_data.target!)
|
89
19
|
File::open(output, 'w') do |out|
|
90
|
-
out.print
|
20
|
+
out.print story_format.compile(story_file)
|
91
21
|
end
|
92
22
|
puts "Done"
|
93
23
|
end
|
@@ -104,7 +34,7 @@ module Twee2
|
|
104
34
|
|
105
35
|
def self.formats
|
106
36
|
puts "I understand the following output formats:"
|
107
|
-
puts
|
37
|
+
puts StoryFormat.known_names.join("\n")
|
108
38
|
end
|
109
39
|
|
110
40
|
def self.help
|
@@ -0,0 +1,84 @@
|
|
1
|
+
module Twee2
|
2
|
+
class StoryFileNotFoundException < Exception; end
|
3
|
+
|
4
|
+
class StoryFile
|
5
|
+
HAML_OPTIONS = {
|
6
|
+
remove_whitespace: true
|
7
|
+
}
|
8
|
+
Tilt::CoffeeScriptTemplate.default_bare = true # bare mode for HAML :coffeescript blocks
|
9
|
+
COFFEESCRIPT_OPTIONS = {
|
10
|
+
bare: true
|
11
|
+
}
|
12
|
+
|
13
|
+
# Loads the StoryFile with the given name
|
14
|
+
def initialize(filename)
|
15
|
+
raise(StoryFileNotFoundException) if !File::exists?(filename)
|
16
|
+
@passages, current_passage = {}, nil
|
17
|
+
File::read(filename).each_line do |line| # REFACTOR: switch this to using regular expressions, why not?
|
18
|
+
if line =~ /^:: *([^\[]*?) *(\[(.*?)\])? *[\r\n]+$/
|
19
|
+
@passages[current_passage = $1.strip] = { tags: ($3 || '').split(' '), content: '', exclude_from_output: false, pid: nil}
|
20
|
+
elsif current_passage
|
21
|
+
@passages[current_passage][:content] << line
|
22
|
+
end
|
23
|
+
end
|
24
|
+
@passages.each_key{|k| @passages[k][:content].strip!} # Strip excessive trailing whitespace
|
25
|
+
# Run each passage through a preprocessor, if required
|
26
|
+
@passages.each_key do |k|
|
27
|
+
# HAML
|
28
|
+
if @passages[k][:tags].include? 'haml'
|
29
|
+
@passages[k][:content] = Haml::Engine.new(@passages[k][:content], HAML_OPTIONS).render
|
30
|
+
@passages[k][:tags].delete 'haml'
|
31
|
+
end
|
32
|
+
# Coffeescript
|
33
|
+
if @passages[k][:tags].include? 'coffee'
|
34
|
+
@passages[k][:content] = CoffeeScript.compile(@passages[k][:content], COFFEESCRIPT_OPTIONS)
|
35
|
+
@passages[k][:tags].delete 'coffee'
|
36
|
+
end
|
37
|
+
end
|
38
|
+
# Extract 'special' passages and mark them as not being included in output
|
39
|
+
@story_name, story_css, story_js, pid, story_start_pid = 'An unnamed story', '', '', 0, 1
|
40
|
+
@passages.each_key do |k|
|
41
|
+
if k == 'StoryTitle'
|
42
|
+
@story_name = @passages[k][:content]
|
43
|
+
@passages[k][:exclude_from_output] = true
|
44
|
+
elsif %w{StorySubtitle StoryAuthor StoryMenu StorySettings StoryIncludes}.include? k
|
45
|
+
puts "WARNING: ignoring passage '#{k}'"
|
46
|
+
@passages[k][:exclude_from_output] = true
|
47
|
+
elsif @passages[k][:tags].include? 'stylesheet'
|
48
|
+
story_css << "#{@passages[k][:content]}\n"
|
49
|
+
@passages[k][:exclude_from_output] = true
|
50
|
+
elsif @passages[k][:tags].include? 'script'
|
51
|
+
story_js << "#{@passages[k][:content]}\n"
|
52
|
+
@passages[k][:exclude_from_output] = true
|
53
|
+
elsif k == 'Start'
|
54
|
+
@passages[k][:pid] = (pid += 1)
|
55
|
+
story_start_pid = pid
|
56
|
+
else
|
57
|
+
@passages[k][:pid] = (pid += 1)
|
58
|
+
end
|
59
|
+
end
|
60
|
+
# Generate XML in Twine 2 format
|
61
|
+
@story_data = Builder::XmlMarkup.new
|
62
|
+
# TODO: what is tw-storydata's "options" attribute for?
|
63
|
+
@story_data.tag!('tw-storydata', { name: @story_name, startnode: story_start_pid, creator: 'Twee2', 'creator-version' => Twee2::VERSION, ifid: 'TODO', format: '{{STORY_FORMAT}}', options: '' }) do
|
64
|
+
@story_data.style(story_css, role: 'stylesheet', id: 'twine-user-stylesheet', type: 'text/twine-css')
|
65
|
+
@story_data.script(story_js, role: 'script', id: 'twine-user-script', type: 'text/twine-javascript')
|
66
|
+
@passages.each do |k,v|
|
67
|
+
unless v[:exclude_from_output]
|
68
|
+
@story_data.tag!('tw-passagedata', { pid: v[:pid], name: k, tags: v[:tags].join(' ') }, v[:content])
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
# Returns the title of this story
|
75
|
+
def title
|
76
|
+
@story_name
|
77
|
+
end
|
78
|
+
|
79
|
+
# Returns the rendered XML that represents this story
|
80
|
+
def xmldata
|
81
|
+
@story_data.target!
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module Twee2
|
2
|
+
class StoryFormatNotFoundException < Exception; end
|
3
|
+
|
4
|
+
class StoryFormat
|
5
|
+
# Loads the StoryFormat with the specified name
|
6
|
+
def initialize(name)
|
7
|
+
raise(StoryFormatNotFoundException) if !File::exists?(format_file_path = Twee2::buildpath("storyFormats/#{name}/format.js"))
|
8
|
+
@name = name
|
9
|
+
format_file = File::read(format_file_path)
|
10
|
+
format_data = format_file.match(/(["'])source\1 *: *(["']).*?[^\\]\2/)[0]
|
11
|
+
format_data_for_json = "\{#{format_data}\}"
|
12
|
+
@source = JSON.parse(format_data_for_json)['source']
|
13
|
+
end
|
14
|
+
|
15
|
+
# Given a story file, injects it into the StoryFormat and returns the HTML results
|
16
|
+
def compile(story_file)
|
17
|
+
@source.gsub('{{STORY_NAME}}', story_file.title).gsub('{{STORY_DATA}}', story_file.xmldata).gsub('{{STORY_FORMAT}}', @name)
|
18
|
+
end
|
19
|
+
|
20
|
+
# Returns an array containing the known StoryFormat names
|
21
|
+
def self.known_names
|
22
|
+
Dir.open(Twee2::buildpath('storyFormats')).to_a.sort.reject{|d|d=~/^\./}.map{|f|" * #{f}"}
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
data/lib/twee2/version.rb
CHANGED
data/twee2.gemspec
CHANGED
@@ -25,10 +25,16 @@ Gem::Specification.new do |spec|
|
|
25
25
|
|
26
26
|
spec.required_ruby_version = '~> 2'
|
27
27
|
|
28
|
-
spec.add_development_dependency
|
29
|
-
spec.add_development_dependency "rake", '~> 10'
|
28
|
+
spec.add_development_dependency 'rake', '~> 10'
|
30
29
|
|
31
30
|
spec.add_runtime_dependency 'builder', '~> 3.2', '>= 3.2.2'
|
31
|
+
spec.add_runtime_dependency 'bundler', '~> 1.6'
|
32
|
+
spec.add_runtime_dependency 'coffee-script', '~> 2.4', '>= 2.4.1'
|
33
|
+
spec.add_runtime_dependency 'coffee-script-source', '~> 1.9', '>= 1.9.1.1'
|
34
|
+
spec.add_runtime_dependency 'execjs', '~> 2.6', '>= 2.6.0'
|
32
35
|
spec.add_runtime_dependency 'filewatcher', '~> 0.5', '>= 0.5.2'
|
36
|
+
spec.add_runtime_dependency 'haml', '~> 4.0', '>= 4.0.7'
|
33
37
|
spec.add_runtime_dependency 'thor', '~> 0.19', '>= 0.19.1'
|
38
|
+
spec.add_runtime_dependency 'tilt', '~> 2.0', '>= 2.0.1'
|
39
|
+
spec.add_runtime_dependency 'trollop', '~> 2.1', '>= 2.1.2'
|
34
40
|
end
|
metadata
CHANGED
@@ -1,15 +1,49 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: twee2
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Dan Q
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-08-
|
11
|
+
date: 2015-08-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: rake
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '10'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '10'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: builder
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '3.2'
|
34
|
+
- - ">="
|
35
|
+
- !ruby/object:Gem::Version
|
36
|
+
version: 3.2.2
|
37
|
+
type: :runtime
|
38
|
+
prerelease: false
|
39
|
+
version_requirements: !ruby/object:Gem::Requirement
|
40
|
+
requirements:
|
41
|
+
- - "~>"
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: '3.2'
|
44
|
+
- - ">="
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: 3.2.2
|
13
47
|
- !ruby/object:Gem::Dependency
|
14
48
|
name: bundler
|
15
49
|
requirement: !ruby/object:Gem::Requirement
|
@@ -17,7 +51,7 @@ dependencies:
|
|
17
51
|
- - "~>"
|
18
52
|
- !ruby/object:Gem::Version
|
19
53
|
version: '1.6'
|
20
|
-
type: :
|
54
|
+
type: :runtime
|
21
55
|
prerelease: false
|
22
56
|
version_requirements: !ruby/object:Gem::Requirement
|
23
57
|
requirements:
|
@@ -25,39 +59,65 @@ dependencies:
|
|
25
59
|
- !ruby/object:Gem::Version
|
26
60
|
version: '1.6'
|
27
61
|
- !ruby/object:Gem::Dependency
|
28
|
-
name:
|
62
|
+
name: coffee-script
|
29
63
|
requirement: !ruby/object:Gem::Requirement
|
30
64
|
requirements:
|
31
65
|
- - "~>"
|
32
66
|
- !ruby/object:Gem::Version
|
33
|
-
version: '
|
34
|
-
|
67
|
+
version: '2.4'
|
68
|
+
- - ">="
|
69
|
+
- !ruby/object:Gem::Version
|
70
|
+
version: 2.4.1
|
71
|
+
type: :runtime
|
35
72
|
prerelease: false
|
36
73
|
version_requirements: !ruby/object:Gem::Requirement
|
37
74
|
requirements:
|
38
75
|
- - "~>"
|
39
76
|
- !ruby/object:Gem::Version
|
40
|
-
version: '
|
77
|
+
version: '2.4'
|
78
|
+
- - ">="
|
79
|
+
- !ruby/object:Gem::Version
|
80
|
+
version: 2.4.1
|
41
81
|
- !ruby/object:Gem::Dependency
|
42
|
-
name:
|
82
|
+
name: coffee-script-source
|
43
83
|
requirement: !ruby/object:Gem::Requirement
|
44
84
|
requirements:
|
45
85
|
- - "~>"
|
46
86
|
- !ruby/object:Gem::Version
|
47
|
-
version: '
|
87
|
+
version: '1.9'
|
48
88
|
- - ">="
|
49
89
|
- !ruby/object:Gem::Version
|
50
|
-
version:
|
90
|
+
version: 1.9.1.1
|
51
91
|
type: :runtime
|
52
92
|
prerelease: false
|
53
93
|
version_requirements: !ruby/object:Gem::Requirement
|
54
94
|
requirements:
|
55
95
|
- - "~>"
|
56
96
|
- !ruby/object:Gem::Version
|
57
|
-
version: '
|
97
|
+
version: '1.9'
|
58
98
|
- - ">="
|
59
99
|
- !ruby/object:Gem::Version
|
60
|
-
version:
|
100
|
+
version: 1.9.1.1
|
101
|
+
- !ruby/object:Gem::Dependency
|
102
|
+
name: execjs
|
103
|
+
requirement: !ruby/object:Gem::Requirement
|
104
|
+
requirements:
|
105
|
+
- - "~>"
|
106
|
+
- !ruby/object:Gem::Version
|
107
|
+
version: '2.6'
|
108
|
+
- - ">="
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: 2.6.0
|
111
|
+
type: :runtime
|
112
|
+
prerelease: false
|
113
|
+
version_requirements: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - "~>"
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '2.6'
|
118
|
+
- - ">="
|
119
|
+
- !ruby/object:Gem::Version
|
120
|
+
version: 2.6.0
|
61
121
|
- !ruby/object:Gem::Dependency
|
62
122
|
name: filewatcher
|
63
123
|
requirement: !ruby/object:Gem::Requirement
|
@@ -78,6 +138,26 @@ dependencies:
|
|
78
138
|
- - ">="
|
79
139
|
- !ruby/object:Gem::Version
|
80
140
|
version: 0.5.2
|
141
|
+
- !ruby/object:Gem::Dependency
|
142
|
+
name: haml
|
143
|
+
requirement: !ruby/object:Gem::Requirement
|
144
|
+
requirements:
|
145
|
+
- - "~>"
|
146
|
+
- !ruby/object:Gem::Version
|
147
|
+
version: '4.0'
|
148
|
+
- - ">="
|
149
|
+
- !ruby/object:Gem::Version
|
150
|
+
version: 4.0.7
|
151
|
+
type: :runtime
|
152
|
+
prerelease: false
|
153
|
+
version_requirements: !ruby/object:Gem::Requirement
|
154
|
+
requirements:
|
155
|
+
- - "~>"
|
156
|
+
- !ruby/object:Gem::Version
|
157
|
+
version: '4.0'
|
158
|
+
- - ">="
|
159
|
+
- !ruby/object:Gem::Version
|
160
|
+
version: 4.0.7
|
81
161
|
- !ruby/object:Gem::Dependency
|
82
162
|
name: thor
|
83
163
|
requirement: !ruby/object:Gem::Requirement
|
@@ -98,6 +178,46 @@ dependencies:
|
|
98
178
|
- - ">="
|
99
179
|
- !ruby/object:Gem::Version
|
100
180
|
version: 0.19.1
|
181
|
+
- !ruby/object:Gem::Dependency
|
182
|
+
name: tilt
|
183
|
+
requirement: !ruby/object:Gem::Requirement
|
184
|
+
requirements:
|
185
|
+
- - "~>"
|
186
|
+
- !ruby/object:Gem::Version
|
187
|
+
version: '2.0'
|
188
|
+
- - ">="
|
189
|
+
- !ruby/object:Gem::Version
|
190
|
+
version: 2.0.1
|
191
|
+
type: :runtime
|
192
|
+
prerelease: false
|
193
|
+
version_requirements: !ruby/object:Gem::Requirement
|
194
|
+
requirements:
|
195
|
+
- - "~>"
|
196
|
+
- !ruby/object:Gem::Version
|
197
|
+
version: '2.0'
|
198
|
+
- - ">="
|
199
|
+
- !ruby/object:Gem::Version
|
200
|
+
version: 2.0.1
|
201
|
+
- !ruby/object:Gem::Dependency
|
202
|
+
name: trollop
|
203
|
+
requirement: !ruby/object:Gem::Requirement
|
204
|
+
requirements:
|
205
|
+
- - "~>"
|
206
|
+
- !ruby/object:Gem::Version
|
207
|
+
version: '2.1'
|
208
|
+
- - ">="
|
209
|
+
- !ruby/object:Gem::Version
|
210
|
+
version: 2.1.2
|
211
|
+
type: :runtime
|
212
|
+
prerelease: false
|
213
|
+
version_requirements: !ruby/object:Gem::Requirement
|
214
|
+
requirements:
|
215
|
+
- - "~>"
|
216
|
+
- !ruby/object:Gem::Version
|
217
|
+
version: '2.1'
|
218
|
+
- - ">="
|
219
|
+
- !ruby/object:Gem::Version
|
220
|
+
version: 2.1.2
|
101
221
|
description: |2
|
102
222
|
Designed for those who preferred the Twee (for Twine 1) approach to source management, because the command-line is awesome,
|
103
223
|
but who want to take advantage of the new features in Twine 2.
|
@@ -118,6 +238,8 @@ files:
|
|
118
238
|
- bin/twee2
|
119
239
|
- doc/usage.txt
|
120
240
|
- lib/twee2.rb
|
241
|
+
- lib/twee2/story_file.rb
|
242
|
+
- lib/twee2/story_format.rb
|
121
243
|
- lib/twee2/version.rb
|
122
244
|
- storyFormats/Harlowe/format.js
|
123
245
|
- storyFormats/Harlowe/icon.svg
|