lib/showoff.rb in showoff-0.18.2 vs lib/showoff.rb in showoff-0.19.0
- old
+ new
@@ -69,11 +69,11 @@
I18n.enforce_available_locales = false
end
def initialize(app=nil)
super(app)
- @logger = Logger.new(STDOUT)
+ @logger = Logger.new(STDERR)
@logger.formatter = proc { |severity,datetime,progname,msg| "#{progname} #{msg}\n" }
@logger.level = settings.verbose ? Logger::DEBUG : Logger::WARN
@review = settings.review
@execute = settings.execute
@@ -105,10 +105,13 @@
settings.encoding = showoff_json["encoding"] || 'UTF-8'
settings.page_size = showoff_json["page-size"] || "Letter"
settings.pres_template = showoff_json["templates"]
end
+ # if no sections are provided, we'll just start from cwd
+ settings.showoff_config['sections'] ||= ['.']
+
# code execution timeout
settings.showoff_config['timeout'] ||= 15
# If favicon in presentation root, use it by default
if File.exist? 'favicon.ico'
@@ -260,11 +263,13 @@
def js_files
Dir.glob("#{settings.pres_dir}/*.js").map { |path| File.basename(path) }
end
def preshow_files
- Dir.glob("#{settings.pres_dir}/_preshow/*").map { |path| File.basename(path) }.to_json
+ files = Dir.glob("#{settings.pres_dir}/_preshow/*")
+ files.reject! { |path| ['.txt', '.md'].include? File.extname(path) }
+ files.map { |path| File.basename(path) }.to_json
end
# return a list of keys associated with a given action in the keymap
def mapped_keys(action, klass='key')
list = @keymap.select { |key,value| value == action }.keys
@@ -376,11 +381,11 @@
def empty?
@text.strip == ""
end
end
- def process_markdown(name, section, content, opts={:static=>false, :pdf=>false, :print=>false, :toc=>false, :supplemental=>nil, :section=>nil})
+ def process_markdown(name, section, content, opts={:static=>false, :pdf=>false, :print=>false, :toc=>false, :supplemental=>nil, :section=>nil, :merged=>false})
if settings.encoding and content.respond_to?(:force_encoding)
content.force_encoding(settings.encoding)
end
@logger.debug "renderer: #{Tilt[:markdown].name}"
@logger.debug "render options: #{@engine_options.inspect}"
@@ -416,30 +421,34 @@
if slide.classes.include? 'subsection'
@section_major += 1
@section_minor = 0
end
- if opts[:supplemental]
- # if we're looking for supplemental material, only include the content we want
- next unless slide.classes.include? 'supplemental'
- next unless slide.classes.include? opts[:supplemental]
- else
- # otherwise just skip all supplemental material completely
- next if slide.classes.include? 'supplemental'
- end
+ # merged output means that we just want to generate *everything*. This is used by internal,
+ # methods such as content validation, where we want all content represented.
+ unless opts[:merged]
+ if opts[:supplemental]
+ # if we're looking for supplemental material, only include the content we want
+ next unless slide.classes.include? 'supplemental'
+ next unless slide.classes.include? opts[:supplemental]
+ else
+ # otherwise just skip all supplemental material completely
+ next if slide.classes.include? 'supplemental'
+ end
- unless opts[:toc]
- # just drop the slide if we're not generating a table of contents
- next if slide.classes.include? 'toc'
- end
+ unless opts[:toc]
+ # just drop the slide if we're not generating a table of contents
+ next if slide.classes.include? 'toc'
+ end
- if opts[:print]
- # drop all slides not intended for the print version
- next if slide.classes.include? 'noprint'
- else
- # drop slides that are intended for the print version only
- next if slide.classes.include? 'printonly'
+ if opts[:print]
+ # drop all slides not intended for the print version
+ next if slide.classes.include? 'noprint'
+ else
+ # drop slides that are intended for the print version only
+ next if slide.classes.include? 'printonly'
+ end
end
@slide_count += 1
content_classes = slide.classes
@@ -801,11 +810,11 @@
return content if title.nil?
begin
tools = '<div class="tools">'
tools << "<input type=\"button\" class=\"display\" value=\"#{I18n.t('forms.display')}\">"
- tools << "<input type=\"submit\" value=\"#{I18n.t('forms.save')}\" disabled=\"disabled\">"
+ tools << "<input type=\"submit\" class=\"save\" value=\"#{I18n.t('forms.save')}\" disabled=\"disabled\">"
tools << '</div>'
form = "<form id='#{title}' action='/form/#{title}' method='POST'>#{content}#{tools}</form>"
doc = Nokogiri::HTML::DocumentFragment.parse(form)
doc.css('p').each do |p|
if p.text =~ /^(\w*) ?(?:->)? ?(.*)? (\*?)= ?(.*)?$/
@@ -1255,11 +1264,11 @@
assets << js
assets.uniq.join("\n")
end
- def slides(static=false)
+ def slides(static=false, merged=false)
@logger.info "Cached presentations: #{@@cache.keys}"
# if we have a cache and we're not asking to invalidate it
return @@cache[@locale] if (@@cache[@locale] and params['cache'] != 'clear')
@@ -1267,11 +1276,11 @@
# If we're displaying from a repository, let's update it
ShowOffUtils.update(settings.verbose) if settings.url
@@slide_titles = []
- content = get_slides_html(:static=>static)
+ content = get_slides_html(:static=>static, :merged=>merged)
# allow command line cache disabling
@@cache[@locale] = content unless settings.nocache
content
end
@@ -1523,12 +1532,15 @@
end
classes = executable ? 'code.execute' : 'code'
slide = "#{path}.md"
- return unless File.exist? slide
+ return [] unless File.exist? slide
content = File.read(slide)
+ return [] if content.nil?
+ return [] if content.empty?
+
if defined? num
content = content.split(/^\<?!SLIDE/m).reject { |sl| sl.empty? }[num-1]
end
html = process_markdown(slide, '', content, {})