slideshow-models 2.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (39) hide show
  1. checksums.yaml +7 -0
  2. data/HISTORY.md +171 -0
  3. data/Manifest.txt +37 -0
  4. data/README.md +23 -0
  5. data/Rakefile +37 -0
  6. data/config/slideshow.builtin.yml +8 -0
  7. data/config/slideshow.index.yml +69 -0
  8. data/config/slideshow.yml +76 -0
  9. data/lib/slideshow/commands/fetch.rb +123 -0
  10. data/lib/slideshow/commands/gen.rb +330 -0
  11. data/lib/slideshow/commands/list.rb +72 -0
  12. data/lib/slideshow/commands/plugins.rb +46 -0
  13. data/lib/slideshow/commands/quick.rb +88 -0
  14. data/lib/slideshow/config.rb +243 -0
  15. data/lib/slideshow/filters/debug_filter.rb +75 -0
  16. data/lib/slideshow/filters/headers_filter.rb +46 -0
  17. data/lib/slideshow/filters/slide_filter.rb +114 -0
  18. data/lib/slideshow/filters/text_filter.rb +140 -0
  19. data/lib/slideshow/headers.rb +89 -0
  20. data/lib/slideshow/helpers/background_helper.rb +151 -0
  21. data/lib/slideshow/helpers/capture_helper.rb +138 -0
  22. data/lib/slideshow/helpers/directive_helper.rb +45 -0
  23. data/lib/slideshow/helpers/markdown_helper.rb +20 -0
  24. data/lib/slideshow/helpers/source_helper.rb +41 -0
  25. data/lib/slideshow/helpers/step_helper.rb +35 -0
  26. data/lib/slideshow/helpers/syntax/coderay_helper.rb +86 -0
  27. data/lib/slideshow/helpers/syntax/sh_helper.rb +63 -0
  28. data/lib/slideshow/helpers/syntax/uv_helper.rb +92 -0
  29. data/lib/slideshow/helpers/text_helper.rb +132 -0
  30. data/lib/slideshow/manifest_helpers.rb +99 -0
  31. data/lib/slideshow/markup/markdown.rb +20 -0
  32. data/lib/slideshow/markup/mediawiki.rb +40 -0
  33. data/lib/slideshow/markup/rest.rb +19 -0
  34. data/lib/slideshow/markup/textile.rb +70 -0
  35. data/lib/slideshow/models.rb +98 -0
  36. data/lib/slideshow/plugin_helpers.rb +64 -0
  37. data/lib/slideshow/slide.rb +120 -0
  38. data/lib/slideshow/version.rb +28 -0
  39. metadata +197 -0
