Class: Html5Renderer

Inherits:
Object
  • Object
show all
Defined in:
lib/ruql/renderers/html5_renderer.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(quiz, options = {}) ⇒ Html5Renderer

Returns a new instance of Html5Renderer.



7
8
9
10
11
12
13
14
15
16
17
# File 'lib/ruql/renderers/html5_renderer.rb', line 7

def initialize(quiz,options={})
  @show_solutions = options.delete('s') || options.delete('solutions')
  @template = options.delete('t') ||
    options.delete('template') ||
    File.join(File.dirname(__FILE__), '../../../templates/html5.html.erb')
  @output = ''
  @list_type = (options.delete('o') || options.delete('list-type') || 'o')[0] + "l"
  @list_start = quiz.first_question_number
  @quiz = quiz
  @h = Builder::XmlMarkup.new(:target => @output, :indent => 2)
end

Instance Attribute Details

#outputObject (readonly)

Returns the value of attribute output.



5
6
7
# File 'lib/ruql/renderers/html5_renderer.rb', line 5

def output
  @output
end

Instance Method Details

#quiz_headerObject



146
147
148
149
150
151
152
153
154
155
156
157
# File 'lib/ruql/renderers/html5_renderer.rb', line 146

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) ⇒ Object



96
97
98
99
100
101
102
103
104
105
106
107
108
109
# File 'lib/ruql/renderers/html5_renderer.rb', line 96

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) ⇒ Object



70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
# File 'lib/ruql/renderers/html5_renderer.rb', line 70

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) ⇒ Object



50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
# File 'lib/ruql/renderers/html5_renderer.rb', line 50

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 && !@quiz.suppress_random then q.answers.sort_by { rand }
      else q.answers
      end
    @h.__send__(@list_type, :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) ⇒ Object



111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
# File 'lib/ruql/renderers/html5_renderer.rb', line 111

def render_question_text(question,index)
  html_args = {
    :id => "question-#{index}",
    :'data-uid' => question.question_uid,
    :class => ['question', question.class.to_s.downcase, (question.multiple ? 'multiple' : '')].join(' ')
  }
  if question.question_image           # add CSS class to both <li> and <img>
    html_args[:class] << 'question-with-image'
  end
  @h.li html_args  do
    # if there's an image, render it first
    if question.question_image
      @h.img :src => question.question_image, :class => 'question-image'
    end
    @h.div :class => 'text' do
      qtext = @quiz.point_string(question.points) << ' ' <<
        ('Select <b>all</b> 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_questionsObject



35
36
37
38
39
40
41
42
43
44
45
46
47
# File 'lib/ruql/renderers/html5_renderer.rb', line 35

def render_questions
  render_random_seed
  @h.ol :class => 'questions', :start => @list_start 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_quizObject



19
20
21
22
23
24
25
# File 'lib/ruql/renderers/html5_renderer.rb', line 19

def render_quiz
  render_with_template do
    render_questions
    @output
  end
  self
end

#render_random_seedObject



159
160
161
# File 'lib/ruql/renderers/html5_renderer.rb', line 159

def render_random_seed
  @h.comment! "Seed: #{@quiz.seed}"
end

#render_with_templateObject



27
28
29
30
31
32
33
# File 'lib/ruql/renderers/html5_renderer.rb', line 27

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