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
# 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

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



150
151
152
153
154
155
156
157
158
159
160
161
# 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) ⇒ Object



107
108
109
110
111
112
113
114
115
116
117
118
119
120
# 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) ⇒ Object



81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
# 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) ⇒ Object



61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
# 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) ⇒ Object



122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
# 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_questionsObject



46
47
48
49
50
51
52
53
54
55
56
57
58
# 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_quizObject



18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# 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_seedObject



163
164
165
# File 'lib/ruql/renderers/html5_renderer.rb', line 163

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

#render_with_templateObject



38
39
40
41
42
43
44
# 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