Exemplo n.º 1
0
 def create_exercises(self):
     exercises = []
     warnings = []
     with open(self.abspath, 'r') as f:
         questions: List[question.Question] = parser.parseFile(f)
         q: question.Question
         for i, q in enumerate(questions):
             if not q.title:
                 q.title = f'Q{i + 1}'
                 warnings.append(
                     str(
                         SyntaxErrorGift(
                             os.path.join(self.directory.name,
                                          self.relpath), q.source, i + 1,
                             "You did not specify a question title")))
             if q.valid:
                 name = q.answers.__class__.__name__
                 if name in self.GENERATORS:
                     with (StringIO()) as io:
                         self.GENERATORS[name](q).generate(io)
                         exercises.append(io.getvalue())
             else:
                 warnings.append(
                     str(
                         SyntaxErrorGift(
                             os.path.join(self.directory.name,
                                          self.relpath), q.source, i + 1)))
     return exercises, warnings
Exemplo n.º 2
0
    def testMultiple(self):
        io_gift = StringIO("""
::Parmi ces personnes, nommez-en deux qui sont enterrées dans la Grant's tomb. ::{
   ~%-100%Personne # NOMMEZ EN DEUX
   ~%50%Grant # Et de un
   ~%50%L'épouse de Grant # Et de deux
   ~%-100%Le père de Grant # Perdu !
####C'était Grant ainsi que sa femme
}""")
        questions = pygift.parseFile(io_gift)
        io_gift.close()

        d = yattag.Doc()
        with d.tag('html'):
            with d.tag('head'):
                d.stag('meta', charset="utf-8")

        with d.tag('h2'):
            d.text(str(questions[0].answers.__class__))

        for q in questions:
            q.toHTML(d, True)

        for q in questions:
            q.toHTML(d, False)

        self.assertEqual(len(questions), 1,
                         "More than one Question for 'TestMultiple'")

        # TEST HTML
        soup = BeautifulSoup(d.getvalue(), 'html.parser')
        for i, form in enumerate(soup.find_all('form')):
            self.assertEqual(form.h3['class'][0], u'questiontitle',
                             " Not h3 or not good class for h3")
            for j, div in enumerate(form.find_all('div')):
                if j == 0:
                    self.assertEqual(div['class'][0], u'questiontext',
                                     "Not div or not good class for 1rst div")
                if (j == 1):
                    if (i == 0):
                        self.assertEqual(div['class'][0],
                                         u'groupedAnswerFeedback')
                    elif (i == 1):
                        self.assertEqual(div['class'][0], u'groupedAnswer')
                if (j == 2):
                    self.assertEqual(div['class'][0], u'global_feedback')
                    self.assertEqual(str(div.contents[0]),
                                     "<b><em>Feedback:</em></b>")
                    self.assertEqual(
                        str(div.contents[2]),
                        "<p>C'était Grant ainsi que sa femme</p>")
            self.assertEqual(form.ul['class'][0], u'multianswer')
            nb_li = len(form.find_all('li'))
            self.assertEqual(nb_li, 4)

        print("[GiftParsingHTMLTestCase]-- check_multiple_answer OK --")
Exemplo n.º 3
0
    def testParseQuestionWithSpaces(self):
        io = StringIO("""
  // some comment
  ::question_title::question_text{
    =Grant
    ~Personne
}
        """)
        questions = pygift.parseFile(io)
        io.close()
        self.assertEqual(questions[0].text, 'question_text')
