class Html5Renderer

Attributes

output[R]

Public Class Methods

new(quiz,options={}) click to toggle source
# File lib/ruql/renderers/html5_renderer.rb, line 7
def initialize(quiz,options={})
  @css = options.delete('c') || options.delete('css')
  @show_solutions = options.delete('s') || options.delete('solutions')
  @template = options.delete('t') ||
    options.delete('template') ||
    File.join(Gem.loaded_specs['ruql'].full_gem_path, 'templates/html5.html.erb')
  @output = ''
  @quiz = quiz
  @h = Builder::XmlMarkup.new(:target => @output, :indent => 2)
end

Public Instance Methods

quiz_header() click to toggle source
# File lib/ruql/renderers/html5_renderer.rb, line 150
def quiz_header
  @h.div(:id => 'student-name') do
    @h.p 'Name:'
    @h.p 'Student ID:'
  end
  if @quiz.options[:instructions]
    @h.div :id => 'instructions' do
      @quiz.options[:instructions].each_line { |p| @h.p p }
    end
  end
  self
end
render_answer_for_solutions(answer,raw,is_true_false = nil) click to toggle source
# File lib/ruql/renderers/html5_renderer.rb, line 107
def render_answer_for_solutions(answer,raw,is_true_false = nil)
  args = {:class => (answer.correct? ? 'correct' : 'incorrect')}
  if is_true_false 
    answer.answer_text.prepend(
      answer.correct? ? "CORRECT: " : "INCORRECT: ")
  end
  @h.li(args) do
    if raw then @h.p { |p| p << answer.answer_text } else @h.p answer.answer_text  end
    if answer.has_explanation?
      if raw then @h.p(:class => 'explanation') { |p| p << answer.explanation }
      else @h.p(answer.explanation, :class => 'explanation') end
    end
  end
end
render_fill_in(q, idx) click to toggle source
# File lib/ruql/renderers/html5_renderer.rb, line 81
def render_fill_in(q, idx)
  render_question_text(q, idx) do
    if @show_solutions
      answer = q.answers[0]
      if answer.has_explanation?
        if q.raw? then @h.p(:class => 'explanation') { |p| p << answer.explanation }
        else @h.p(answer.explanation, :class => 'explanation') end
      end
      answers = (answer.answer_text.kind_of?(Array) ? answer.answer_text : [answer.answer_text])
      @h.ol :class => 'answers' do
        answers.each do |answer|
          if answer.kind_of?(Regexp)
            answer = answer.inspect
            if !q.case_sensitive
              answer += 'i'
            end
          end
          @h.li do
            if q.raw? then @h.p { |p| p << answer } else @h.p answer end
          end
        end
      end
    end
  end
end
render_multiple_choice(q,index) click to toggle source
# File lib/ruql/renderers/html5_renderer.rb, line 61
def render_multiple_choice(q,index)
  render_question_text(q, index) do
    answers =
      if q.class == TrueFalse then q.answers.sort.reverse # True always first
      elsif q.randomize then q.answers.sort_by { rand }
      else q.answers
      end
    @h.ol :class => 'answers' do
      answers.each do |answer|
        if @show_solutions
          render_answer_for_solutions(answer, q.raw?, q.class == TrueFalse)
        else
          if q.raw? then @h.li { |l| l << answer.answer_text } else @h.li answer.answer_text end
        end
      end
    end
  end
  self
end
render_question_text(question,index) { || ... } click to toggle source
# File lib/ruql/renderers/html5_renderer.rb, line 122
def render_question_text(question,index)
  html_args = {
    :id => "question-#{index}",
    :class => ['question', question.class.to_s.downcase, (question.multiple ? 'multiple' : '')]
      .join(' ')
  }
  @h.li html_args  do
    @h.div :class => 'text' do
      qtext = "[#{question.points} point#{'s' if question.points>1}] " <<
        ('Select ALL that apply: ' if question.multiple).to_s <<
        if question.class == FillIn then question.question_text.gsub(/\-+/, '_____________________________')
        else question.question_text
        end
      if question.raw?
        @h.p { |p| p << qtext }
      else
        qtext.each_line do |p|
          @h.p do |par|
            par << p # preserves HTML markup
          end
        end
      end
    end
    yield # render answers
  end
  self
end
render_questions() click to toggle source
# File lib/ruql/renderers/html5_renderer.rb, line 46
def render_questions
  render_random_seed
  @h.ol :class => 'questions' do
    @quiz.questions.each_with_index do |q,i|
      case q
      when MultipleChoice, SelectMultiple, TrueFalse then render_multiple_choice(q,i)
      when FillIn then render_fill_in(q, i)
      else
        raise "Unknown question type: #{q}"
      end
    end
  end
end
render_quiz() click to toggle source
# File lib/ruql/renderers/html5_renderer.rb, line 18
def render_quiz
  if @template
    render_with_template do
      render_questions
      @output
    end
  else
    @h.html do
      @h.head do
        @h.title @quiz.title
        @h.link(:rel => 'stylesheet', :type =>'text/css', :href=>@css) if @css
      end
      @h.body do
        render_questions
      end
    end
  end
  self
end
render_random_seed() click to toggle source
# File lib/ruql/renderers/html5_renderer.rb, line 163
def render_random_seed
  @h.comment! "Seed: #{@quiz.seed}"
end
render_with_template() click to toggle source
# File lib/ruql/renderers/html5_renderer.rb, line 38
def render_with_template
  # local variables that should be in scope in the template
  quiz = @quiz
  # the ERB template includes 'yield' where questions should go:
  output = ERB.new(IO.read(File.expand_path @template)).result(binding)
  @output = output
end