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, {})