Exemplo n.º 4
0
    def testUnChoix(self):
        io_gift = StringIO(u"""
::Pourquoi représenter avec des nombres ?::
Pourquoi faut-il <strong>représenter</strong> les textes, images, sons, etc, *par* des nombres dans un ordinateur ?
{
~C'est un choix <strong>industriel</strong>.#Non, les industriels n'avaient pas le choix.
~Les ordinateurs ont été inventés par des mathématiciens.#Non, les mathématiciens savent manipuler autre chose que des nombres, et les ordinateurs sont le fruit de l'interaction entre de nombreuses sciences.
=Tout ordinateur est fondamentalement une machine qui calcule avec des
nombres.#Oui, comme un ordinateur ne manipule que des nombres,
tout doit être représenté sous forme de nombres être manipulé par un ordinateur.
####Un ordinateur ne manipule que des nombres, tout doit donc être représenté sous forme de nombres pour qu'il puisse le manipuler. }
""")
        questions = pygift.parseFile(io_gift)
        io_gift.close()

        d = yattag.Doc()
        with d.tag('html'):
            with d.tag('head'):
                d.stag('meta', charset="utf-8")

        with d.tag('h2'):
            d.text(str(questions[0].answers.__class__))

        for q in questions:
            q.toHTML(d, True)

        for q in questions:
            q.toHTML(d, False)

        #Vérifie qu'une seule question a bien été créée
        self.assertEqual(len(questions), 1,
                         "More than one Question for 'Test un choix'")

        # TEST HTML
        soup = BeautifulSoup(d.getvalue(), 'html.parser')
        for i, form in enumerate(soup.find_all('form')):
            self.assertEqual(form.h3['class'][0], u'questiontitle',
                             " Not h3 or not good class for h3")
            self.assertEqual(str(form.h3.contents[0]),
                             "Pourquoi représenter avec des nombres ?")
            for j, div in enumerate(form.find_all('div')):
                if j == 0:
                    self.assertEqual(div['class'][0], u'questiontext',
                                     "Not div or not good class for 1rst div")
                    self.assertEqual(
                        str(div.contents[0]),
                        u"<p>Pourquoi faut-il <strong>représenter</strong> les textes, images, sons, etc, <em>par</em> des nombres dans un ordinateur ?</p>"
                    )
                if (j == 1):
                    if (i == 0):
                        self.assertEqual(div['class'][0],
                                         u'groupedAnswerFeedback')
                        # print(div.contents[0])
                        self.assertEqual(
                            str(div.contents[0]),
                            u"""<ul class="multichoice"><li class="wrong_answer"><p>C'est un choix <strong>industriel</strong>.</p> ⇝ <p>Non, les industriels n'avaient pas le choix.</p></li><li class="wrong_answer"><p>Les ordinateurs ont été inventés par des mathématiciens.</p> ⇝ <p>Non, les mathématiciens savent manipuler autre chose que des nombres, et les ordinateurs sont le fruit de l'interaction entre de nombreuses sciences.</p></li><li class="right_answer"><p>Tout ordinateur est fondamentalement une machine qui calcule avec des<br/>
nombres.</p> ⇝ <p>Oui, comme un ordinateur ne manipule que des nombres,<br/>
tout doit être représenté sous forme de nombres être manipulé par un ordinateur.</p></li></ul>"""
                        )
                    elif (i == 1):
                        self.assertEqual(div['class'][0], u'groupedAnswer')
                if (j == 2):
                    self.assertEqual(div['class'][0], u'global_feedback')
                    self.assertEqual(str(div.contents[0]),
                                     "<b><em>Feedback:</em></b>")
                    self.assertEqual(
                        str(div.contents[2]),
                        "<p>Un ordinateur ne manipule que des nombres, tout doit donc être représenté sous forme de nombres pour qu'il puisse le manipuler.</p>"
                    )
            self.assertEqual(form.ul['class'][0], u'multichoice')
            nb_li = len(form.find_all('li'))
            self.assertEqual(nb_li, 3)
            for j, li in enumerate(soup.find_all('li')):
                if j == 0:
                    self.assertEqual(
                        str(li.contents[0]),
                        "<p>C'est un choix <strong>industriel</strong>.</p>")
                if j == 1:
                    self.assertEqual(
                        str(li.contents[0]),
                        "<p>Les ordinateurs ont été inventés par des mathématiciens.</p>"
                    )
                if j == 2:
                    self.assertEqual(
                        str(li.contents[0]),
                        "<p>Tout ordinateur est fondamentalement une machine qui calcule avec des<br/>\nnombres.</p>"
                    )

        print("[GiftParsingHTMLTestCase]-- check_single_answer OK --")
