class Showoff::Compiler::Notes
adds presenter notes processing to the compiler
Public Class Methods
render!(doc, profile, options = {})
click to toggle source
Generate the presenter notes sections, including personal notes
@param doc [Nokogiri::HTML::DocumentFragment]
The slide document
@param profile [String]
The markdown engine profile to use when rendering
@param options [Hash] Options used for rendering any embedded markdown @option options [String] :name The markdown slide name @option options [String] :seq The sequence number for multiple slides in one file
@return [Nokogiri::HTML::DocumentFragment]
The slide DOM with all notes sections rendered.
@see
https://github.com/puppetlabs/showoff/blob/3f43754c84f97be4284bb34f9bc7c42175d45226/lib/showoff.rb#L616-L716
@note
A ton of the functionality in the original method got refactored to its logical location
# File lib/showoff/compiler/notes.rb, line 23 def self.render!(doc, profile, options = {}) # Turn tags into classed divs. doc.search('p').select {|p| p.text.start_with?('~~~SECTION:') }.each do |p| klass = p.text.match(/~~~SECTION:([^~]*)~~~/)[1] # Don't bother creating this if we don't want to use it next unless Showoff::Config.includeNotes?(klass) notes = Nokogiri::XML::Node.new('div', doc) notes.add_class("notes-section #{klass}") nodes = [] iter = p.next_sibling until iter.text == '~~~ENDSECTION~~~' do nodes << iter iter = iter.next_sibling # if the author forgot the closing tag, let's not crash, eh? break unless iter end iter.remove if iter # remove the extraneous closing ~~~ENDSECTION~~~ tag # We need to collect the list before moving or the iteration crashes since the iterator no longer has a sibling nodes.each {|n| n.parent = notes } p.replace(notes) end filename = [ File.join(Showoff::Config.root, '_notes', "#{options[:name]}.#{options[:seq]}.md"), File.join(Showoff::Config.root, '_notes', "#{options[:name]}.md"), ].find {|path| File.file?(path) } if filename and Showoff::Config.includeNotes?('notes') # Make sure we've got a notes div to hang personal notes from doc.add_child '<div class="notes-section notes"></div>' if doc.search('div.notes-section.notes').empty? doc.search('div.notes-section.notes').each do |section| text = Tilt[:markdown].new(nil, nil, options[:profile]) { File.read(filename) }.render frag = "<div class=\"personal\"><h1>#{I18n.t('presenter.notes.personal')}</h1>#{text}</div>" section.prepend_child(frag) end end # return notes separately from content so that it can be rendered outside the slide # @see https://github.com/puppetlabs/showoff/blob/3f43754c84f97be4284bb34f9bc7c42175d45226/lib/showoff.rb#L726-L732 notes = doc.search('div.notes-section') doc.search('div.notes-section').each {|n| n.remove } [doc, notes] end