@@ -0,0 +1,88 @@
1
+ # encoding: utf-8
2
+
3
+ module Slideshow
4
+
5
+ class Quick
6
+
7
+ include LogUtils::Logging
8
+
9
+ include ManifestHelper
10
+
11
+ ### fix: remove opts, use config (wrapped!!)
12
+
13
+ def initialize( opts, config )
14
+ @opts = opts
15
+ @config = config
16
+ end
17
+
18
+ attr_reader :opts, :config
19
+
20
+ def run
21
+ manifest_name = opts.quick_manifest.gsub('.txt','').gsub('.quick','') # make sure we get name w/o .quick and .txt extension
22
+
23
+ ### todo:fix: always download quickstart templates (except welcome?)
24
+ # how to make sure the won't go stale in the cache after the download?
25
+
26
+ manifests = installed_quick_manifests
27
+ matches = manifests.select { |m| (m[0] == manifest_name+'.txt.quick') || (m[0] == manifest_name+'.quick.txt') }
28
+
29
+ if matches.empty?
30
+ fetch_pak( manifest_name )
31
+
32
+ # retry
33
+ manifests = installed_quick_manifests
34
+ matches = manifests.select { |m| (m[0] == manifest_name+'.txt.quick') || (m[0] == manifest_name+'.quick.txt') }
35
+ if matches.empty?
36
+ puts "*** error: quickstart template #{manifest_name} not found"
37
+ exit 2
38
+ end
39
+ end
40
+
41
+ manifestsrc = matches[0][1]
42
+ pakpath = opts.output_path
43
+
44
+ logger.debug( "manifestsrc=>#{manifestsrc}<, pakpath=>#{pakpath}<" )
45
+
46
+ Pakman::Copier.new.copy_pak( manifestsrc, pakpath )
47
+ end
48
+
49
+ ## todo rename to fetch_quick_pak??
50
+ ## share/use same code in fetch too??
51
+
52
+ def fetch_pak( shortcut )
53
+
54
+ sources = config.map_fetch_shortcut( shortcut )
55
+
56
+ if sources.empty?
57
+ puts "*** error: no mapping found for shortcut '#{shortcut}'."
58
+ exit 2
59
+ end
60
+
61
+ sources = sources.select { |s| s.include?('.txt.quick') || s.include?('.quick.txt') }
62
+
63
+ if sources.empty?
64
+ puts "*** error: no quick mapping found for shortcut '#{shortcut}'."
65
+ exit 2
66
+ end
67
+
68
+ src = sources[0]
69
+
70
+ puts " Mapping quick shortcut '#{shortcut}' to: #{src}"
71
+
72
+
73
+ # src = 'http://github.com/geraldb/slideshow/raw/d98e5b02b87ee66485431b1bee8fb6378297bfe4/code/templates/fullerscreen.txt'
74
+ # src = 'http://github.com/geraldb/sandbox/raw/13d4fec0908fbfcc456b74dfe2f88621614b5244/s5blank/s5blank.txt'
75
+ uri = URI.parse( src )
76
+ logger.debug "scheme: #{uri.scheme}, host: #{uri.host}, port: #{uri.port}, path: #{uri.path}"
77
+
78
+ pakname = File.basename( uri.path ).downcase.gsub('.txt','')
79
+ pakpath = File.expand_path( "#{config.config_dir}/templates/#{pakname}" )
80
+
81
+ logger.debug "pakname >#{pakname}<"
82
+ logger.debug "pakpath >#{pakpath}<"
83
+
84
+ Pakman::Fetcher.new.fetch_pak( src, pakpath )
85
+ end # method fetch_pak
86
+
87
+ end # class GenTemplates
88
+ end # module Slideshow
@@ -0,0 +1,243 @@
1
+ # encoding: utf-8
2
+
3
+ module Slideshow
4
+
5
+ class Config
6
+
7
+ include LogUtils::Logging
8
+
9
+ def initialize( opts )
10
+ @opts = opts
11
+ end
12
+
13
+ attr_reader :opts
14
+
15
+ def header_level
16
+ @opts.header_level
17
+ end
18
+
19
+ def slide?
20
+ @opts.slide?
21
+ end
22
+
23
+ def takahashi?
24
+ @opts.takahashi?
25
+ end
26
+
27
+
28
+ # todo/fix: fix references after this move to here, that is, Config class
29
+ # - used in syntax/uv_helper (use config.cache_dir to access?)
30
+
31
+ def cache_dir
32
+ File.join( Env.home, '.slideshow' )
33
+ end
34
+
35
+ def config_dir
36
+ unless @config_dir # first time? calculate config_dir value to "cache"
37
+ @config_dir = opts.config_path
38
+
39
+ # make sure path exists
40
+ FileUtils.makedirs( @config_dir ) unless File.directory? @config_dir
41
+ end
42
+
43
+ @config_dir
44
+ end
45
+
46
+
47
+ def shortcut_index_file
48
+ ## e.g. ~/slideshow.index.yml
49
+ File.join( Env.home, 'slideshow.index.yml' )
50
+ end
51
+
52
+
53
+ def load_shortcuts
54
+ # load default index/registry for shortcuts
55
+ props_shortcuts_default_file = File.join( Slideshow.root, 'config', 'slideshow.index.yml' )
56
+ @props_shortcuts = @props_shortcuts_default = Props.load_file( props_shortcuts_default_file )
57
+
58
+ # check for update (slideshow.index.yml) in home folder
59
+
60
+ props_shortcuts_home_file = File.join( Env.home, 'slideshow.index.yml' )
61
+ if File.exists?( props_shortcuts_home_file )
62
+ puts "Loading shortcut index from '#{props_shortcuts_home_file}'..."
63
+ @props_shortcuts = @props_shortcuts_home = Props.load_file( props_shortcuts_home_file, @props_shortcuts )
64
+ end
65
+
66
+ # todo: add props from (optional) fetch section from 'standard' props (e.g. props[:fetch])
67
+ # - allows user to add own shortcuts in slideshow.yml settings
68
+ end
69
+
70
+
71
+ def map_fetch_shortcut( key )
72
+ # NB: always returns an array!!! 0,1 or more entries
73
+ # - no value - return empty ary
74
+
75
+ ## todo: normalize key???
76
+ value = @props.fetch_from_section( 'fetch', key, @props_shortcuts.fetch( key, nil ))
77
+
78
+ if value.nil?
79
+ []
80
+ elsif value.kind_of?( String )
81
+ [value]
82
+ else # assume it's an array already; ## todo: check if it's an array
83
+ value
84
+ end
85
+ end
86
+
87
+
88
+ def default_fetch_shortcuts
89
+ ## NB: used by install --all
90
+
91
+ ['s6blank',
92
+ 's6syntax',
93
+ 's5blank',
94
+ 's5themes',
95
+ 'g5',
96
+ 'slidy',
97
+ 'deck.js',
98
+ 'impress.js',
99
+ 'analytics'
100
+ ]
101
+
102
+ ## todo: use @props_shortcuts keys
103
+ # and use
104
+ #
105
+ # fetch_shortcuts = fetch_shortcuts.clone
106
+ # fetch_shortcuts.delete( 'fullerscreen' ) # obsolete (do not promote any longer)
107
+ # fetch_shortcuts.delete( 'slippy' ) # needs update/maintainer anyone?
108
+ # fetch_shortcuts.delete( 'shower' ) # needs update/maintainer anyone?
109
+ # etc. to strip keys for all install
110
+ end
111
+
112
+
113
+ def load
114
+
115
+ # load builtin config file @ <gem>/config/slideshow.yml
116
+ #
117
+ # NB: builtin use a different hierachy (not linked to default/home/user/cli props)
118
+ # for now builtin has no erb processing
119
+ # user cannot override builtin settings (only defaults see below)
120
+ props_builtin_file = File.join( Slideshow.root, 'config', 'slideshow.builtin.yml' )
121
+ @props_builtin = Props.load_file( props_builtin_file )
122
+
123
+ props_default_file = File.join( Slideshow.root, 'config', 'slideshow.yml' )
124
+ @props = @props_default = Props.load_file_with_erb( props_default_file, binding() )
125
+
126
+ # check for user settings (slideshow.yml) in home folder
127
+
128
+ props_home_file = File.join( Env.home, 'slideshow.yml' )
129
+ if File.exists?( props_home_file )
130
+ puts "Loading settings from '#{props_home_file}'..."
131
+ @props = @props_home = Props.load_file_with_erb( props_home_file, binding(), @props )
132
+ end
133
+
134
+ # check for user settings (slideshow.yml) in working folder
135
+
136
+ props_work_file = File.join( '.', 'slideshow.yml' )
137
+ if File.exists?( props_work_file )
138
+ puts "Loading settings from '#{props_work_file}'..."
139
+ @props = @props_work = Props.load_file_with_erb( props_work_file, binding(), @props )
140
+ end
141
+
142
+ # load shortcuts
143
+ load_shortcuts
144
+ end
145
+
146
+ def dump # dump settings for debugging
147
+ puts "Slideshow settings:"
148
+ @props_builtin.dump if @props_builtin
149
+ @props_default.dump if @props_default
150
+ @props_home.dump if @props_home
151
+ @props_work.dump if @props_work
152
+
153
+ puts "Slideshow shortcuts:"
154
+ @props_shortcuts_default.dump if @props_shortcuts_default
155
+ @props_shortcuts_home.dump if @props_shortcuts_home
156
+ ## todo: add props from 'standard' props via fetch key
157
+
158
+ ## todo: add more config settings?
159
+ end
160
+
161
+
162
+ def header( key )
163
+ @props.fetch_from_section( 'headers', normalize_key( key ), nil )
164
+ end
165
+
166
+
167
+ def markdown_post_processing?( lib )
168
+ ## todo: normalize key/lib???
169
+ @props.fetch_from_section( lib, 'post-processing', true )
170
+ end
171
+
172
+ def known_rest_extnames
173
+ @props.fetch_from_section( 'rest', 'extnames', [] )
174
+ end
175
+
176
+ def known_textile_extnames
177
+ @props.fetch_from_section( 'textile', 'extnames', [] )
178
+ end
179
+
180
+ def known_mediawiki_extnames
181
+ @props.fetch_from_section( 'mediawiki', 'extnames', [] )
182
+ end
183
+
184
+ def known_markdown_extnames
185
+ ## delegate config to Markdown gem for now
186
+ ## todo/fix: how to pass on setting to Markdown gem??
187
+ Markdown.extnames
188
+ end
189
+
190
+ def known_extnames
191
+ # returns an array of known file extensions e.g.
192
+ # [ '.textile', '.t' ]
193
+ #
194
+ # using nested key
195
+ # textile:
196
+ # extnames: [ .textile, .t ]
197
+ #
198
+ # ruby check: is it better self. ?? or more confusing
199
+ # possible conflict only with write access (e.g. prop=)
200
+
201
+ known_textile_extnames + known_markdown_extnames + known_mediawiki_extnames + known_rest_extnames
202
+ end
203
+
204
+ def text_filters
205
+ @props.fetch( 'filters', [] )
206
+ end
207
+
208
+ def google_analytics_code
209
+ @props.fetch_from_section( 'analytics', 'google', nil )
210
+ end
211
+
212
+ def helper_renames
213
+ ## NB: for now user cannot override/extent renames
214
+ @props_builtin['helper']['renames']
215
+ end
216
+
217
+ def helper_unparsed
218
+ ## NB: for now user cannot override/extent unparsed helpers
219
+ # use unparsed params (passed along a single string)
220
+ @props_builtin['helper']['unparsed']
221
+ end
222
+
223
+ def helper_exprs
224
+ ## NB: for now user cannot override/extent helper exprs
225
+ # allow expression as directives (no need for %end block)
226
+ # by default directives are assumed statements (e.g. %mydir %end)
227
+ @props_builtin['helper']['exprs']
228
+ end
229
+
230
+ private
231
+
232
+ def normalize_key( key )
233
+ # make key all lower case/downcase (e.g. Content-Type => content-type)
234
+ # replace _ with - (e.g. gradient_color => gradient-color)
235
+ # todo: replace space(s) with - ??
236
+ # todo: strip leading and trailing spaces - possible use case ??
237
+
238
+ key.to_s.downcase.tr( '_', '-' )
239
+ end
240
+
241
+ end # class Config
242
+
243
+ end # module Slideshow
@@ -0,0 +1,75 @@
1
+ # encoding: utf-8
2
+
3
+ module Slideshow
4
+ module DebugFilter
5
+
6
+ # use it to dump content before erb merge
7
+
8
+ def dump_content_to_file_debug_text_erb( content )
9
+
10
+ # NB: using attribs from mixed in class
11
+ # - opts
12
+ # - outdir
13
+
14
+ return content unless opts.verbose?
15
+
16
+ outname = "#{outdir}/#{@name}.debug.text.erb"
17
+
18
+ puts " Dumping content before erb merge to #{outname}..."
19
+
20
+ File.open( outname, 'w' ) do |f|
21
+ f.write( content )
22
+ end
23
+
24
+ content
25
+ end
26
+
27
+ # use it to dump content before html post processing
28
+
29
+ def dump_content_to_file_debug_html( content )
30
+
31
+ # NB: using attribs from mixed in class
32
+ # - opts
33
+ # - outdir
34
+
35
+ return content unless opts.verbose?
36
+
37
+ outname = "#{outdir}/#{@name}.debug.html"
38
+
39
+ puts " Dumping content before html post processing to #{outname}..."
40
+
41
+ File.open( outname, 'w' ) do |f|
42
+ f.write( content )
43
+ end
44
+
45
+ content
46
+ end
47
+
48
+ # use it to dump content before text-to-html conversion
49
+
50
+ def dump_content_to_file_debug_text( content )
51
+
52
+ # NB: using attribs from mixed in class
53
+ # - opts
54
+ # - outdir
55
+
56
+ return content unless opts.verbose?
57
+
58
+ outname = "#{outdir}/#{@name}.debug.text"
59
+
60
+ puts " Dumping content before text-to-html conversion to #{outname}..."
61
+
62
+ File.open( outname, 'w' ) do |f|
63
+ f.write( content )
64
+ end
65
+
66
+ content
67
+
68
+ end
69
+
70
+ end # module DebugFilter
71
+ end # module Slideshow
72
+
73
+ class Slideshow::Gen
74
+ include Slideshow::DebugFilter
75
+ end
@@ -0,0 +1,46 @@
1
+ # encoding: utf-8
2
+
3
+ module Slideshow
4
+ module HeadersFilter
5
+
6
+ def leading_headers( content_with_headers )
7
+
8
+ # todo: lets user override headers with command line options
9
+ # that is, lets you override options using commandline switch
10
+
11
+ # read source document; split off optional header from source
12
+ # strip leading optional headers (key/value pairs) including optional empty lines
13
+
14
+ read_headers = true
15
+ content = ""
16
+
17
+ keys = [] # track header keys for stats
18
+
19
+ content_with_headers.each_line do |line|
20
+ if read_headers && line =~ /^\s*(\w[\w-]*)[ \t]*:[ \t]*(.*)/
21
+ key = $1.downcase
22
+ value = $2.strip
23
+
24
+ keys << key
25
+
26
+ logger.debug " adding header: key=>#{key}< value=>#{value}<"
27
+ headers.put( key, value )
28
+ elsif line =~ /^\s*$/
29
+ content << line unless read_headers
30
+ else
31
+ read_headers = false
32
+ content << line
33
+ end
34
+ end
35
+
36
+ puts " Reading #{keys.length} headers: #{keys.join(', ')}..."
37
+
38
+ content
39
+ end
40
+
41
+ end # module HeadersFilter
42
+ end # module Slideshow
43
+
44
+ class Slideshow::Gen
45
+ include Slideshow::HeadersFilter
46
+ end