Exemplo n.º 5
0
    def testMatch(self):

        d = yattag.Doc()
        with d.tag('html'):
            with d.tag('head'):
                d.stag('meta', charset="utf-8")

        io_match = StringIO("""
::Match::
Match the following countries with their corresponding capitals. {
=Canada -> Ottawa
=Italy -> Rome
=Japan -> Tokyo
=India -> New Delhi
}
        """)
        questions = pygift.parseFile(io_match)
        io_match.close()

        with d.tag('h2'):
            d.text(str(questions[0].answers.__class__))

        for q in questions:
            q.toHTML(d, True)

        for q in questions:
            q.toHTML(d, False)

        soup = BeautifulSoup(d.getvalue(), 'html.parser')
        for i, form in enumerate(soup.find_all('form')):
            self.assertEqual(form.h3['class'][0], u'questiontitle',
                             " Not h3 or not good class for h3")
            if i == 0:
                for j, div in enumerate(form.find_all('div')):
                    if j == 0:
                        self.assertEqual(div['class'][0], u'questiontext')
                    if j == 2:
                        self.assertEqual(div['class'][0],
                                         u'groupedAnswerFeedback')
                        self.assertEqual(
                            str(div.contents),
                            u'<ul><li class="right_answer">Canada  ⇝  Ottawa</li><li class="right_answer">Italy  ⇝  Rome</li><li class="right_answer">Japan  ⇝  Tokyo</li><li class="right_answer">India  ⇝  New Delhi</li></ul>'
                        )
            if i == 1:
                self.assertIsNotNone(form.table)
                for j, tr in enumerate(soup.find_all('tr')):
                    # WARNING : check options
                    for p, td in enumerate(tr.find_all('td')):
                        if p == 0:
                            if j == 0:
                                self.assertEqual(tr.td.contents[0],
                                                 u'Canada  ')
                            if j == 1:
                                self.assertEqual(tr.td.contents[0], u'Italy  ')
                            if j == 2:
                                self.assertEqual(tr.td.contents[0], u'Japan  ')
                            if j == 3:
                                self.assertEqual(tr.td.contents[0], u'India  ')
                        if p == 1:
                            self.assertIsNotNone(td.select)
                            self.assertIsNotNone(td.find('select')['name'])
                            self.assertEqual(
                                len(td.find('select').find_all('option')), 4)

        print("[GiftParsingHTMLTestCase]-- check_match OK --")
Exemplo n.º 6
0
    def testNumerical(self):

        d = yattag.Doc()
        with d.tag('html'):
            with d.tag('head'):
                d.stag('meta', charset="utf-8")

        #NUMERICAL ANSWER
        io_num = StringIO("""
::Num1::
When was Ulysses S. Grant born?{#1822:5}

::Num2::
What is the value of pi (to 3 decimal places)? {#3.141..3.142}.

::Num3::
When was Ulysses S. Grant born? {#
=1822:0
=%50%1822:2
}

::Num4::
1 2 ou 3 ? {#2}
}
        """)

        questions = pygift.parseFile(io_num)
        io_num.close()

        for q in questions:
            with d.tag('h2'):
                d.text(str(questions[0].answers.__class__))
            q.toHTML(d, True)

        for q in questions:
            q.toHTML(d, False)

        soup = BeautifulSoup(d.getvalue(), 'html.parser')
        for i, form in enumerate(soup.find_all('form')):
            self.assertEqual(form.h3['class'][0], u'questiontitle',
                             " Not h3 or not good class for h3")
            if i < 4:
                for j, div in enumerate(form.find_all('div')):
                    if j == 0:
                        self.assertEqual(div['class'][0], u'questiontext')
                        if i == 0:
                            self.assertEqual(
                                str(div.contents[0]),
                                '<p>When was Ulysses S. Grant born?</p>')
                        if i == 1:
                            self.assertEqual(
                                str(div.contents[0]),
                                '<p>What is the value of pi (to 3 decimal places)?</p>'
                            )
                        if i == 2:
                            self.assertEqual(
                                str(div.contents[0]),
                                '<p>When was Ulysses S. Grant born?</p>')
                    if j == 1:
                        self.assertEqual(div['class'][0], u'answerFeedback')
            else:
                for j, span in enumerate(form.find_all('span')):
                    if j == 0:
                        self.assertEqual(span['class'][0],
                                         u'questionTextInline')
                    if j == 1:
                        self.assertEqual(span['class'][0],
                                         u'questionAnswersInline')
                        self.assertEqual(span.input['type'], u'number')

        print("[GiftParsingHTMLTestCase]-- check_numerical OK --")
Exemplo n.º 7
0
    def testAnswerArea(self):
        #INITIALISATION
        d = yattag.Doc()
        with d.tag('html'):
            with d.tag('head'):
                d.stag('meta', charset="utf-8")


