├── .gitignore ├── screen.png ├── docs ├── schemaER.dia ├── GuidaAdmin.odt ├── GuidaAdmin.pdf ├── GuidaUtente.odt ├── GuidaUtente.pdf ├── Documentazione.odt └── Documentazione.pdf ├── lib ├── fonts │ ├── FontAwesome.otf │ ├── fontawesome-webfont.eot │ ├── fontawesome-webfont.ttf │ ├── fontawesome-webfont.woff │ ├── fontawesome-webfont.woff2 │ ├── glyphicons-halflings-regular.eot │ ├── glyphicons-halflings-regular.ttf │ ├── glyphicons-halflings-regular.woff │ └── glyphicons-halflings-regular.woff2 ├── css │ ├── loading-bar.min.css │ ├── bootstrap-theme.min.css │ └── font-awesome.min.css └── js │ ├── loading-bar.min.js │ ├── angular-highlightjs.min.js │ ├── angular-ui-router.min.js │ └── highlight.min.js ├── README.md ├── css └── style.css ├── partials ├── arguments.html ├── auth.html ├── home.html ├── admin.html ├── dbManager.html └── exercise.html ├── API ├── config.php.dist ├── API.php └── APIadmin.php ├── js └── routes.js ├── sql ├── 0 - des.sql ├── 3 - barca.sql ├── 2 - escursioni.sql └── 1 - banca.sql ├── index.html └── LICENSE /.gitignore: -------------------------------------------------------------------------------- 1 | /API/config.php 2 | -------------------------------------------------------------------------------- /screen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Helias/Database-Exercise-System/HEAD/screen.png -------------------------------------------------------------------------------- /docs/schemaER.dia: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Helias/Database-Exercise-System/HEAD/docs/schemaER.dia -------------------------------------------------------------------------------- /docs/GuidaAdmin.odt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Helias/Database-Exercise-System/HEAD/docs/GuidaAdmin.odt -------------------------------------------------------------------------------- /docs/GuidaAdmin.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Helias/Database-Exercise-System/HEAD/docs/GuidaAdmin.pdf -------------------------------------------------------------------------------- /docs/GuidaUtente.odt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Helias/Database-Exercise-System/HEAD/docs/GuidaUtente.odt -------------------------------------------------------------------------------- /docs/GuidaUtente.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Helias/Database-Exercise-System/HEAD/docs/GuidaUtente.pdf -------------------------------------------------------------------------------- /docs/Documentazione.odt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Helias/Database-Exercise-System/HEAD/docs/Documentazione.odt -------------------------------------------------------------------------------- /docs/Documentazione.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Helias/Database-Exercise-System/HEAD/docs/Documentazione.pdf -------------------------------------------------------------------------------- /lib/fonts/FontAwesome.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Helias/Database-Exercise-System/HEAD/lib/fonts/FontAwesome.otf -------------------------------------------------------------------------------- /lib/fonts/fontawesome-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Helias/Database-Exercise-System/HEAD/lib/fonts/fontawesome-webfont.eot -------------------------------------------------------------------------------- /lib/fonts/fontawesome-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Helias/Database-Exercise-System/HEAD/lib/fonts/fontawesome-webfont.ttf -------------------------------------------------------------------------------- /lib/fonts/fontawesome-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Helias/Database-Exercise-System/HEAD/lib/fonts/fontawesome-webfont.woff -------------------------------------------------------------------------------- /lib/fonts/fontawesome-webfont.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Helias/Database-Exercise-System/HEAD/lib/fonts/fontawesome-webfont.woff2 -------------------------------------------------------------------------------- /lib/fonts/glyphicons-halflings-regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Helias/Database-Exercise-System/HEAD/lib/fonts/glyphicons-halflings-regular.eot -------------------------------------------------------------------------------- /lib/fonts/glyphicons-halflings-regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Helias/Database-Exercise-System/HEAD/lib/fonts/glyphicons-halflings-regular.ttf -------------------------------------------------------------------------------- /lib/fonts/glyphicons-halflings-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Helias/Database-Exercise-System/HEAD/lib/fonts/glyphicons-halflings-regular.woff -------------------------------------------------------------------------------- /lib/fonts/glyphicons-halflings-regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Helias/Database-Exercise-System/HEAD/lib/fonts/glyphicons-halflings-regular.woff2 -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Database-Exercise-System 2 | A university project to simulate an exercise system 3 | 4 | # [Live Demo](https://dbexsystem.altervista.org/) 5 | 6 | #  7 | 8 | # Credits 9 | - Alessandro Maggio (@TkdAlex) 10 | - Stefano Borzì (@Helias) 11 | -------------------------------------------------------------------------------- /css/style.css: -------------------------------------------------------------------------------- 1 | .nav { margin-top: 10px; } 2 | 3 | .numEx { margin-top: 0px; } 4 | 5 | .tables { font-size: 15px; } 6 | 7 | .pagination { margin: 0px 0px 0px 0px; } 8 | 9 | .ex_text { border-left: 1px solid #ededed; } 10 | .tables_text { border-right: 1px solid #ededed; } 11 | 12 | .db_title { 13 | font-size: 25px; 14 | } 15 | 16 | .sql-code .hljs-keyword { color: #c7254e; } 17 | -------------------------------------------------------------------------------- /partials/arguments.html: -------------------------------------------------------------------------------- 1 |
Questa applicazione web è un sistema di esercitazione creato da Stefano Borzì e Alessandro Maggio per facilitare lo studio dell'algebra relazionale e SQL agli studenti del Dipartimento Matematica e Informatica (DMI) dell'università di Catania.
6 |Ecco alcune documentazioni che spiegano come utilizzare il Database Exercise System:
16 | 17 |
29 | Per qualsiasi segnalazione o suggerimento scriveteci qui
30 |
31 |
32 |
33 | oppure contattateci via email:
34 |
35 | stefanoborzi32@gmail.com
36 |
37 | alex.tkd.alex@gmail.com
38 |
39 |
40 |
41 | o via Telegram:
42 |
43 |
44 | @Helias
45 |
46 | @TkdAlex
47 |
52 | Se vi è piaciuto il nostro progetto lasciate una star su GitHub 53 |
54 | 55 |
58 |
59 |
60 |
'),function(e,f,g,j){var k,l=c(g);if(a.isDefined(l("escape"))?k=b(l("escape")):a.isDefined(l("no-escape"))&&(k=b("false")),j.init(f.find("code")),l("onhighlight")&&j.highlightCallback(function(){e.$eval(l("onhighlight"))}),(h||i)&&d(g)){var m;m=k&&!k(e)?i:h,j.highlight(m)}e.$on("$destroy",function(){j.release()})}}}}],h=function(b){return function(){return{require:"?hljs",restrict:"A",link:function(c,d,e,f){f&&e.$observe(b,function(b){a.isDefined(b)&&f.setLanguage(b)})}}}},g=function(a){return function(){return{require:"?hljs",restrict:"A",link:function(b,c,d,e){e&&b.$watch(d[a],function(a,c){(a||a!==c)&&e.setInterpolateScope(a?b:null)})}}}},i=function(a){return function(){return{require:"?hljs",restrict:"A",link:function(b,c,d,e){e&&b.$watch(d[a],function(a,b){a?e.highlight(a):e.clear()})}}}},j=function(b){return["$http","$templateCache","$q",function(c,d,e){return{require:"?hljs",restrict:"A",compile:function(f,g,h){var i=g[b];return function(b,f,g,h){var j=0;h&&b.$watch(i,function(b){var f=++j;if(b&&a.isString(b)){var g,i;g=d.get(b),g||(i=e.defer(),c.get(b,{cache:d,transformResponse:function(a,b){return a}}).success(function(a){f===j&&i.resolve(a)}).error(function(){f===j&&h.clear(),i.resolve()}),g=i.promise),e.when(g).then(function(b){b&&(a.isArray(b)?b=b[1]:a.isObject(b)&&(b=b.data),b=b.replace(/^(\r\n|\r|\n)/m,""),h.highlight(b))})}else h.clear()})}}}}]},function(b){b.directive("hljs",f),a.forEach(["interpolate","hljsInterpolate","compile","hljsCompile"],function(a){b.directive(a,g(a))}),a.forEach(["language","hljsLanguage"],function(a){b.directive(a,h(a))}),a.forEach(["source","hljsSource"],function(a){b.directive(a,i(a))}),a.forEach(["include","hljsInclude"],function(a){b.directive(a,j(a))})}(e),"hljs"});
--------------------------------------------------------------------------------
/API/API.php:
--------------------------------------------------------------------------------
1 | query('SELECT * FROM argomenti');
9 | $json = getJson($stmt->fetchAll(PDO::FETCH_ASSOC));
10 | print_json($json);
11 | return;
12 | }
13 | else if (isset($_GET['exerciseSQL']) && $_GET['exerciseSQL'] != "")
14 | {
15 | // select all SQL exercises for argument
16 | $stmt = $db->query('SELECT * FROM domandeSQL WHERE argomento = ' . $_GET['exerciseSQL']);
17 | $json = getJson($stmt->fetchAll(PDO::FETCH_ASSOC));
18 | print_json($json);
19 | return;
20 | }
21 | else if (isset($_GET['exerciseALG']) && $_GET['exerciseALG'] != "")
22 | {
23 | // select all algebra exercises for argument
24 | $stmt = $db->query('SELECT * FROM domandeALG WHERE argomento = ' . $_GET['exerciseALG']);
25 | $json = getJson($stmt->fetchAll(PDO::FETCH_ASSOC));
26 | print_json($json);
27 | return;
28 | }
29 | else if (isset($_GET['database'])) {
30 | // show all "databases"
31 | $stmt = $db->query('SHOW TABLES FROM ' . $database);
32 |
33 | $arr = array();
34 |
35 | foreach ($stmt as $dbs) {
36 | if ( strpos($dbs[0], "_") && !in_array(substr($dbs[0], 0, strpos($dbs[0], "_")), $arr) )
37 | array_push($arr, substr($dbs[0], 0, strpos($dbs[0], "_")));
38 | }
39 |
40 | $json = getJson($arr);
41 | print_json($json);
42 | return;
43 | }
44 | else if (isset($_GET['db_tables']) && $_GET['db_tables'] != "") {
45 | // show tables from database
46 | $prefix = $_GET['db_tables'];
47 | $stmt = $db->query('SHOW TABLES FROM ' . $database . ' WHERE Tables_in_' . $database . ' LIKE "' . $prefix . '_%"');
48 |
49 | $tables = array();
50 |
51 | foreach($stmt as $table) {
52 | $t = str_replace($prefix . "_", "", $table[0]) . " (";
53 | $t = strtoupper($t);
54 |
55 | $columns = $db->query("SHOW COLUMNS FROM " . $prefix . "_" . str_replace($prefix . "_", "", $table[0]));
56 | foreach ($columns as $column) {
57 | $t .= $column[0] . ", ";
58 | }
59 | $t = substr($t, 0, -2) . ")";
60 | array_push($tables, $t);
61 | }
62 |
63 | $json = getJson($tables);
64 | print_json($json);
65 | return;
66 | }
67 |
68 | // Get solution
69 | if (isset($_GET['getSoluzione']) && $_GET['getSoluzione'] != "") {
70 | $stmt = $db->query("SELECT soluzione FROM soluzioni WHERE id = " . $_GET['getSoluzione']);
71 | $data = $stmt->fetchAll(PDO::FETCH_ASSOC);
72 |
73 | $soluzione = $data[0]['soluzione'];
74 |
75 | $stmt = $db->query($soluzione);
76 | $result = $stmt->fetchAll(PDO::FETCH_ASSOC);
77 |
78 | echo '[{ "query": "' . $soluzione . '" }, { "results" : ' . getJson($result) . '}]';
79 | return;
80 | }
81 |
82 | //Blacklist word
83 | if (isset($_GET['sql']) && $_GET['sql'] != "" && isset($_GET['soluz']) && $_GET['soluz'] != "") {
84 | $sql = strtolower($_GET['sql']);
85 |
86 | if (strpos($sql, "select") == -1)
87 | $json = '{ "Error": "Non è stata eseguita una query SELECT!" }';
88 | else {
89 | if ( strpos($sql, "delete") > -1
90 | || strpos($sql, "insert") > -1
91 | || strpos($sql, "create") > -1
92 | || strpos($sql, "drop") > -1
93 | || strpos($sql, "replication") > -1
94 | || strpos($sql, "replace") > -1
95 | || strpos($sql, "grant") > -1
96 | || strpos($sql, "show") > -1
97 | || strpos($sql, "trigger") > -1
98 | || strpos($sql, "from utenti") > -1
99 | || strpos($sql, "from argomenti") > -1
100 | || strpos($sql, "from domandeALG") > -1
101 | || strpos($sql, "from domandeSQL") > -1
102 | || strpos($sql, "from soluzioni") > -1) {
103 |
104 | $json = '{ "Error": "Non è stata eseguita una query SELECT!" }';
105 |
106 | } else {
107 |
108 | /* User Query */
109 | $stmt = $db->query($_GET['sql']);
110 |
111 | if (!$stmt) {
112 | print_json('{ "Error": "Errore durante l\' esecuzione della query: ' . $db->errorInfo()[2] . '" }');
113 | return;
114 | }
115 |
116 | $data = $stmt->fetchAll(PDO::FETCH_ASSOC);
117 |
118 | $json = '[{"results" : ' . getJson($data) . "}, ";
119 |
120 | /* Solution Query */
121 | $stmt = $db->query("SELECT soluzione FROM soluzioni WHERE id = " . $_GET['soluz']);
122 | $solution = $stmt->fetchAll(PDO::FETCH_ASSOC)[0]['soluzione'];
123 |
124 | $stmt = $db->query($solution);
125 | $data2 = $stmt->fetchAll(PDO::FETCH_ASSOC);
126 |
127 | if (count($data) != count($data2)) {
128 | $json .= '{ "Error": "Query sbagliata! Non è stato selezionato lo stesso numero di righe!" }';
129 | }
130 | else if (count($data[0]) != count($data2[0])) {
131 | $json .= '{ "Error": "Query sbagliata! Non sono stati selezionati gli stessi campi e/o numero di colonne!" }';
132 | } else {
133 |
134 | /* Extract keys associative */
135 | $keys = array();
136 |
137 | $i = 0;
138 | foreach ($data[0] as $key => $value) {
139 | $keys[$i] = $key;
140 | $i++;
141 | }
142 |
143 | /* Compare the two tables results */
144 | $rowCompare = array();
145 | $rowCompare = array_fill(0, count($data), false);
146 |
147 | $fieldCompare = array();
148 |
149 | for ($i = 0; $i < count($data); $i++) {
150 | for ($k = 0; $k < count($data2); $k++) {
151 |
152 | $fieldCompare = array_fill(0, count($keys), false);
153 |
154 | for ($j = 0; $j < count($keys); $j++) {
155 |
156 | if ($data[$i][$keys[$j]] == $data2[$k][$keys[$j]]) {
157 | $fieldCompare[$j] = true;
158 | } else {
159 | $fieldCompare[$j] = false;
160 | break;
161 | }
162 | }
163 |
164 | if (!(in_array(false, $fieldCompare))) {
165 | $rowCompare[$i] = true;
166 | break;
167 | }
168 | }
169 | }
170 |
171 | if (!(in_array(false, $rowCompare)))
172 | $json .= '{ "Success": "Esercizio svolto con successo!" }';
173 | else
174 | $json .= '{ "Error": "Query sbagliata! Visualizza la soluzione o il risultato che dovresti ottenere" }';
175 | }
176 | }
177 | }
178 | $json .= "]";
179 | } else
180 | $json = '{ "Error": "Errore durante l\' esecuzione della query" }';
181 |
182 | header('Content-Type: application/json');
183 | echo $json;
184 | ?>
185 |
--------------------------------------------------------------------------------
/API/APIadmin.php:
--------------------------------------------------------------------------------
1 | setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
14 |
15 | try {
16 |
17 | //Login "function".
18 | if ((isset($_GET['username']) && $_GET['username'] != "") &&
19 | (isset($_GET['password']) && $_GET['password'] != "")
20 | ) {
21 | $json = "";
22 |
23 | $stmt = $db->query('SELECT * FROM utenti WHERE username = "' . $_GET['username'] .'";');
24 | if ( $stmt->fetchColumn() != "" ) {
25 | $stmt = $db->query('SELECT * FROM utenti WHERE psw = "' . md5($_GET['password']) .'";');
26 | if ( $stmt->fetchColumn() != "" ) {
27 | $_SESSION["username"] = $_GET['username'];
28 | $_SESSION["password"] = md5($_GET['password']);
29 | } else
30 | print_json('{ "Error": "Password non corretta!" }');
31 | } else
32 | print_json('{ "Error": "Nome utente non esistente!" }');
33 | return;
34 | }
35 |
36 | //Check if the user is logged.
37 | if ( isset($_GET['checklogin']) ) {
38 | if ( $_SESSION["username"] == "" || $_SESSION["password"] == "" )
39 | $json = '{ "Error": "Login non effettuato!" }';
40 | }
41 |
42 | //If user is logged.
43 | if ( $_SESSION["username"] != "" && $_SESSION["password"] != "" ) {
44 |
45 |
46 | //Show all "databases".
47 | if (isset($_GET['database'])) {
48 | $stmt = $db->query('SHOW TABLES FROM ' . $database);
49 |
50 | $arr = array();
51 |
52 | foreach ($stmt as $dbs) {
53 | if ( strpos($dbs[0], "_") && !in_array(substr($dbs[0], 0, strpos($dbs[0], "_")), $arr) )
54 | array_push($arr, substr($dbs[0], 0, strpos($dbs[0], "_")));
55 | }
56 |
57 | $json = getJson($arr);
58 | }
59 |
60 | //Execute query CREATE, ALTER, INSERT.
61 | if (isset($_GET['query']) && $_GET['query'] != "" &&
62 | isset($_GET['nameDB']) && $_GET['nameDB'] != ""
63 | ){
64 |
65 | $stmt = $db->query('SHOW TABLES FROM ' . $database . ' WHERE Tables_in_' . $database . ' LIKE "' . $_GET['nameDB'] . '_%"');
66 | if ( $stmt->fetchColumn() == ""){
67 |
68 | $query = explode('|', $_GET['query']);
69 |
70 | foreach($query as $q){
71 | $sql = strtolower($q);
72 | $stmt = $db->query($sql);
73 | }
74 |
75 | $json = '{ "Success": "Database aggiunto!" }';
76 | }else
77 | $json = '{ "Error": "Database già esistente!" }';
78 | }
79 |
80 | //Show all arguments.
81 | if ( isset($_GET['arguments']) ) {
82 | $stmt = $db->query('SELECT * FROM argomenti;');
83 | $json = getJson($stmt->fetchAll(PDO::FETCH_ASSOC));
84 | }
85 |
86 | //Show all solutions.
87 | if (isset($_GET['solutions']) &&
88 | (isset($_GET['argument']) && $_GET['argument'] != "")
89 | ) {
90 | $stmt = $db->query('SELECT id, soluzione
91 | FROM soluzioni
92 | WHERE id IN (SELECT soluzione FROM domandeALG WHERE argomento = ' . $_GET['argument'] . ')
93 | OR id IN (SELECT soluzione FROM domandeSQL WHERE argomento = ' . $_GET['argument'] . ')');
94 |
95 | $json = getJson($stmt->fetchAll(PDO::FETCH_ASSOC));
96 | print_json($json);
97 | return;
98 | }
99 |
100 | //Submit newQuestion, INSERT argomento, soluzioni and domandeALG/SQL.
101 | function submitNewQuestion($db, $argumentId, $solutionId) {
102 | $stmt = $db->query("INSERT INTO " . $_GET['type'] . " (testo,db_connesso,soluzione,argomento)
103 | VALUES ('" . $_GET['text'] . "','" . $_GET['db'] . "'," . $solutionId . "," . $argumentId . ");");
104 | $json = '{ "Success": "Domanda aggiunta!" }';
105 | print_json($json);
106 | }
107 |
108 | function getIdArgument($db){
109 | $stmt = $db->query("SELECT id FROM argomenti WHERE argomento = '" . $_GET['new_argument'] . "';");
110 | return $stmt->fetchColumn();
111 | }
112 |
113 | function getIdSolution($db){
114 | $stmt = $db->query("SELECT id FROM soluzioni WHERE soluzione = '" . $_GET['new_solution'] . "' ");
115 | return $stmt->fetchColumn();
116 | }
117 |
118 | if ((isset($_GET['text']) && $_GET['text'] != "") &&
119 | (isset($_GET['type']) && $_GET['type'] != "") &&
120 | (isset($_GET['new_argument']) && $_GET['new_argument'] != "") &&
121 | (isset($_GET['new_solution']) && $_GET['new_solution'] != "") &&
122 | (isset($_GET['db']) && $_GET['db'] != "")
123 | ) {
124 |
125 | if ( getIdArgument($db) == "" ){
126 | if ( getIdSolution($db) == "" ){
127 | $stmt = $db->query("INSERT INTO argomenti(argomento) VALUES ('" . $_GET['new_argument'] . "') ;");
128 | $stmt = $db->query("INSERT INTO soluzioni(soluzione) VALUES ('" . $_GET['new_solution'] . "') ;");
129 |
130 | submitNewQuestion($db, getIdArgument($db), getIdSolution($db));
131 | return;
132 | }
133 | else
134 | $json = '{ "Error": "Soluzione esistente!" }';
135 | }
136 | else
137 | $json = '{ "Error": "Argomento esistente!" }';
138 | }
139 |
140 | if ((isset($_GET['text']) && $_GET['text'] != "") &&
141 | (isset($_GET['type']) && $_GET['type'] != "") &&
142 | (isset($_GET['ex_argument']) && $_GET['ex_argument'] != "") &&
143 | (isset($_GET['ex_solution']) && $_GET['ex_solution'] != "") &&
144 | (isset($_GET['db']) && $_GET['db'] != "")
145 | ) {
146 | submitNewQuestion($db, $_GET['ex_argument'], $_GET['ex_solution']);
147 | return;
148 | }
149 |
150 | if ((isset($_GET['text']) && $_GET['text'] != "") &&
151 | (isset($_GET['type']) && $_GET['type'] != "") &&
152 | (isset($_GET['ex_argument']) && $_GET['ex_argument'] != "") &&
153 | (isset($_GET['new_solution']) && $_GET['new_solution'] != "") &&
154 | (isset($_GET['db']) && $_GET['db'] != "")
155 | ) {
156 |
157 | if ( getIdSolution($db) == "" ) {
158 | $stmt = $db->query("INSERT INTO soluzioni(soluzione) VALUES ('" . $_GET['new_solution'] . "') ;");
159 |
160 | submitNewQuestion($db, $_GET['ex_argument'], getIdSolution($db));
161 | return;
162 | }
163 | else
164 | $json = '{ "Error": "Soluzione esistente!" }';
165 | }
166 | } else
167 | $json = '{ "Error": "Non è stato effettuato il login!" }';
168 |
169 | } catch(PDOException $exception) {
170 | $json = '{ "Error":"' . $exception->getMessage() . '" }';
171 | }
172 |
173 | header('Content-Type: application/json');
174 | echo $json;
175 | ?>
176 |
--------------------------------------------------------------------------------
/partials/dbManager.html:
--------------------------------------------------------------------------------
1 |
2 |
41 |
42 |
43 |
76 |
77 |
183 |
184 |
--------------------------------------------------------------------------------
/partials/exercise.html:
--------------------------------------------------------------------------------
1 | Se usi la selezione utilizza gli apici per assegnare un valore (esempio: σ a = 'x' (A))
98 || {{ key }} | 125 |
| {{ value }} | 129 |
| {{ key }} | 142 |
| {{ value }} | 146 |