slideshow-models 3.0.1 → 3.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/Manifest.txt +5 -2
- data/config/slideshow.index.yml +5 -5
- data/lib/slideshow/commands/build.rb +210 -0
- data/lib/slideshow/commands/fetch.rb +0 -18
- data/lib/slideshow/commands/gen.rb +47 -179
- data/lib/slideshow/commands/manifest_finder.rb +60 -0
- data/lib/slideshow/commands/merge.rb +96 -0
- data/lib/slideshow/commands/update.rb +49 -0
- data/lib/slideshow/config.rb +1 -24
- data/lib/slideshow/filters/text_filter.rb +15 -10
- data/lib/slideshow/models.rb +4 -0
- data/lib/slideshow/version.rb +1 -1
- data/test/{test_gen.rb → test_build.rb} +9 -9
- metadata +7 -4
- data/config/slideshow.builtin.yml +0 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 203fe3dd4ab5456281b10e0a77d275df5c0f093b
|
4
|
+
data.tar.gz: f4814e971e3d9a517600c5a2f5de17cf8bcf74f9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9e764b6fab1cc4240db3ac3f7459a2c0cf3ff77812e861710681671d7cfc4efeb0ce4ee2987416af79f3cf1cb014b6555ae23db4c82a6241b0468fcf4951c297
|
7
|
+
data.tar.gz: 49c0596b58f3414dfdaef751e133ade4fc806a8739c50d637675906d24ed9132527d291b21df5ec5ce84ae8d193c8dbedf6bad2248833ae1e1c3046c0f708ed0
|
data/Manifest.txt
CHANGED
@@ -2,14 +2,17 @@ HISTORY.md
|
|
2
2
|
Manifest.txt
|
3
3
|
README.md
|
4
4
|
Rakefile
|
5
|
-
config/slideshow.builtin.yml
|
6
5
|
config/slideshow.index.yml
|
7
6
|
config/slideshow.yml
|
7
|
+
lib/slideshow/commands/build.rb
|
8
8
|
lib/slideshow/commands/fetch.rb
|
9
9
|
lib/slideshow/commands/gen.rb
|
10
10
|
lib/slideshow/commands/list.rb
|
11
|
+
lib/slideshow/commands/manifest_finder.rb
|
12
|
+
lib/slideshow/commands/merge.rb
|
11
13
|
lib/slideshow/commands/plugins.rb
|
12
14
|
lib/slideshow/commands/quick.rb
|
15
|
+
lib/slideshow/commands/update.rb
|
13
16
|
lib/slideshow/config.rb
|
14
17
|
lib/slideshow/drops.rb
|
15
18
|
lib/slideshow/filters/debug_filter.rb
|
@@ -39,7 +42,7 @@ test/samples/test.md
|
|
39
42
|
test/samples/test_content_for.md
|
40
43
|
test/templates/test/test.html
|
41
44
|
test/templates/test/test.txt
|
42
|
-
test/
|
45
|
+
test/test_build.rb
|
43
46
|
test/test_kramdown.rb
|
44
47
|
test/test_slide.rb
|
45
48
|
test/test_version.rb
|
data/config/slideshow.index.yml
CHANGED
@@ -12,7 +12,7 @@
|
|
12
12
|
# maps shortcut to URI
|
13
13
|
|
14
14
|
|
15
|
-
s6blank: https://raw.github.com/slideshow-templates/slideshow-s6-blank/
|
15
|
+
s6blank: https://raw.github.com/slideshow-templates/slideshow-s6-blank/gh-pages/s6blank.txt
|
16
16
|
|
17
17
|
s6syntax: https://raw.github.com/slideshow-templates/slideshow-s6-syntax-highlighter/master/s6syntax.txt
|
18
18
|
|
@@ -31,12 +31,12 @@ csss:
|
|
31
31
|
- https://raw.github.com/slideshow-templates/slideshow-csss/master/csss.txt.quick
|
32
32
|
|
33
33
|
deck.js:
|
34
|
-
- https://raw.github.com/slideshow-templates/slideshow-deck.js/
|
35
|
-
- https://raw.github.com/slideshow-templates/slideshow-deck.js/
|
34
|
+
- https://raw.github.com/slideshow-templates/slideshow-deck.js/gh-pages/deck.js.txt
|
35
|
+
- https://raw.github.com/slideshow-templates/slideshow-deck.js/gh-pages/deck.js.txt.quick
|
36
36
|
|
37
37
|
impress.js:
|
38
|
-
- https://raw.github.com/slideshow-templates/slideshow-impress.js/
|
39
|
-
- https://raw.github.com/slideshow-templates/slideshow-impress.js/
|
38
|
+
- https://raw.github.com/slideshow-templates/slideshow-impress.js/gh-pages/impress.js.txt
|
39
|
+
- https://raw.github.com/slideshow-templates/slideshow-impress.js/gh-pages/impress.js.txt.quick
|
40
40
|
|
41
41
|
shower: https://raw.github.com/slideshow-templates/slideshow-shower/master/shower.txt
|
42
42
|
|
@@ -0,0 +1,210 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module Slideshow
|
4
|
+
|
5
|
+
|
6
|
+
class Build
|
7
|
+
|
8
|
+
include LogUtils::Logging
|
9
|
+
|
10
|
+
|
11
|
+
def initialize( config )
|
12
|
+
@config = config
|
13
|
+
@headers = Headers.new( config )
|
14
|
+
|
15
|
+
## todo: check if we need to use expand_path - Dir.pwd always absolute (check ~/user etc.)
|
16
|
+
@usrdir = File.expand_path( Dir.pwd ) # save original (current) working directory
|
17
|
+
end
|
18
|
+
|
19
|
+
attr_reader :usrdir # original working dir (user called slideshow from)
|
20
|
+
attr_reader :config, :headers
|
21
|
+
|
22
|
+
|
23
|
+
def process_files( args )
|
24
|
+
|
25
|
+
###
|
26
|
+
# returns a hash of merged buffers e.g.
|
27
|
+
# { text: '...',
|
28
|
+
# js: '...',
|
29
|
+
# css: '...',
|
30
|
+
# }
|
31
|
+
#
|
32
|
+
|
33
|
+
buffers = {}
|
34
|
+
|
35
|
+
args.each do |fn|
|
36
|
+
|
37
|
+
dirname = File.dirname( fn )
|
38
|
+
basename = File.basename( fn, '.*' )
|
39
|
+
extname = File.extname( fn )
|
40
|
+
|
41
|
+
logger.debug "dirname=#{dirname}, basename=#{basename}, extname=#{extname}"
|
42
|
+
|
43
|
+
content = File.read_utf8( fn )
|
44
|
+
|
45
|
+
if extname.downcase == 'css'
|
46
|
+
key = :css # buffer key
|
47
|
+
elsif extname.downcase == 'js'
|
48
|
+
key = :js
|
49
|
+
else ## assume main text/content
|
50
|
+
##
|
51
|
+
## todo/check: process text files with gen(erator) one-by-one later? why? why not?
|
52
|
+
# for now process as one block all together (use sourcedir of first text file)
|
53
|
+
key = :text
|
54
|
+
end
|
55
|
+
|
56
|
+
if buffers[ key ].nil? ## first entry
|
57
|
+
h = { contents: [content],
|
58
|
+
files: [fn],
|
59
|
+
}
|
60
|
+
buffers[ key ] = h
|
61
|
+
else ## second, third, etc. entry
|
62
|
+
h = buffers[ key ]
|
63
|
+
h[:contents] << content
|
64
|
+
h[:files] << fn
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
buffers
|
69
|
+
end # process files
|
70
|
+
|
71
|
+
|
72
|
+
def create_slideshow( args )
|
73
|
+
|
74
|
+
## first check if manifest exists / available / valid
|
75
|
+
manifestsrc = ManifestFinder.new( config ).find_manifestsrc( config.manifest )
|
76
|
+
|
77
|
+
|
78
|
+
# expand output path in current dir and make sure output path exists
|
79
|
+
outdir = File.expand_path( config.output_path, usrdir )
|
80
|
+
logger.debug "setting outdir to >#{outdir}<"
|
81
|
+
|
82
|
+
FileUtils.makedirs( outdir ) unless File.directory? outdir
|
83
|
+
|
84
|
+
|
85
|
+
if args.is_a? String
|
86
|
+
args = [args] ## for now for testing always assume array
|
87
|
+
end
|
88
|
+
|
89
|
+
buffers = process_files( args )
|
90
|
+
|
91
|
+
puts "buffers:"
|
92
|
+
pp buffers
|
93
|
+
|
94
|
+
|
95
|
+
### todo/fix:
|
96
|
+
## reset headers too - why? why not?
|
97
|
+
|
98
|
+
# shared variables for templates (binding)
|
99
|
+
content_for = {} # reset content_for hash
|
100
|
+
# give helpers/plugins a session-like hash
|
101
|
+
session = {} # reset session hash for plugins/helpers
|
102
|
+
|
103
|
+
name = 'untitled' ## default name (auto-detect from first file e.g. rest.txt => rest etc.)
|
104
|
+
|
105
|
+
content = ''
|
106
|
+
|
107
|
+
## check for css and js buffers
|
108
|
+
## todo/fix: check if content_for key is a symbol or just a string !!!!!!
|
109
|
+
if buffers[:css]
|
110
|
+
## concat files (separate with newlines)
|
111
|
+
content_for[:css] = buffers[:css][:contents].join( "\n\n" )
|
112
|
+
end
|
113
|
+
|
114
|
+
if buffers[:js]
|
115
|
+
## concat files (separate with newlines)
|
116
|
+
content_for[:js] = buffers[:js][:contents].join( "\n\n" )
|
117
|
+
end
|
118
|
+
|
119
|
+
|
120
|
+
gen = Gen.new( @config,
|
121
|
+
@headers,
|
122
|
+
session,
|
123
|
+
content_for )
|
124
|
+
|
125
|
+
chunk_size = buffers[:text] ? buffers[:text][:contents].size : 0
|
126
|
+
|
127
|
+
(0...chunk_size).each do |i|
|
128
|
+
|
129
|
+
chunk = buffers[:text][:contents][i]
|
130
|
+
fn = buffers[:text][:files][i]
|
131
|
+
|
132
|
+
dirname = File.dirname( fn )
|
133
|
+
basename = File.basename( fn, '.*' )
|
134
|
+
extname = File.extname( fn )
|
135
|
+
logger.debug "dirname=#{dirname}, basename=#{basename}, extname=#{extname}"
|
136
|
+
|
137
|
+
## for now use first text file for (auto-)caluclation name and source folder
|
138
|
+
if i==0
|
139
|
+
name = basename
|
140
|
+
puts "Preparing slideshow '#{basename}'..."
|
141
|
+
end
|
142
|
+
|
143
|
+
puts " [#{i+1}/#{chunk_size}] Generating '#{basename}' (#{dirname})..."
|
144
|
+
|
145
|
+
|
146
|
+
# change working dir to sourcefile dir
|
147
|
+
# todo: add a -c option to commandline? to let you set cwd?
|
148
|
+
|
149
|
+
srcdir = File.expand_path( dirname, usrdir )
|
150
|
+
logger.debug "setting srcdir to >#{srcdir}<"
|
151
|
+
|
152
|
+
logger.debug "changing cwd to src - new >#{srcdir}<, old >#{Dir.pwd}<"
|
153
|
+
Dir.chdir srcdir
|
154
|
+
|
155
|
+
|
156
|
+
####################
|
157
|
+
## todo/fix: move ctx to Gen.initialize - why? why not?
|
158
|
+
# move outdir, usrdir, name to Gen.initialize ??
|
159
|
+
# add basename, dirname ?
|
160
|
+
gen_ctx = {
|
161
|
+
name: name,
|
162
|
+
srcdir: srcdir,
|
163
|
+
outdir: outdir,
|
164
|
+
usrdir: usrdir,
|
165
|
+
}
|
166
|
+
|
167
|
+
chunk = gen.render( chunk, gen_ctx )
|
168
|
+
|
169
|
+
if i==0 ## first chunk
|
170
|
+
content << chunk
|
171
|
+
else ## follow-up chunk (start off with two newlines)
|
172
|
+
content << "\n\n"
|
173
|
+
content << chunk
|
174
|
+
end
|
175
|
+
end # each buffer.text.contents
|
176
|
+
|
177
|
+
|
178
|
+
logger.debug "restoring cwd to usr - new >#{usrdir}<, old >#{Dir.pwd}<"
|
179
|
+
Dir.chdir( usrdir )
|
180
|
+
|
181
|
+
|
182
|
+
# post-processing (all-in-one HTML with directive as HTML comments)
|
183
|
+
deck = Deck.new( content, header_level: config.header_level,
|
184
|
+
use_slide: config.slide? )
|
185
|
+
|
186
|
+
|
187
|
+
## note: merge for now requires resetting to
|
188
|
+
## original working dir (user called slideshow from)
|
189
|
+
merge = Merge.new( config )
|
190
|
+
|
191
|
+
merge_ctx = {
|
192
|
+
manifestsrc: manifestsrc,
|
193
|
+
outdir: outdir,
|
194
|
+
name: name,
|
195
|
+
}
|
196
|
+
|
197
|
+
merge.merge( deck,
|
198
|
+
merge_ctx,
|
199
|
+
headers,
|
200
|
+
content_for )
|
201
|
+
|
202
|
+
|
203
|
+
puts 'Done.'
|
204
|
+
end # method create_slideshow
|
205
|
+
|
206
|
+
|
207
|
+
end # class Build
|
208
|
+
|
209
|
+
end # class Slideshow
|
210
|
+
|
@@ -21,24 +21,6 @@ class Fetch
|
|
21
21
|
end
|
22
22
|
|
23
23
|
|
24
|
-
def update # update shortcut index
|
25
|
-
dest = config.shortcut_index_file
|
26
|
-
|
27
|
-
destfull = File.expand_path( dest )
|
28
|
-
destpath = File.dirname( destfull )
|
29
|
-
FileUtils.makedirs( destpath ) unless File.directory?( destpath )
|
30
|
-
|
31
|
-
logger.debug "destfull=>#{destfull}<"
|
32
|
-
logger.debug "destpath=>#{destpath}<"
|
33
|
-
|
34
|
-
## todo/fix: use a config setting for index url (do NOT hard core)
|
35
|
-
src = 'https://raw.github.com/slideshow-s9/registry/master/slideshow.index.yml'
|
36
|
-
|
37
|
-
puts "Updating shortcut index - downloading '#{src}'..."
|
38
|
-
::Fetcher::Worker.new.copy( src, destfull )
|
39
|
-
end
|
40
|
-
|
41
|
-
|
42
24
|
def fetch( shortcut_or_source )
|
43
25
|
|
44
26
|
logger.debug "fetch >#{shortcut_or_source}<"
|
@@ -5,29 +5,61 @@ module Slideshow
|
|
5
5
|
## fix:/todo: move generation code out of command into its own class
|
6
6
|
## not residing/depending on cli
|
7
7
|
|
8
|
-
class Gen
|
8
|
+
class Gen ## rename to GenCtx (Context) - why? why not?
|
9
9
|
|
10
10
|
include LogUtils::Logging
|
11
11
|
|
12
|
-
include ManifestHelper
|
13
12
|
|
14
|
-
|
15
|
-
|
16
|
-
@
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
@usrdir = File.expand_path( Dir.pwd ) # save original (current) working directory
|
13
|
+
def initialize( config, headers, session={}, content_for={} )
|
14
|
+
@config = config
|
15
|
+
@headers = headers
|
16
|
+
|
17
|
+
@session = session
|
18
|
+
@content_for = content_for
|
21
19
|
end
|
22
20
|
|
21
|
+
attr_reader :config, :headers
|
22
|
+
attr_reader :session # give helpers/plugins a session-like hash
|
23
|
+
|
24
|
+
## todo/check: usrdir needed for something (e.g. why keep it?) - remove? why? why not??
|
23
25
|
attr_reader :usrdir # original working dir (user called slideshow from)
|
24
|
-
attr_reader :srcdir, :outdir
|
26
|
+
attr_reader :srcdir, :outdir # NB: "initalized" in create_slideshow
|
27
|
+
|
28
|
+
|
29
|
+
def render( content, ctx )
|
30
|
+
|
31
|
+
####################
|
32
|
+
## todo/fix: move ctx to Gen.initialize - why? why not?
|
33
|
+
@name = ctx[:name]
|
34
|
+
|
35
|
+
@outdir = ctx[:outdir]
|
36
|
+
@srcdir = ctx[:srcdir]
|
37
|
+
@usrdir = ctx[:usrdir]
|
38
|
+
|
39
|
+
# run text filters
|
40
|
+
|
41
|
+
config.text_filters.each do |filter|
|
42
|
+
mn = filter.tr( '-', '_' ).to_sym # construct method name (mn)
|
43
|
+
puts " run filter #{mn}..."
|
44
|
+
content = send( mn, content ) # call filter e.g. include_helper_hack( content )
|
45
|
+
end
|
46
|
+
|
47
|
+
if config.takahashi?
|
48
|
+
content = takahashi_slide_breaks( content )
|
49
|
+
end
|
50
|
+
|
51
|
+
# convert light-weight markup to hypertext
|
52
|
+
|
53
|
+
content = markdown_to_html( content )
|
54
|
+
content
|
55
|
+
end # method render
|
25
56
|
|
26
57
|
|
27
|
-
attr_reader :config, :headers
|
28
|
-
attr_reader :session # give helpers/plugins a session-like hash
|
29
58
|
|
30
|
-
|
59
|
+
###
|
60
|
+
# some markdown guard helpers
|
61
|
+
# (e.g. guard text/mark text for do NOT convert)
|
62
|
+
|
31
63
|
def guard_text( text )
|
32
64
|
# todo/fix 2: note we need to differentiate between blocks and inline
|
33
65
|
# thus, to avoid runs - use guard_block (add a leading newline to avoid getting include in block that goes before)
|
@@ -56,171 +88,7 @@ class Gen ## todo: rename command to build
|
|
56
88
|
end
|
57
89
|
|
58
90
|
|
59
|
-
def create_slideshow( fn )
|
60
|
-
|
61
|
-
manifest_path_or_name = config.manifest
|
62
|
-
|
63
|
-
# add .txt file extension if missing (for convenience)
|
64
|
-
if manifest_path_or_name.downcase.ends_with?( '.txt' ) == false
|
65
|
-
manifest_path_or_name << '.txt'
|
66
|
-
end
|
67
|
-
|
68
|
-
logger.debug "manifest=#{manifest_path_or_name}"
|
69
|
-
|
70
|
-
# check if file exists (if yes use custom template package!) - allows you to override builtin package with same name
|
71
|
-
if File.exists?( manifest_path_or_name )
|
72
|
-
manifestsrc = manifest_path_or_name
|
73
|
-
else
|
74
|
-
# check for builtin manifests
|
75
|
-
manifests = installed_template_manifests
|
76
|
-
matches = manifests.select { |m| m[0] == manifest_path_or_name }
|
77
|
-
|
78
|
-
if matches.empty?
|
79
|
-
puts "*** error: unknown template manifest '#{manifest_path_or_name}'"
|
80
|
-
# todo: list installed manifests
|
81
|
-
exit 2
|
82
|
-
end
|
83
|
-
|
84
|
-
manifestsrc = matches[0][1]
|
85
|
-
end
|
86
|
-
|
87
|
-
### todo: use File.expand_path( xx, relative_to ) always with second arg
|
88
|
-
## do NOT default to cwd (because cwd will change!)
|
89
|
-
|
90
|
-
# Reference src with absolute path, because this can be used with different pwd
|
91
|
-
manifestsrc = File.expand_path( manifestsrc, usrdir )
|
92
|
-
|
93
|
-
# expand output path in current dir and make sure output path exists
|
94
|
-
@outdir = File.expand_path( config.output_path, usrdir )
|
95
|
-
logger.debug "setting outdir to >#{outdir}<"
|
96
|
-
FileUtils.makedirs( outdir ) unless File.directory? outdir
|
97
|
-
|
98
|
-
dirname = File.dirname( fn )
|
99
|
-
basename = File.basename( fn, '.*' )
|
100
|
-
extname = File.extname( fn )
|
101
|
-
logger.debug "dirname=#{dirname}, basename=#{basename}, extname=#{extname}"
|
102
|
-
|
103
|
-
# change working dir to sourcefile dir
|
104
|
-
# todo: add a -c option to commandline? to let you set cwd?
|
105
|
-
|
106
|
-
@srcdir = File.expand_path( dirname, usrdir )
|
107
|
-
logger.debug "setting srcdir to >#{srcdir}<"
|
108
|
-
|
109
|
-
unless usrdir == srcdir
|
110
|
-
logger.debug "changing cwd to src - new >#{srcdir}<, old >#{Dir.pwd}<"
|
111
|
-
Dir.chdir srcdir
|
112
|
-
end
|
113
|
-
|
114
|
-
puts "Preparing slideshow '#{basename}'..."
|
115
|
-
|
116
|
-
### todo/fix:
|
117
|
-
## reset headers too - why? why not?
|
118
|
-
|
119
|
-
# shared variables for templates (binding)
|
120
|
-
@content_for = {} # reset content_for hash
|
121
|
-
|
122
|
-
@name = basename
|
123
|
-
@extname = extname
|
124
|
-
|
125
|
-
@session = {} # reset session hash for plugins/helpers
|
126
|
-
|
127
|
-
inname = "#{basename}#{extname}"
|
128
|
-
|
129
|
-
logger.debug "inname=#{inname}"
|
130
|
-
|
131
|
-
content = File.read_utf8( inname )
|
132
|
-
|
133
|
-
# run text filters
|
134
|
-
|
135
|
-
config.text_filters.each do |filter|
|
136
|
-
mn = filter.tr( '-', '_' ).to_sym # construct method name (mn)
|
137
|
-
puts " run filter #{mn}..."
|
138
|
-
content = send( mn, content ) # call filter e.g. include_helper_hack( content )
|
139
|
-
end
|
140
|
-
|
141
|
-
|
142
|
-
if config.takahashi?
|
143
|
-
content = takahashi_slide_breaks( content )
|
144
|
-
end
|
145
|
-
|
146
|
-
|
147
|
-
# convert light-weight markup to hypertext
|
148
|
-
|
149
|
-
content = markdown_to_html( content )
|
150
|
-
|
151
|
-
|
152
|
-
# post-processing
|
153
|
-
deck = Deck.new( content, header_level: config.header_level,
|
154
|
-
use_slide: config.slide? )
|
155
|
-
|
156
|
-
|
157
|
-
### todo/fix: move merge to its own
|
158
|
-
## class e.g. commands/merge.rb or something
|
159
|
-
## or use Merger - why? why not?
|
160
|
-
|
161
|
-
|
162
|
-
#### pak merge
|
163
|
-
# nb: change cwd to template pak root
|
164
|
-
|
165
|
-
@pakdir = File.dirname( manifestsrc ) # template pak root - make availabe too in erb via binding
|
166
|
-
logger.debug " setting pakdir to >#{pakdir}<"
|
167
|
-
|
168
|
-
# todo/fix: change current work dir (cwd) in pakman gem itself
|
169
|
-
# for now lets do it here
|
170
|
-
|
171
|
-
logger.debug "changing cwd to pak - new >#{pakdir}<, old >#{Dir.pwd}<"
|
172
|
-
Dir.chdir( pakdir )
|
173
|
-
|
174
|
-
|
175
|
-
pakpath = outdir
|
176
|
-
|
177
|
-
logger.debug( "manifestsrc >#{manifestsrc}<, pakpath >#{pakpath}<" )
|
178
|
-
|
179
|
-
###########################################
|
180
|
-
## fix: !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
181
|
-
## todo: setup hash for binding
|
182
|
-
ctx = { 'name' => @name,
|
183
|
-
'headers' => HeadersDrop.new( @headers ),
|
184
|
-
'content' => deck.content,
|
185
|
-
'slides' => deck.slides.map { |slide| SlideDrop.new(slide) }, # strutured content - use LiquidDrop - why? why not?
|
186
|
-
## todo/fix: add content_for hash
|
187
|
-
## and some more -- ??
|
188
|
-
}
|
189
|
-
|
190
|
-
## add content_for entries e.g.
|
191
|
-
## content_for :js => more_content_for_js or content_for_js or extra_js etc.
|
192
|
-
## for now allow all three aliases
|
193
|
-
|
194
|
-
puts "content_for:"
|
195
|
-
pp @content_for
|
196
|
-
|
197
|
-
@content_for.each do |k,v|
|
198
|
-
puts " (auto-)add content_for >#{k.to_s}< to ctx:"
|
199
|
-
puts v
|
200
|
-
ctx[ "more_content_for_#{k}"] = v
|
201
|
-
ctx[ "content_for_#{k}" ] = v
|
202
|
-
ctx[ "extra_#{k}" ] = v
|
203
|
-
end
|
204
|
-
|
205
|
-
puts "ctx:"
|
206
|
-
pp ctx
|
207
|
-
|
208
|
-
|
209
|
-
Pakman::LiquidTemplater.new.merge_pak( manifestsrc, pakpath, ctx, basename )
|
210
|
-
|
211
|
-
logger.debug "restoring cwd to src - new >#{srcdir}<, old >#{Dir.pwd}<"
|
212
|
-
Dir.chdir( srcdir )
|
213
|
-
|
214
|
-
## pop/restore org (original) working folder/dir
|
215
|
-
unless usrdir == srcdir
|
216
|
-
logger.debug "restoring cwd to usr - new >#{usrdir}<, old >#{Dir.pwd}<"
|
217
|
-
Dir.chdir( usrdir )
|
218
|
-
end
|
219
|
-
|
220
|
-
puts "Done."
|
221
|
-
end # method create_slideshow
|
222
|
-
|
223
|
-
|
224
91
|
end # class Gen
|
225
92
|
|
226
|
-
end # class Slideshow
|
93
|
+
end # class Slideshow
|
94
|
+
|
@@ -0,0 +1,60 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module Slideshow
|
4
|
+
|
5
|
+
class ManifestFinder
|
6
|
+
|
7
|
+
include LogUtils::Logging
|
8
|
+
|
9
|
+
include ManifestHelper
|
10
|
+
|
11
|
+
|
12
|
+
def initialize( config )
|
13
|
+
@config = config
|
14
|
+
@usrdir = File.expand_path( Dir.pwd ) # save original (current) working directory
|
15
|
+
end
|
16
|
+
|
17
|
+
attr_reader :config
|
18
|
+
attr_reader :usrdir # original working dir (user called slideshow from)
|
19
|
+
|
20
|
+
|
21
|
+
def find_manifestsrc( manifest_arg ) ## rename - just use find_manifest ??
|
22
|
+
|
23
|
+
manifest_path_or_name = manifest_arg.dup ## make a copy
|
24
|
+
|
25
|
+
# add .txt file extension if missing (for convenience)
|
26
|
+
if manifest_path_or_name.downcase.ends_with?( '.txt' ) == false
|
27
|
+
manifest_path_or_name << '.txt'
|
28
|
+
end
|
29
|
+
|
30
|
+
logger.debug "manifest=#{manifest_path_or_name}"
|
31
|
+
|
32
|
+
# check if file exists (if yes use custom template package!) - allows you to override builtin package with same name
|
33
|
+
if File.exists?( manifest_path_or_name )
|
34
|
+
manifestsrc = manifest_path_or_name
|
35
|
+
else
|
36
|
+
# check for builtin manifests
|
37
|
+
manifests = installed_template_manifests
|
38
|
+
matches = manifests.select { |m| m[0] == manifest_path_or_name }
|
39
|
+
|
40
|
+
if matches.empty?
|
41
|
+
puts "*** error: unknown template manifest '#{manifest_path_or_name}'"
|
42
|
+
# todo: list installed manifests
|
43
|
+
exit 2
|
44
|
+
end
|
45
|
+
|
46
|
+
manifestsrc = matches[0][1]
|
47
|
+
end
|
48
|
+
|
49
|
+
### todo: use File.expand_path( xx, relative_to ) always with second arg
|
50
|
+
## do NOT default to cwd (because cwd will change!)
|
51
|
+
|
52
|
+
# Reference src with absolute path, because this can be used with different pwd
|
53
|
+
manifestsrc = File.expand_path( manifestsrc, usrdir )
|
54
|
+
manifestsrc
|
55
|
+
end
|
56
|
+
|
57
|
+
|
58
|
+
end # class ManifestFinder
|
59
|
+
|
60
|
+
end # class Slideshow
|
@@ -0,0 +1,96 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module Slideshow
|
4
|
+
|
5
|
+
|
6
|
+
class Merge
|
7
|
+
|
8
|
+
include LogUtils::Logging
|
9
|
+
|
10
|
+
|
11
|
+
def initialize( config )
|
12
|
+
@config = config
|
13
|
+
|
14
|
+
## todo: check if we need to use expand_path - Dir.pwd always absolute (check ~/user etc.)
|
15
|
+
@usrdir = File.expand_path( Dir.pwd ) # save original (current) working directory
|
16
|
+
end
|
17
|
+
|
18
|
+
attr_reader :config
|
19
|
+
attr_reader :usrdir # original working dir (user called slideshow from)
|
20
|
+
|
21
|
+
|
22
|
+
def merge( deck, ctx, headers, content_for )
|
23
|
+
|
24
|
+
manifestsrc = ctx[:manifestsrc]
|
25
|
+
name = ctx[:name]
|
26
|
+
outdir = ctx[:outdir]
|
27
|
+
|
28
|
+
## note:
|
29
|
+
## assumes name == basename (e.g. name without extension and directory)
|
30
|
+
## rename name to basename - why? why not??
|
31
|
+
|
32
|
+
## note: assumes working directory is (default) work directory
|
33
|
+
## e.g. original working dir (user called slideshow from)
|
34
|
+
|
35
|
+
|
36
|
+
puts "Merging slideshow '#{name}'..."
|
37
|
+
|
38
|
+
|
39
|
+
#### pak merge
|
40
|
+
# nb: change cwd to template pak root
|
41
|
+
|
42
|
+
@pakdir = File.dirname( manifestsrc ) # template pak root - make availabe too in erb via binding
|
43
|
+
logger.debug " setting pakdir to >#{@pakdir}<"
|
44
|
+
|
45
|
+
# todo/fix: change current work dir (cwd) in pakman gem itself
|
46
|
+
# for now lets do it here
|
47
|
+
|
48
|
+
logger.debug "changing cwd to pak - new >#{@pakdir}<, old >#{Dir.pwd}<"
|
49
|
+
Dir.chdir( @pakdir )
|
50
|
+
|
51
|
+
|
52
|
+
logger.debug( "manifestsrc >#{manifestsrc}<, outdir >#{outdir}<" )
|
53
|
+
|
54
|
+
|
55
|
+
###########################################
|
56
|
+
## setup hash for binding
|
57
|
+
assigns = { 'name' => name,
|
58
|
+
'headers' => HeadersDrop.new( headers ),
|
59
|
+
'content' => deck.content,
|
60
|
+
'slides' => deck.slides.map { |slide| SlideDrop.new(slide) }, # strutured content - use LiquidDrop - why? why not?
|
61
|
+
}
|
62
|
+
|
63
|
+
## add content_for entries e.g.
|
64
|
+
## content_for :js => more_content_for_js or content_for_js or extra_js etc.
|
65
|
+
## for now allow all three aliases
|
66
|
+
|
67
|
+
puts "content_for:"
|
68
|
+
pp content_for
|
69
|
+
|
70
|
+
content_for.each do |k,v|
|
71
|
+
puts " (auto-)add content_for >#{k.to_s}< to ctx:"
|
72
|
+
puts v
|
73
|
+
assigns[ "more_content_for_#{k}"] = v
|
74
|
+
assigns[ "content_for_#{k}" ] = v
|
75
|
+
assigns[ "extra_#{k}" ] = v
|
76
|
+
end
|
77
|
+
|
78
|
+
puts "assigns:"
|
79
|
+
pp assigns
|
80
|
+
|
81
|
+
|
82
|
+
Pakman::LiquidTemplater.new.merge_pak( manifestsrc, outdir, assigns, name )
|
83
|
+
|
84
|
+
|
85
|
+
## pop/restore org (original) working folder/dir
|
86
|
+
unless usrdir == @pakdir
|
87
|
+
logger.debug "restoring cwd to usr - new >#{usrdir}<, old >#{Dir.pwd}<"
|
88
|
+
Dir.chdir( usrdir )
|
89
|
+
end
|
90
|
+
end # method merge
|
91
|
+
|
92
|
+
|
93
|
+
|
94
|
+
end # class Merge
|
95
|
+
|
96
|
+
end # class Slideshow
|
@@ -0,0 +1,49 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module Slideshow
|
4
|
+
|
5
|
+
|
6
|
+
###
|
7
|
+
# update/fetch shortcut/registry slideshow.index.yml
|
8
|
+
#
|
9
|
+
|
10
|
+
# todo/why/why not??
|
11
|
+
# - *ALWAYS* fetch index before an "online" fetch operation?
|
12
|
+
# why cache or use built-in version?
|
13
|
+
# use cached/built-in version only as fallback?
|
14
|
+
|
15
|
+
|
16
|
+
|
17
|
+
class Update
|
18
|
+
|
19
|
+
|
20
|
+
include LogUtils::Logging
|
21
|
+
|
22
|
+
def initialize( config )
|
23
|
+
@config = config
|
24
|
+
end
|
25
|
+
|
26
|
+
attr_reader :config
|
27
|
+
|
28
|
+
|
29
|
+
def update # update shortcut index
|
30
|
+
dest = config.shortcut_index_file
|
31
|
+
|
32
|
+
destfull = File.expand_path( dest )
|
33
|
+
destpath = File.dirname( destfull )
|
34
|
+
FileUtils.makedirs( destpath ) unless File.directory?( destpath )
|
35
|
+
|
36
|
+
logger.debug "destfull=>#{destfull}<"
|
37
|
+
logger.debug "destpath=>#{destpath}<"
|
38
|
+
|
39
|
+
## todo/fix: use a config setting for index url (do NOT hard core)
|
40
|
+
src = 'https://raw.github.com/slideshow-s9/registry/master/slideshow.index.yml'
|
41
|
+
|
42
|
+
puts "Updating shortcut index - downloading '#{src}'..."
|
43
|
+
::Fetcher::Worker.new.copy( src, destfull )
|
44
|
+
end
|
45
|
+
|
46
|
+
end # class Update
|
47
|
+
|
48
|
+
end # module Slideshow
|
49
|
+
|
data/lib/slideshow/config.rb
CHANGED
@@ -111,12 +111,6 @@ class Config
|
|
111
111
|
def load
|
112
112
|
|
113
113
|
# load builtin config file @ <gem>/config/slideshow.yml
|
114
|
-
#
|
115
|
-
# NB: builtin use a different hierachy (not linked to default/home/user/cli props)
|
116
|
-
# for now builtin has no erb processing
|
117
|
-
# user cannot override builtin settings (only defaults see below)
|
118
|
-
props_builtin_file = File.join( Slideshow.root, 'config', 'slideshow.builtin.yml' )
|
119
|
-
@props_builtin = Props.load_file( props_builtin_file )
|
120
114
|
|
121
115
|
props_default_file = File.join( Slideshow.root, 'config', 'slideshow.yml' )
|
122
116
|
@props = @props_default = Props.load_file_with_erb( props_default_file, binding() )
|
@@ -141,9 +135,9 @@ class Config
|
|
141
135
|
load_shortcuts
|
142
136
|
end
|
143
137
|
|
138
|
+
|
144
139
|
def dump # dump settings for debugging
|
145
140
|
puts "Slideshow settings:"
|
146
|
-
@props_builtin.dump if @props_builtin
|
147
141
|
@props_default.dump if @props_default
|
148
142
|
@props_home.dump if @props_home
|
149
143
|
@props_work.dump if @props_work
|
@@ -170,23 +164,6 @@ class Config
|
|
170
164
|
@props.fetch_from_section( 'analytics', 'google', nil )
|
171
165
|
end
|
172
166
|
|
173
|
-
def helper_renames
|
174
|
-
## NB: for now user cannot override/extent renames
|
175
|
-
@props_builtin['helper']['renames']
|
176
|
-
end
|
177
|
-
|
178
|
-
def helper_unparsed
|
179
|
-
## NB: for now user cannot override/extent unparsed helpers
|
180
|
-
# use unparsed params (passed along a single string)
|
181
|
-
@props_builtin['helper']['unparsed']
|
182
|
-
end
|
183
|
-
|
184
|
-
def helper_exprs
|
185
|
-
## NB: for now user cannot override/extent helper exprs
|
186
|
-
# allow expression as directives (no need for %end block)
|
187
|
-
# by default directives are assumed statements (e.g. %mydir %end)
|
188
|
-
@props_builtin['helper']['exprs']
|
189
|
-
end
|
190
167
|
|
191
168
|
private
|
192
169
|
|
@@ -11,6 +11,11 @@ module Slideshow
|
|
11
11
|
include TextUtils::Filter # include comments_percent_style, skip_end_directive, etc. filters
|
12
12
|
|
13
13
|
|
14
|
+
DIRECTIVES_UNPARSED = [ 'slide', 'style' ]
|
15
|
+
DIRECTIVES_RENAMES = [ 'include', 'class' ]
|
16
|
+
DIRECTIVES_EXPRS = [ 'class', 'clear' ]
|
17
|
+
|
18
|
+
|
14
19
|
def directives_bang_style_to_percent_style( content )
|
15
20
|
|
16
21
|
# for compatibility allow !SLIDE/!STYLE as an alternative to %slide/%style-directive
|
@@ -18,18 +23,19 @@ def directives_bang_style_to_percent_style( content )
|
|
18
23
|
bang_count = 0
|
19
24
|
|
20
25
|
# get unparsed helpers e.g. SLIDE|STYLE
|
21
|
-
unparsed =
|
26
|
+
unparsed = DIRECTIVES_UNPARSED.map { |item| item.upcase }.join( '|' )
|
22
27
|
|
23
28
|
content.gsub!(/^!(#{unparsed})(.*)$/) do |match|
|
24
29
|
bang_count += 1
|
25
30
|
"<%= #{$1.downcase} '#{$2 ? $2 : ''}' %>"
|
26
31
|
end
|
27
32
|
|
28
|
-
puts " Patching !-directives (#{bang_count} #{
|
33
|
+
puts " Patching !-directives (#{bang_count} #{DIRECTIVES_UNPARSED.join('/')}-directives)..."
|
29
34
|
|
30
35
|
content
|
31
36
|
end
|
32
37
|
|
38
|
+
|
33
39
|
def directives_percent_style( content )
|
34
40
|
|
35
41
|
directive_unparsed = 0
|
@@ -51,11 +57,10 @@ def directives_percent_style( content )
|
|
51
57
|
|
52
58
|
logger.debug "processing %-directive: #{directive}"
|
53
59
|
|
54
|
-
# slide, style
|
55
|
-
if config.helper_unparsed.include?( directive )
|
60
|
+
if DIRECTIVES_UNPARSED.include?( directive ) # e.g. slide, style, etc.
|
56
61
|
directive_unparsed += 1
|
57
62
|
content2 << "<%= #{directive} '#{params ? params : ''}' %>"
|
58
|
-
elsif
|
63
|
+
elsif DIRECTIVES_EXPRS.include?( directive ) # e.g. class, clear, etc.
|
59
64
|
directive_expr += 1
|
60
65
|
content2 << "<%= #{directive} #{params ? erb_simple_params(directive,params) : ''} %>"
|
61
66
|
elsif inside_helper && directive == 'end'
|
@@ -83,15 +88,15 @@ def directives_percent_style( content )
|
|
83
88
|
end
|
84
89
|
|
85
90
|
puts " Preparing %-directives (" +
|
86
|
-
"#{directive_unparsed} #{
|
87
|
-
"#{directive_expr} #{
|
91
|
+
"#{directive_unparsed} #{DIRECTIVES_UNPARSED.join('/')} directives, " +
|
92
|
+
"#{directive_expr} #{DIRECTIVES_EXPRS.join('/')} expr-directives, " +
|
88
93
|
"#{directive_block_beg}/#{directive_block_end} block-directives)..."
|
89
94
|
|
90
95
|
content2
|
91
96
|
end
|
92
97
|
|
93
98
|
######################
|
94
|
-
# todo: fix move to textutils gem (including helpers and config)
|
99
|
+
# todo: fix move to textutils gem (including helpers and config) - why? why not??
|
95
100
|
#
|
96
101
|
|
97
102
|
|
@@ -102,14 +107,14 @@ end
|
|
102
107
|
|
103
108
|
# turn renames into something like:
|
104
109
|
# include|class etc.
|
105
|
-
renames =
|
110
|
+
renames = DIRECTIVES_RENAMES.join( '|' )
|
106
111
|
|
107
112
|
content.gsub!( /<%=[ \t]*(#{renames})/ ) do |match|
|
108
113
|
rename_counter += 1
|
109
114
|
"<%= s9_#{$1}"
|
110
115
|
end
|
111
116
|
|
112
|
-
puts " Patching embedded Ruby (erb) code for aliases (#{rename_counter} #{
|
117
|
+
puts " Patching embedded Ruby (erb) code for aliases (#{rename_counter} #{DIRECTIVES_RENAMES.join('/')}-aliases)..."
|
113
118
|
|
114
119
|
content
|
115
120
|
end
|
data/lib/slideshow/models.rb
CHANGED
@@ -46,8 +46,12 @@ require 'slideshow/models/deck'
|
|
46
46
|
require 'slideshow/markdown'
|
47
47
|
require 'slideshow/drops'
|
48
48
|
|
49
|
+
require 'slideshow/commands/manifest_finder'
|
49
50
|
require 'slideshow/commands/fetch'
|
51
|
+
require 'slideshow/commands/update'
|
50
52
|
require 'slideshow/commands/gen'
|
53
|
+
require 'slideshow/commands/merge'
|
54
|
+
require 'slideshow/commands/build'
|
51
55
|
require 'slideshow/commands/list'
|
52
56
|
require 'slideshow/commands/plugins'
|
53
57
|
require 'slideshow/commands/quick'
|
data/lib/slideshow/version.rb
CHANGED
@@ -2,15 +2,15 @@
|
|
2
2
|
|
3
3
|
###
|
4
4
|
# to run use
|
5
|
-
# ruby -I ./lib -I ./test test/
|
5
|
+
# ruby -I ./lib -I ./test test/test_build.rb
|
6
6
|
|
7
7
|
|
8
8
|
require 'helper'
|
9
9
|
|
10
10
|
|
11
|
-
class
|
11
|
+
class TestBuild < MiniTest::Test
|
12
12
|
|
13
|
-
def
|
13
|
+
def test_build_test
|
14
14
|
|
15
15
|
opts = Slideshow::Opts.new
|
16
16
|
|
@@ -23,14 +23,14 @@ def test_gen_test
|
|
23
23
|
config.load
|
24
24
|
config.dump
|
25
25
|
|
26
|
-
g = Slideshow::
|
26
|
+
g = Slideshow::Build.new( config )
|
27
27
|
g.create_slideshow( "#{Slideshow.root}/test/samples/test.md" )
|
28
28
|
|
29
29
|
assert true
|
30
|
-
end # method
|
30
|
+
end # method test_build
|
31
31
|
|
32
32
|
|
33
|
-
def
|
33
|
+
def test_build_test_content_for
|
34
34
|
|
35
35
|
opts = Slideshow::Opts.new
|
36
36
|
|
@@ -43,12 +43,12 @@ def test_gen_test_content_for
|
|
43
43
|
config.load
|
44
44
|
config.dump
|
45
45
|
|
46
|
-
g = Slideshow::
|
46
|
+
g = Slideshow::Build.new( config )
|
47
47
|
g.create_slideshow( "#{Slideshow.root}/test/samples/test_content_for.md" )
|
48
48
|
|
49
49
|
assert true
|
50
|
-
end # method
|
50
|
+
end # method test_build
|
51
51
|
|
52
52
|
|
53
|
-
end # class
|
53
|
+
end # class TestBuild
|
54
54
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: slideshow-models
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.0.
|
4
|
+
version: 3.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Gerald Bauer
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-05-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: props
|
@@ -135,14 +135,17 @@ files:
|
|
135
135
|
- Manifest.txt
|
136
136
|
- README.md
|
137
137
|
- Rakefile
|
138
|
-
- config/slideshow.builtin.yml
|
139
138
|
- config/slideshow.index.yml
|
140
139
|
- config/slideshow.yml
|
140
|
+
- lib/slideshow/commands/build.rb
|
141
141
|
- lib/slideshow/commands/fetch.rb
|
142
142
|
- lib/slideshow/commands/gen.rb
|
143
143
|
- lib/slideshow/commands/list.rb
|
144
|
+
- lib/slideshow/commands/manifest_finder.rb
|
145
|
+
- lib/slideshow/commands/merge.rb
|
144
146
|
- lib/slideshow/commands/plugins.rb
|
145
147
|
- lib/slideshow/commands/quick.rb
|
148
|
+
- lib/slideshow/commands/update.rb
|
146
149
|
- lib/slideshow/config.rb
|
147
150
|
- lib/slideshow/drops.rb
|
148
151
|
- lib/slideshow/filters/debug_filter.rb
|
@@ -172,7 +175,7 @@ files:
|
|
172
175
|
- test/samples/test_content_for.md
|
173
176
|
- test/templates/test/test.html
|
174
177
|
- test/templates/test/test.txt
|
175
|
-
- test/
|
178
|
+
- test/test_build.rb
|
176
179
|
- test/test_kramdown.rb
|
177
180
|
- test/test_slide.rb
|
178
181
|
- test/test_version.rb
|