# AVEC UNE RÉPONSE SIMPLE
        io_simple = StringIO("""
::first paret of text of Q2::
//comment in Q2
second part of text of Q2
My Question{
=2 =Q2 =Question2
} other part
        """)

        questions = pygift.parseFile(io_simple)
        io_simple.close()

        with d.tag('h2'):
            d.text(str(questions[0].answers.__class__))

        for q in questions:
            q.toHTML(d, True)

        for q in questions:
            q.toHTML(d, False)

        self.assertEqual(len(questions), 1,
                         "More than one Question for 'TestAnswerArea 1'")

        soup = BeautifulSoup(d.getvalue(), 'html.parser')
        for i, form in enumerate(soup.find_all('form')):
            self.assertEqual(form.h3['class'][0], u'questiontitle',
                             " Not h3 or not good class for h3")
            if i == 0:
                for j, div in enumerate(form.find_all('div')):
                    if j == 0:
                        self.assertEqual(div['class'][0], u'questiontext')
                        self.assertEqual(
                            str(div.contents[0]),
                            '<p>second part of text of Q2<br/>\nMy Question</p>'
                        )
                    if j == 2:
                        self.assertEqual(div['class'][0],
                                         'groupedAnswerFeedback')
                        self.assertEqual(
                            str(div.contents[0]),
                            '<ul><li class="right_answer">2</li><li class="right_answer">Q2</li><li class="right_answer">Question2</li></ul>'
                        )
            if i == 1:
                for j, span in enumerate(form.find_all('span')):
                    if j == 0:
                        self.assertEqual(span['class'][0],
                                         u'questionTextInline')
                        self.assertEqual(
                            str(span.contents[0]),
                            '<p>second part of text of Q2<br/>\nMy Question</p>'
                        )
                    if j == 1:
                        self.assertEqual(span['class'][0],
                                         u'questionAnswersInline')
                        self.assertEqual(span.input['type'], u'text')

        print("[GiftParsingHTMLTestCase]-- check_answer_area OK --")
Exemplo n.º 8
0
    def testTrueFalse(self):
        """
        """
        # INITIALISATION
        d = yattag.Doc()
        with d.tag('html'):
            with d.tag('head'):
                d.stag('meta', charset="utf-8")

# AVEC UNE RÉPONSE SIMPLE
        io_tf = StringIO("""
Le soleil se lève à l'Ouest.{F#Non!#Oui le soleil se lève à l'Est}
        """)

        questions = pygift.parseFile(io_tf)
        io_tf.close()

        with d.tag('h2'):
            d.text(str(questions[0].answers.__class__))

        for q in questions:
            q.toHTML(d, True)

        for q in questions:
            q.toHTML(d, False)

        self.assertEqual(len(questions), 1,
                         "More than one Question for 'TestTrueFalse'")

        soup = BeautifulSoup(d.getvalue(), 'html.parser')
        for i, form in enumerate(soup.find_all('form')):
            self.assertEqual(form.h3['class'][0], u'questiontitle',
                             " Not h3 or not good class for h3")
            for j, div in enumerate(form.find_all('div')):
                if j == 0:
                    self.assertEqual(div['class'][0], u'questiontext',
                                     "Not div or not good class for 1rst div")
                if i == 0:
                    if j == 1:
                        self.assertEqual(
                            div['class'][0], u'answerFeedback',
                            "Not div or not good class for 2sd div")
                        self.assertEqual(div.contents[0], u'False')
                    if j == 2:
                        self.assertEqual(
                            div['class'][0], u'correct_answer',
                            "Not div or not good class for 3rd div")
                        self.assertEqual(
                            str(div.contents[0]),
                            "<p>Oui le soleil se lève à l'Est</p>")
                    if j == 3:
                        self.assertEqual(div['class'][0], u'wrong_answer')
                        self.assertEqual(str(div.contents[0]), "<p>Non!</p>")
            if i == 1:
                self.assertIsNotNone(form.ul)
                for j, li in enumerate(form.find_all('li')):
                    if j == 0:
                        self.assertEqual(li.contents[0]['type'], u'radio')
                        self.assertEqual(li.contents[0]['value'], u'True')
                        self.assertEqual(li.contents[1], _(u'True'))
                    if j == 1:
                        self.assertEqual(li.contents[0]['type'], u'radio')
                        self.assertEqual(li.contents[0]['value'], u'False')
                        self.assertEqual(li.contents[1], _(u'False'))

        print("[GiftParsingHTMLTestCase]-- check_truefalse OK --")
