Class: HtmlFormRenderer

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

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

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

Returns a new instance of HtmlFormRenderer.



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

def initialize(quiz,options={})
  @css = options.delete('c') || options.delete('css')
  @js = options.delete('j') || options.delete('js')
  @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/htmlform.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/html_form_renderer.rb', line 5

def output
  @output
end

Instance Method Details

#quiz_headerObject



182
183
184
185
186
187
188
189
190
191
192
193
# File 'lib/ruql/renderers/html_form_renderer.rb', line 182

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



142
143
144
145
146
147
148
149
150
151
# File 'lib/ruql/renderers/html_form_renderer.rb', line 142

def render_answer_for_solutions(answer,raw)
  args = {:class => (answer.correct? ? 'correct' : 'incorrect')}
  @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



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
# File 'lib/ruql/renderers/html_form_renderer.rb', line 116

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



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

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?)
        else
          #if q.raw? then @h.li { |l| l << answer.answer_text } else @h.li answer.answer_text end
          @h.input(:type => 'radio', :name => 'a', :class => 'select') { |p| 
            p << answer.answer_text
            p << '</br>'
          }
        end
      end
    end
  end
  self
end

#render_question_text(question, index) ⇒ Object



153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
# File 'lib/ruql/renderers/html_form_renderer.rb', line 153

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
            @h.input(:type => 'text', :class => 'fillin') if (question.class == FillIn)
          end
        end
      #end
    end
    yield # render answers
  end
  self
end

#render_questionsObject



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

def render_questions
  render_random_seed
  @h.form do
    @h.ol :class => 'questions' do
      @quiz.questions.each_with_index do |q,i|
        case q
        when SelectMultiple then render_select_multiple(q,i)
        when MultipleChoice, TrueFalse then render_multiple_choice(q,i)
        when FillIn then render_fill_in(q, i)
        else
          raise "Unknown question type: #{q}"
        end
      end
    end
    @h.input(:type => 'submit', :value => 'Enviar')
  end
end

#render_quizObject



19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# File 'lib/ruql/renderers/html_form_renderer.rb', line 19

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
        @h.script(:type => 'text/javascript', :src => @js) do
        end if @js
      end
      @h.body do
        render_questions
      end
    end
  end
  self
end

#render_random_seedObject



195
196
197
# File 'lib/ruql/renderers/html_form_renderer.rb', line 195

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

#render_select_multiple(q, index) ⇒ Object



93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
# File 'lib/ruql/renderers/html_form_renderer.rb', line 93

def render_select_multiple(q,index)
  render_question_text(q, index) do
    answers =
      if 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?)
      else
        #if q.raw? then @h.li { |l| l << answer.answer_text } else @h.li answer.answer_text end
        @h.input(:type => 'checkbox', :name => 'b', :class => 'check') { |p| 
          p << answer.answer_text
          p << '</br>'
        }
      end
    end
  end
end
self
end

#render_with_templateObject



41
42
43
44
45
46
47
48
# File 'lib/ruql/renderers/html_form_renderer.rb', line 41

def render_with_template
  # local variables that should be in scope in the template 
  quiz = @quiz
  title = "Quiz" unless @title
  # the ERB template includes 'yield' where questions should go:
  output = ERB.new(IO.read(File.expand_path @template)).result(binding)
  @output = output
end