Commit 5e2c5e62529d26869f1c8bdd0b5887a586acf4a1

Authored by Miguel Barão
1 parent 4b703498
Exists in master and in 1 other branch dev

add package.json to install javascript libraries with npm

.gitignore
... ... @@ -6,4 +6,7 @@ static/lib
6 6  
7 7 # Python egg metadata, regenerated from source files by setuptools.
8 8 /*.egg-info
9   -/*.egg
10 9 \ No newline at end of file
  10 +/*.eggnode_modules
  11 +
  12 +# ignore javascript libraries installed with npm
  13 +node_modules/
11 14 \ No newline at end of file
... ...
README.md
... ... @@ -8,17 +8,17 @@
8 8  
9 9 ## 1. Requirements
10 10  
11   -The webserver is a python application that requires `python3.6` and `pip` to be
12   -installed.
13   -It's also recommended to install `npm` (Node package management) to install the
  11 +The webserver is a python application that requires `>=python3.6` and `pip` to be
  12 +installed. `npm` (Node package management) is also necessary to install the
14 13 javascript libraries.
15 14  
16 15 ```bash
17 16 sudo apt install python3 python3-pip npm # debian, ubuntu, mint, ...
18 17 sudo pkg install python36 py36-sqlite3 py36-pip py36-setuptools npm # FreeBSD
  18 +sudo port install python37 py37-pip py37-setuptools npm6 # MacOS
19 19 ```
20 20  
21   -The file `~/.config/pip/pip.conf` should be configured to the following:
  21 +The file `pip.conf` should be configured to the following:
22 22  
23 23 ```ini
24 24 [global]
... ... @@ -28,21 +28,25 @@ user=yes
28 28 format=columns
29 29 ```
30 30  
31   -Note: In MacOS this file is in `~/Library/Application Support/pip/pip.conf`.
  31 +The file is in `~/.config/pip/` in Linux/FreeBSD and `~/Library/Application Support/pip/pip.conf` in MacOS.
  32 +
32 33  
33 34 ---
34 35  
35 36 ## 2. Installation
36 37  
37   -Download and install:
  38 +Download and install (`USERNAME` is your account on bitbucket):
38 39  
39 40 ```bash
40 41 git clone https://USERNAME@bitbucket.org/USERNAME/perguntations.git
41   -pip3 install --user perguntations
  42 +cd perguntations
  43 +npm install
  44 +pip3 install .
42 45 ```
43 46  
44   -where `USERNAME` is your account on bitbucket.
45   -This will also install any dependencies required to run the software.
  47 +The command `npm` installs the javascript libraries and `pip3` installs the
  48 +python webserver.
  49 +This will also automatically install the python dependencies required.
46 50  
47 51 ---
48 52  
... ... @@ -53,12 +57,11 @@ To generate certificates, there are two possibilities: public server with
53 57 static IP address or a private server on a local network.
54 58  
55 59 Certificates must be saved in the `$XDG_DATA_HOME` path if defined in the
56   -environment, otherwise in `~/.local/share/certs`.
57   -
58   -Create the directory if needed:
  60 +environment, otherwise in `~/.local/share/certs` (I will assume the latter
  61 +case).
59 62  
60 63 ```bash
61   -[ ! -z "$XDG_DATA_HOME" ] || mkdir -p ~/.local/share/certs
  64 +mkdir -p ~/.local/share/certs
62 65 ```
63 66  
64 67 ### Selfsigned certificates
... ... @@ -67,7 +70,7 @@ Self-signed certificates are not certified by a recognised authority and
67 70 browsers will complain that the certificate is not trusted.
68 71  
69 72 ```bash
70   -cd WHERE/TO/PUT/CERTS
  73 +cd ~/.local/share/certs
71 74 openssl req -x509 -newkey rsa:4096 -keyout privkey.pem -out cert.pem -days 365 -nodes
72 75 ```
73 76  
... ... @@ -77,14 +80,14 @@ Generating certificates for a public server (FreeBSD) requires a registered
77 80 domain with fixed IP.
78 81  
79 82 ```sh
80   -sudo pkg install py27-certbot # FreeBSD
  83 +sudo pkg install py27-certbot # FreeBSD
81 84 sudo service pf stop # disable pf firewall (FreeBSD)
82 85 sudo certbot certonly --standalone -d www.example.com
83 86 sudo service pf start # enable pf firewall
84 87 ```
85 88  
86 89 Certificates are saved in `/usr/local/etc/letsencrypt/live/www.example.com/`.
87   -Copy them to the appropriate `certs` directory and change permissions:
  90 +Copy them to the `certs` directory and change permissions:
88 91  
89 92 ```sh
90 93 chmod 400 cert.pem privkey.pem
... ... @@ -101,77 +104,57 @@ sudo service pf start # start firewall
101 104 Again, copy certificate files `privkey.pem` and `cert.pem` to the `certs`
102 105 directory.
103 106  
104   ----
105   -
106   -## Installing 3rd party javascript libraries
107   -
108   -The javascript libraries are not included in the repository.
109   -The following libraries are currently necessary (as of 24/1/2019):
110   -
111   -```
112   -DataTables
113   -MDB-Free_4
114   -MathJax-2.7.5
115   -bootstrap-4.2.1-dist
116   -codemirror-5.42.2
117   -fontawesome-free-5.6.3-web
118   -jquery-3.3.1.min.js
119   -popper.min.js
120   -```
121   -
122   -Downloaded and install them in the directory perguntations/static/lib.
123   -
124   -FIXME: use `npm`
125 107  
126 108 ---
127 109  
128 110 ## Running a demo
129 111  
130   -The directory `demo` includes a demo test that can be used as a template for
131   -your own tests and questions.
  112 +The directory `demo` in the repository includes a demo test that can be used
  113 +as a template for your own tests and questions.
132 114  
133 115 To run the demonstration test you need to initialize the database using one of
134 116 the following methods:
135 117  
136 118 ```.bash
137   -./initdb.py students.csv # initialize from a CSV file
138   -./initdb.py --admin # only adds the administrator account
139   -./initdb.py --add 123 "Asterix Gaules" # add one student
  119 +cd demo
140 120  
141   -# a database file "students.db" is created
142   -mv students.db demo/
  121 +initdb students.csv # initialize from a CSV file
  122 +initdb --admin # only adds the administrator account
  123 +initdb --add 123 "Asterix Gaules" # add one student
143 124  
144   -# create directory to save the finished tests
145   -mkdir demo/ans
  125 +mkdir ans # directory where the student tests are saved
146 126  
147   -# edit test configuration and check if everything looks right
148   -vi demo/test-tutorial.yaml
149   -```
  127 +$EDITOR test-tutorial.yaml # edit test configuration
150 128  
151   -We are now ready to run the server:
152   -
153   -```.bash
154   -./serve.py --help # get help
155   -./serve.py demo/test-tutorial.yaml # run demo test
  129 +perguntations --help # get help
  130 +perguntations tutorial.yaml # run demo test
156 131 ```
157 132  
158   -By default the server listens on port 8443 and on all IPs of all network interfaces.
159   -Open the browser at `http://127.0.0.1:8443/` and login as user number `0` (administrator) and choose any password. Then
  133 +The server listens on port 8443 of all IPs of all network interfaces.
  134 +Open the browser at `http://127.0.0.1:8443/` and login as user number `0`
  135 +(administrator) and choose any password. The administrator is redirected to the
  136 +administration page that shows all the students and their state.
160 137  
161 138 1. Authorize students by clicking the checkboxes.
162   -2. Open a different browser at `http://127.0.0.1:8443/` and login as one of the authorized students. Answer the questions and submit.
  139 +2. Open a different browser at `http://127.0.0.1:8443/` and login as one of the
  140 +authorized students. Answer the questions and submit.
163 141  
164 142 The server can be stoped from the terminal with `^C`.
165 143  
166 144 ## Running on lower ports 80 or 443
167 145  
168   -Ports 80 and 443 are reserved for the root user and and this software _should NOT be run as root_. Instead, the firewall should be configured to forward tcp traffic from port 443 to 8443 where the server is listening. The details depend on the operating system.
  146 +Ports 80 and 443 are reserved for the root user and and this software **should
  147 +NOT be run as root**.
  148 +Instead, the firewall should be configured to forward tcp traffic from port 443
  149 +to 8443 where the server is listening.
  150 +The details depend on the operating system.
169 151  
170 152 ### debian:
171 153  
  154 +FIXME: Untested
  155 +
172 156 ```.bash
173   -iptables -t nat -I PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-ports 8080
174   -FIXME: also for port 443...
  157 +iptables -t nat -I PREROUTING -i eth0 -p tcp --dport 443 -j REDIRECT --to-ports 8443
175 158 ```
176 159  
177 160 Explanation:
... ... @@ -181,19 +164,20 @@ Explanation:
181 164 - `-p tcp` selected protocol.
182 165 - `-s 0/0` source network address/mask.
183 166 - `-i eth0` interface via which the packet was received.
184   -- `--dport 80` destination port.
  167 +- `--dport 443` destination port.
185 168 - `-j REDIRECT` what to do when packet matches the rule.
186   -- `--to-ports 8080` where to redirect the packets.
  169 +- `--to-ports 8443` where to redirect the packets.
187 170  
188 171 ### FreeBSD and pf
189 172  
190 173 Edit `/etc/pf.conf`:
191 174  
192   - ext_if="em0"
  175 + ext_if="wlan1"
193 176 rdr on $ext_if proto tcp from any to any port 80 -> 127.0.0.1 port 8080
194 177 rdr on $ext_if proto tcp from any to any port 443 -> 127.0.0.1 port 8443
195 178  
196   -or `ext_if="vtnet0"` for guest additions under virtual box.
  179 +The `wlan1` should be the name of the network interface.
  180 +Use `ext_if="vtnet0"` for guest additions under virtual box.
197 181  
198 182 Start firewall with `sudo service pf start`.
199 183  
... ... @@ -211,10 +195,17 @@ Optionally, to activate pf on boot, edit `rc.conf`:
211 195  
212 196 ## Troubleshooting
213 197  
214   -* The server tries to run `python3` so this command must be accessible from user accounts. Currently, the minimum supported python version is 3.6.
215   -* If you are getting any `UnicodeEncodeError` type of errors that's because the terminal is not supporting UTF-8. This error may occur when a unicode character is printed to the screen by the server or, when running question generator or correction scripts, a message is piped between the server and the scripts that includes unicode characters.
216   -Try running `locale` on the terminal and see if there are any error messages. Solutions:
217   - - debian: fix it with `sudo dpkg-reconfigure locales`, select your UTF-8 locales and try again.
  198 +* The server tries to run `python3` so this command must be accessible from
  199 +user accounts. Currently, the minimum supported python version is 3.6.
  200 +
  201 +* If you are getting any `UnicodeEncodeError` type of errors that's because the
  202 +terminal is not supporting UTF-8.
  203 +This error may occur when a unicode character is printed to the screen by the
  204 +server or, when running question generator or correction scripts, a message is
  205 +piped between the server and the scripts that includes unicode characters.
  206 +Try running `locale` on the terminal and see if there are any error messages.
  207 +Solutions:
  208 + - debian: `sudo dpkg-reconfigure locales` and select your UTF-8 locales.
218 209 - FreeBSD: edit `~/.login_conf` to use UTF-8, for example:
219 210  
220 211 ```
... ...
demo/test-tutorial.yaml
... ... @@ -1,64 +0,0 @@
1   ----
2   -# ============================================================================
3   -# The test reference should be a unique identifier. It is saved in the database
4   -# so that queries for the results can be done in the terminal with
5   -# $ sqlite3 students.db "select * from tests where ref='demo'"
6   -ref: tutorial
7   -
8   -# (optional, default: '') You may wish to refer the course, year or kind of test
9   -title: Teste tutorial
10   -
11   -# (optional) duration in minutes, 0 or undefined is infinite
12   -duration: 120
13   -
14   -# Database with student credentials and grades of all questions and tests done
15   -# The database is an sqlite3 file generate with the script initdb.py
16   -database: demo/students.db
17   -
18   -# Generate a file for each test done by a student.
19   -# It includes the questions, answers and grades.
20   -answers_dir: demo/ans
21   -
22   -# (optional, default: False) Show points for each question, scale 0-20.
23   -show_points: true
24   -# scale_points: True
25   -# scale_max: 20
26   -
27   -# (optional, default: False) Show hints if available
28   -show_hints: true
29   -
30   -# (optional, default: False) Show lots of information for debugging
31   -# debug: True
32   -
33   -
34   -# ----------------------------------------------------------------------------
35   -# Base path applied to the questions files and all the scripts
36   -# including question generators and correctors.
37   -# Either absolute path or relative to current directory can be used.
38   -questions_dir: demo
39   -
40   -# (optional) List of files containing questions in yaml format.
41   -# Selected questions will be obtained from these files.
42   -# If undefined, all yaml files in questions_dir are loaded (not recommended).
43   -files:
44   - - questions/questions-tutorial.yaml
45   -
46   -# This is the list of questions that will make up the test.
47   -# The order is preserved.
48   -# There are several ways to define each question (explained below).
49   -questions:
50   - - tut-test
51   - - tut-questions
52   -
53   - - tut-radio
54   - - tut-checkbox
55   - - tut-text
56   - - tut-text-regex
57   - - tut-numeric-interval
58   - - ref: tut-textarea
59   - points: 2.0
60   -
61   - - tut-information
62   - - tut-success
63   - - tut-warning
64   - - tut-alert
demo/tutorial.yaml 0 → 100644
... ... @@ -0,0 +1,57 @@
  1 +---
  2 +# ============================================================================
  3 +# The test reference should be a unique identifier. It is saved in the database
  4 +# so that queries for the results can be done in the terminal with
  5 +# $ sqlite3 students.db "select * from tests where ref='demo'"
  6 +ref: tutorial
  7 +
  8 +# (optional, default: '') You may wish to refer the course, year or kind of test
  9 +title: Teste de demonstração (tutorial)
  10 +
  11 +# (optional) duration in minutes, 0 or undefined is infinite
  12 +duration: 120
  13 +
  14 +# Database with student credentials and grades of all questions and tests done
  15 +# The database is an sqlite3 file generate with the script initdb.py
  16 +database: demo/students.db
  17 +
  18 +# Generate a file for each test done by a student.
  19 +# It includes the questions, answers and grades.
  20 +answers_dir: demo/ans
  21 +
  22 +# (optional, default: False) Show points for each question, scale 0-20.
  23 +show_points: true
  24 +# scale_points: true
  25 +# scale_max: 20
  26 +
  27 +# ----------------------------------------------------------------------------
  28 +# Base path applied to the questions files and all the scripts
  29 +# including question generators and correctors.
  30 +# Either absolute path or relative to current directory can be used.
  31 +questions_dir: demo
  32 +
  33 +# (optional) List of files containing questions in yaml format.
  34 +# Selected questions will be obtained from these files.
  35 +# If undefined, all yaml files in questions_dir are loaded (not recommended).
  36 +files:
  37 + - questions/questions-tutorial.yaml
  38 +
  39 +# This is the list of questions that will make up the test.
  40 +# The order is preserved.
  41 +# There are several ways to define each question (explained below).
  42 +questions:
  43 + - tut-test
  44 + - tut-questions
  45 +
  46 + - tut-radio
  47 + - tut-checkbox
  48 + - tut-text
  49 + - tut-text-regex
  50 + - tut-numeric-interval
  51 + - ref: tut-textarea
  52 + points: 2.0
  53 +
  54 + - tut-information
  55 + - tut-success
  56 + - tut-warning
  57 + - tut-alert
... ...
package-lock.json 0 → 100644
... ... @@ -0,0 +1,44 @@
  1 +{
  2 + "requires": true,
  3 + "lockfileVersion": 1,
  4 + "dependencies": {
  5 + "@fortawesome/fontawesome-free": {
  6 + "version": "5.7.1",
  7 + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-free/-/fontawesome-free-5.7.1.tgz",
  8 + "integrity": "sha512-gukWJ7Mwf0WXQbkcwcm5zi8+H8aT5MMnphf5hpydOw898H1ibgm2cyejHgk6Km/FTvrPp5ppUHLrlFwt0QxsQw=="
  9 + },
  10 + "bootstrap": {
  11 + "version": "4.3.0",
  12 + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.3.0.tgz",
  13 + "integrity": "sha512-M0vqY0Z6UDweV2nLFl5dXcb+GIo53EBCGMMVxCGH5vJxl/jsr+HkULBMd4kn9rdpdBZwd3BduCgMOYOwJybo4Q=="
  14 + },
  15 + "codemirror": {
  16 + "version": "5.43.0",
  17 + "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-5.43.0.tgz",
  18 + "integrity": "sha512-mljwQWUaWIf85I7QwTBryF2ASaIvmYAL4s5UCanCJFfKeXOKhrqdHWdHiZWAMNT+hjLTCnVx2S/SYTORIgxsgA=="
  19 + },
  20 + "datatables": {
  21 + "version": "1.10.18",
  22 + "resolved": "https://registry.npmjs.org/datatables/-/datatables-1.10.18.tgz",
  23 + "integrity": "sha512-ntatMgS9NN6UMpwbmO+QkYJuKlVeMA2Mi0Gu/QxyIh+dW7ZjLSDhPT2tWlzjpIWEkDYgieDzS9Nu7bdQCW0sbQ==",
  24 + "requires": {
  25 + "jquery": ">=1.7"
  26 + }
  27 + },
  28 + "jquery": {
  29 + "version": "3.3.1",
  30 + "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.3.1.tgz",
  31 + "integrity": "sha512-Ubldcmxp5np52/ENotGxlLe6aGMvmF4R8S6tZjsP6Knsaxd/xp3Zrh50cG93lR6nPXyUFwzN3ZSOQI0wRJNdGg=="
  32 + },
  33 + "mathjax": {
  34 + "version": "2.7.5",
  35 + "resolved": "https://registry.npmjs.org/mathjax/-/mathjax-2.7.5.tgz",
  36 + "integrity": "sha512-OzsJNitEHAJB3y4IIlPCAvS0yoXwYjlo2Y4kmm9KQzyIBZt2d8yKRalby3uTRNN4fZQiGL2iMXjpdP1u2Rq2DQ=="
  37 + },
  38 + "popper.js": {
  39 + "version": "1.14.7",
  40 + "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.14.7.tgz",
  41 + "integrity": "sha512-4q1hNvoUre/8srWsH7hnoSJ5xVmIL4qgz+s4qf2TnJIMyZFUFMGH+9vE7mXynAlHSZ/NdTmmow86muD0myUkVQ=="
  42 + }
  43 + }
  44 +}
... ...
package.json 0 → 100644
... ... @@ -0,0 +1,13 @@
  1 +{
  2 + "description": "Javascript libraries required to run the server",
  3 + "email": "mjsb@uevora.pt",
  4 + "dependencies": {
  5 + "@fortawesome/fontawesome-free": "^5.7.1",
  6 + "bootstrap": "^4.3.0",
  7 + "codemirror": "^5.43.0",
  8 + "datatables": "^1.10.18",
  9 + "jquery": "^3.3.1",
  10 + "mathjax": "^2.7.5",
  11 + "popper.js": "^1.14.7"
  12 + }
  13 +}
... ...
perguntations/static/README
... ... @@ -1,28 +0,0 @@
1   -# Javascript libraries
2   -
3   -The javascript libraries should be installed in the `lib` directory.
4   -Either make a `lib` directory here or a symbolic link to somewhere else.
5   -
6   -Currently, libs should contain:
7   -
8   - bootstrap
9   - codemirror
10   - DataTables
11   - fontawesome
12   - MathJax
13   -
14   -and the files:
15   -
16   - jquery.min.js
17   - popper.min.js
18   -
19   -The DataTables directory was generated by https://www.datatables.net/download/
20   -Select:
21   -
22   -- styling: bootstrap4
23   -- packages: datatables
24   -- extensions: responsive
25   -
26   -This will generate a zip that contains the directory `DataTables`. Expand the
27   -zip into `lib`.
28   -
perguntations/static/bootstrap 0 → 120000
... ... @@ -0,0 +1 @@
  1 +../../node_modules/bootstrap/dist/
0 2 \ No newline at end of file
... ...
perguntations/static/codemirror 0 → 120000
... ... @@ -0,0 +1 @@
  1 +../../node_modules/codemirror/
0 2 \ No newline at end of file
... ...
perguntations/static/datatables 0 → 120000
... ... @@ -0,0 +1 @@
  1 +../../node_modules/datatables/media/
0 2 \ No newline at end of file
... ...
perguntations/static/fontawesome-free 0 → 120000
... ... @@ -0,0 +1 @@
  1 +../../node_modules/@fortawesome/fontawesome-free/
0 2 \ No newline at end of file
... ...
perguntations/static/jquery 0 → 120000
... ... @@ -0,0 +1 @@
  1 +../../node_modules/jquery/dist/
0 2 \ No newline at end of file
... ...
perguntations/static/mathjax 0 → 120000
... ... @@ -0,0 +1 @@
  1 +../../node_modules/mathjax/
0 2 \ No newline at end of file
... ...
perguntations/static/popper.js 0 → 120000
... ... @@ -0,0 +1 @@
  1 +../../node_modules/popper.js/dist/
0 2 \ No newline at end of file
... ...
perguntations/templates/admin.html
... ... @@ -7,8 +7,8 @@
7 7 <link rel="icon" href="/static/favicon.ico">
8 8  
9 9 <!-- styles -->
10   - <link rel="stylesheet" type="text/css" href="/static/lib/bootstrap/css/bootstrap.min.css">
11   - <link rel="stylesheet" type="text/css" href="/static/lib/DataTables/datatables.min.css"/>
  10 + <link rel="stylesheet" type="text/css" href="/static/bootstrap/css/bootstrap.min.css">
  11 + <link rel="stylesheet" type="text/css" href="/static/datatables/css/jquery.dataTables.min.css"/>
12 12  
13 13 <style>
14 14 html {
... ... @@ -20,11 +20,11 @@
20 20 </style>
21 21  
22 22 <!-- Scripts -->
23   - <script src="/static/lib/jquery.min.js"></script>
24   - <script defer src="/static/lib/fontawesome/js/all.min.js"></script>
25   - <script defer src="/static/lib/popper.min.js"></script>
26   - <script defer src="/static/lib/bootstrap/js/bootstrap.min.js"></script>
27   - <script defer src="/static/lib/DataTables/datatables.min.js"></script>
  23 + <script src="/static/jquery/jquery.min.js"></script>
  24 + <script defer src="/static/popper.js/popper.min.js"></script>
  25 + <script defer src="/static/fontawesome-free/js/all.min.js"></script>
  26 + <script defer src="/static/bootstrap/js/bootstrap.min.js"></script>
  27 + <script defer src="/static/datatables/js/jquery.dataTables.min.js"></script>
28 28  
29 29 <script defer src="/static/js/admin.js"></script>
30 30 <script defer src="/static/js/clock.js"></script>
... ...
perguntations/templates/grade.html
... ... @@ -7,14 +7,15 @@
7 7 <link rel="icon" href="/static/favicon.ico">
8 8  
9 9 <!-- Styles -->
10   - <link rel="stylesheet" type="text/css" href="/static/lib/bootstrap/css/bootstrap.min.css">
  10 + <link rel="stylesheet" type="text/css" href="/static/bootstrap/css/bootstrap.min.css">
  11 +
11 12 <link rel="stylesheet" type="text/css" href="/static/css/test.css">
12 13  
13 14 <!-- Scripts -->
14   - <script defer src="/static/lib/fontawesome/js/all.min.js"></script>
15   - <script defer src="/static/lib/jquery.min.js"></script>
16   - <script defer src="/static/lib/popper.min.js"></script>
17   - <script defer src="/static/lib/bootstrap/js/bootstrap.min.js"></script>
  15 + <script src="/static/jquery/jquery.min.js"></script>
  16 + <script defer src="/static/popper.js/popper.min.js"></script>
  17 + <script defer src="/static/fontawesome-free/js/all.min.js"></script>
  18 + <script defer src="/static/bootstrap/js/bootstrap.min.js"></script>
18 19 </head>
19 20 <!-- ================================================================= -->
20 21 <body>
... ...
perguntations/templates/login.html
... ... @@ -11,10 +11,10 @@
11 11 <link rel="stylesheet" type="text/css" href="/static/bootstrap/css/bootstrap.min.css">
12 12  
13 13 <!-- Scripts -->
14   - <script src="/static/lib/jquery.min.js"></script>
15   - <script defer src="/static/lib/fontawesome/js/all.min.js"></script>
16   - <script defer src="/static/lib/popper.min.js"></script>
17   - <script defer src="/static/lib/bootstrap/js/bootstrap.min.js"></script>
  14 + <script src="/static/jquery/jquery.min.js"></script>
  15 + <script defer src="/static/popper.js/popper.min.js"></script>
  16 + <script defer src="/static/fontawesome-free/js/all.min.js"></script>
  17 + <script defer src="/static/bootstrap/js/bootstrap.min.js"></script>
18 18  
19 19 </head>
20 20 <!-- =================================================================== -->
... ...
perguntations/templates/review.html
... ... @@ -17,15 +17,15 @@
17 17 <script defer type="text/javascript" src="/static/MathJax/MathJax.js?config=TeX-AMS_CHTML-full"></script>
18 18  
19 19 <!-- Styles -->
20   - <link rel="stylesheet" href="/static/lib/bootstrap/css/bootstrap.min.css">
21   - <link rel="stylesheet" href="/static/css/github.css"> <!-- syntax highlight -->
22   - <link rel="stylesheet" href="/static/css/test.css">
  20 + <link rel="stylesheet" type="text/css" href="/static/bootstrap/css/bootstrap.min.css">
  21 + <link rel="stylesheet" type="text/css" href="/static/css/github.css"> <!-- syntax highlight -->
  22 + <link rel="stylesheet" type="text/css" href="/static/css/test.css">
23 23  
24 24 <!-- Scripts -->
25   - <script defer src="/static/lib/jquery.min.js"></script>
26   - <script defer src="/static/lib/popper.min.js"></script>
27   - <script defer src="/static/lib/bootstrap/js/bootstrap.min.js"></script>
28   - <script defer src="/static/lib/fontawesome/js/all.min.js"></script>
  25 + <script src="/static/jquery/jquery.min.js"></script>
  26 + <script defer src="/static/popper.js/popper.min.js"></script>
  27 + <script defer src="/static/fontawesome-free/js/all.min.js"></script>
  28 + <script defer src="/static/bootstrap/js/bootstrap.min.js"></script>
29 29 </head>
30 30 <!-- ===================================================================== -->
31 31 <body>
... ...
perguntations/templates/test.html
... ... @@ -14,22 +14,22 @@
14 14 }
15 15 });
16 16 </script>
17   - <script type="text/javascript" src="/static/MathJax/MathJax.js?config=TeX-AMS_CHTML-full"></script>
  17 + <script type="text/javascript" src="/static/mathjax/MathJax.js?config=TeX-AMS_CHTML-full"></script>
18 18  
19 19 <!-- Scripts -->
20   - <script src="/static/lib/jquery.min.js"></script>
21   - <script defer src="/static/lib/popper.min.js"></script>
22   - <script defer src="/static/lib/bootstrap/js/bootstrap.min.js"></script>
23   - <script defer src="/static/lib/fontawesome/js/all.min.js"></script>
24   - <script src="/static/lib/codemirror/lib/codemirror.js"></script>
25   - <script src="/static/lib/codemirror/addon/selection/active-line.js"></script>
26   - <script src="/static/lib/codemirror/addon/edit/matchbrackets.js"></script>
  20 + <script src="/static/jquery/jquery.min.js"></script>
  21 + <script defer src="/static/popper.js/popper.min.js"></script>
  22 + <script defer src="/static/fontawesome-free/js/all.min.js"></script>
  23 + <script defer src="/static/bootstrap/js/bootstrap.min.js"></script>
  24 + <script src="/static/codemirror/lib/codemirror.js"></script>
  25 + <script src="/static/codemirror/addon/selection/active-line.js"></script>
  26 + <script src="/static/codemirror/addon/edit/matchbrackets.js"></script>
27 27  
28 28 <!-- Styles -->
29   - <link rel="stylesheet" type="text/css" href="/static/lib/bootstrap/css/bootstrap.min.css">
  29 + <link rel="stylesheet" type="text/css" href="/static/bootstrap/css/bootstrap.min.css">
  30 + <link rel="stylesheet" type="text/css" href="/static/codemirror/lib/codemirror.css">
  31 + <link rel="stylesheet" type="text/css" href="/static/codemirror/theme/darcula.css">
30 32 <link rel="stylesheet" type="text/css" href="/static/css/github.css"> <!-- syntax highlight -->
31   - <link rel="stylesheet" type="text/css" href="/static/lib/codemirror/lib/codemirror.css">
32   - <link rel="stylesheet" type="text/css" href="/static/lib/codemirror/theme/darcula.css">
33 33 <link rel="stylesheet" type="text/css" href="/static/css/test.css">
34 34  
35 35 <!-- My scripts -->
... ...