Exemplo n.º 9
0
    def testSimpleText(self):
        io_gift = StringIO("""
::Le numérique concerne tout le monde::
**Quels étudiants sont concernés par le numérique ?**
Le numérique concerne évidemment les étudiants en informatique et plus généralement les étudiants des filières scientifiques.  Mais vous qui êtes inscrits dans une université de sciences humaines et sociales, êtes-vous concernés ?
Choisissez au moins 3 des domaines suivants et faites des recherches pour voir en quoi ils sont impactés par le numérique : les médias, la santé, l'histoire, la sociologie, la linguistique, les arts, la culture, l'enseignement, l'archéologie.
Faites une synthèse en quelques lignes de vos recherches en précisant les domaines auxquels vous vous êtes intéressés. Indiquez les liens des sites sur lesquels vous avez trouvé ces informations. La liste est non exhaustive et vous pouvez vous intéresser à d'autres domaines.
{####
# Le numérique concerne tout le monde
Ces recherches ont dû vous convaincre, si c'était nécessaire, que le numérique **n'est pas réservé** aux informaticiens, il concerne tout le monde, toutes les disciplines.
S'agissant plus particulièrement des **sciences humaines**, la prise en compte du numérique a fait évoluer les champs disciplinaires pour faire apparaître ce qu'on appelle les **humanités numériques** ( *digital humanities* en anglais).
Voici quelques exemples que nous vous proposons, n'hésitez pas à proposer d'autres exemples dans le forum de discussion :
* Dans les **médias** : nouveau sous-métier de journalisme : les **data-journalistes**
	* [data-visualisation](http://www.lemonde.fr/data-visualisation/)
	* [journalisme de données](http://fr.wikipedia.org/wiki/Journalisme_de_données)
* Dans la **santé** : (imagerie, dossier numérique du patient, ...)
	* [simulation](https://interstices.info/jcms/c_21525/simulation-de-loperation-de-la-cataracte)
* En **histoire, sociologie, linguistique** : *fouille de données*
	* [fouille de données](http://www.youtube.com/watch?feature=player_embedded&v=tp4y-_VoXdA)
* En **art et culture** :
	* [Le Fresnoy](http://www.lefresnoy.net/fr/Le-Fresnoy/presentation)
* Dans l'**enseignement** : (outils numérique d'accompagnement scolaire, MOOC,...):
	* [FUN](https://www.france-universite-numerique-mooc.fr/cours/)
* En fouille archéologique :  une réalisation prestigieuse réalisée à Lille3 :
	* [vase qui parle](http://bsa.biblio.univ-lille3.fr/blog/2013/09/exposition-le-vase-qui-parle-au-palais-des-beaux-arts-de-lille/)
}
""")

        questions = pygift.parseFile(io_gift)
        io_gift.close()

        d = yattag.Doc()
        with d.tag('html'):
            with d.tag('head'):
                d.stag('meta', charset="utf-8")

        with d.tag('h2'):
            d.text(str(questions[0].answers.__class__))

        for q in questions:
            q.toHTML(d, True)

        for q in questions:
            q.toHTML(d, False)

        self.assertEqual(len(questions), 1,
                         "More than one Question for 'TestSimpleText'")

        # TEST HTML
        soup = BeautifulSoup(d.getvalue(), 'html.parser')
        for i, form in enumerate(soup.find_all('form')):
            self.assertEqual(form.h3['class'][0], u'questiontitle',
                             " Not h3 or not good class for h3")
            self.assertEqual(str(form.h3.contents[0]),
                             u'Le numérique concerne tout le monde')
            if i == 1:
                self.assertIsNotNone(form.textarea)
                self.assertTrue(form.textarea['placeholder'],
                                _(u'Your answer here'))
            for j, div in enumerate(form.find_all('div')):
                if j == 0:
                    self.assertEqual(div['class'][0], u'questiontext',
                                     "Not div or not good class for 1rst div")
                if (j == 1):
                    self.assertEqual(div['class'][0], u'global_feedback')
                    self.assertEqual(str(div.contents[0]),
                                     "<b><em>Feedback:</em></b>")
                    self.assertEqual(
                        str(div.contents[2]),
                        "<h1>Le numérique concerne tout le monde</h1>")
                    self.assertEqual(
                        str(div.contents[4]),
                        """<p>Ces recherches ont dû vous convaincre, si c'était nécessaire, que le numérique <strong>n'est pas réservé</strong> aux informaticiens, il concerne tout le monde, toutes les disciplines.<br/>
S'agissant plus particulièrement des <strong>sciences humaines</strong>, la prise en compte du numérique a fait évoluer les champs disciplinaires pour faire apparaître ce qu'on appelle les <strong>humanités numériques</strong> ( <em>digital humanities</em> en anglais).<br/>
Voici quelques exemples que nous vous proposons, n'hésitez pas à proposer d'autres exemples dans le forum de discussion :<br/>
<em> Dans les <strong>médias</strong> : nouveau sous-métier de journalisme : les <strong>data-journalistes</strong><br/>
    * <a href="http://www.lemonde.fr/data-visualisation/">data-visualisation</a><br/>
    * <a href="http://fr.wikipedia.org/wiki/Journalisme_de_données">journalisme de données</a><br/>
</em> Dans la <strong>santé</strong> : (imagerie, dossier numérique du patient, ...)<br/>
    * <a href="https://interstices.info/jcms/c_21525/simulation-de-loperation-de-la-cataracte">simulation</a><br/>
<em> En <strong>histoire, sociologie, linguistique</strong> : </em>fouille de données<em><br/>
    * <a href="http://www.youtube.com/watch?feature=player_embedded&amp;v=tp4y-_VoXdA">fouille de données</a><br/>
</em> En <strong>art et culture</strong> :<br/>
    * <a href="http://www.lefresnoy.net/fr/Le-Fresnoy/presentation">Le Fresnoy</a><br/>
<em> Dans l'<strong>enseignement</strong> : (outils numérique d'accompagnement scolaire, MOOC,...):<br/>
    * <a href="https://www.france-universite-numerique-mooc.fr/cours/">FUN</a><br/>
</em> En fouille archéologique :  une réalisation prestigieuse réalisée à Lille3 :<br/>
    * <a href="http://bsa.biblio.univ-lille3.fr/blog/2013/09/exposition-le-vase-qui-parle-au-palais-des-beaux-arts-de-lille/">vase qui parle</a></p>"""
                    )

        print("[GiftParsingHTMLTestCase]-- check_text1 OK --")
Exemplo n.º 10
0
        with d.tag('body'):
            d.asis("""
            <script src="http://code.jquery.com/jquery-1.12.0.min.js"></script>
            <script src="libs/tocible-master/jquery.tocible.js"></script>
            <h1>Demo of HTML outputs</h1>
            """)
            with d.tag('div', id='container'):
                with d.tag('div', id='ref'):
                    d.text('')
                with d.tag('div', klass='gifts'):
                    for filename in glob.glob('*gift'):
                        with d.tag('h1'):
                            d.text(filename)

                        with open(filename, 'r') as f:
                            questions = pygift.parseFile(f)
                        f.close()

                        for q in questions:
                            with d.tag('div', klass='qandcode'):
                                q.toHTML(d, False)
                                with d.tag('div', klass='full'):
                                    with d.tag('pre'):
                                        d.asis(html.escape(q.full))
                                with d.tag('div', klass='FB'):
                                    q.toHTML(d, True)

            d.asis("""
            <script language="javascript">
            $('#container').tocible({
            heading: 'h1', //[selector], the first level heading
Exemplo n.º 11
0
        d.stag('link', rel="stylesheet", href="libs/tocible-master/jquery.tocible.css", type="text/css")
        with d.tag('body'):
            d.asis("""
            <script src="http://code.jquery.com/jquery-1.12.0.min.js"></script>
            <script src="libs/tocible-master/jquery.tocible.js"></script>
            """)
            with d.tag('div',id='container'):
                with d.tag('div', id='ref'):
                    d.text('')
                with d.tag('div',klass='gifts'):
                    for filename in glob.glob('*gift'):
                        with d.tag('h1'):
                            d.text(filename)
                            
                        with open(filename,'r') as f:
                            questions = pygift.parseFile(f)
                        f.close()
                                
                        for q in questions:
                            with d.tag('div', klass='qandcode'):
                                q.toHTML(d,True)

                                with d.tag('div', klass='full'):
                                    with d.tag('pre'):
                                        d.asis(html.escape(q.full))

            d.asis("""
            <script language="javascript">
            $('#container').tocible({
            heading: 'h1', //[selector], the first level heading
            reference:'#ref', //[selector], reference element for horizontal positioning