diff --git a/utils/dataUpdater.js b/utils/dataUpdater.js new file mode 100644 index 0000000..333555e --- /dev/null +++ b/utils/dataUpdater.js @@ -0,0 +1,233 @@ +/* ---------------------------------------------------------------------------- + + Question Server question file merger + GitLab: + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + ------------------------------------------------------------------------- */ + +const classes = require('./question-classes/classes.js') +const utils = require('./utils.js') + +Main() + +function Main () { + console.clear() + const params = GetParams() + console.log(params) + var db = [] + + PrintLN() + console.log(params[0] + ': ') + try { + db = ParseJSONData(utils.ReadFile(params[0])) + console.log('JSON data added') + } catch (e) { + console.log(e) + console.log('Trying with old format...') + db = ReadData(utils.ReadFile(params[0])).result + } + PrintLN() + + PrintDB(db) + + PrintLN() + + RefactorDb(db) + + utils.WriteFile(JSON.stringify(db), 'newData') +} + +function RefactorDb (db) { + db.Subjects.forEach((subj) => { + subj.Questions.forEach((question) => { + if (question.I) { + question.data = { + type: 'image', + images: question.I + } + delete question.I + } else { + question.data = { + type: 'simple' + } + } + }) + }) +} + +// ----------------------------------------------------------------------------------------- + +function PrintLN () { + console.log('------------------------------------------------------') +} + +function PrintDB (r, olds) { + console.log('Data subject count: ' + r.length) + var maxLength = 0 + for (let i = 0; i < r.length; i++) { + if (maxLength < r.Subjects[i].Name.length) { maxLength = r.Subjects[i].Name.length } + } + + let qcount = 0 + + for (let i = 0; i < r.length; i++) { + let line = i + if (line < 10) { line += ' ' } + + line += ': ' + var currLength = line.length + maxLength + 4 + line += r.Subjects[i].Name + + while (line.length < currLength) { + if (i % 4 === 0) { line += '.' } else { line += ' ' } + } + + if (olds && olds.length > 0) { + // TODO: check if correct row! should be now, but well... + if (olds[i] < 10) { line += ' ' } + if (olds[i] < 100) { line += ' ' } + + line += olds[i] + line += ' -> ' + } + + if (r.Subjects[i].length < 10) { line += ' ' } + if (r.Subjects[i].length < 100) { line += ' ' } + + line += r.Subjects[i].length + qcount += r.Subjects[i].length + + line += ' db' + + console.log(line) + } + + console.log('Total questions: ' + qcount) + + PrintLN() +} + +function GetParams () { + return process.argv.splice(2) +} + +function ParseJSONData (data) { + var d = JSON.parse(data) + var r = new classes.QuestionDB((x) => true, (x, y) => console.log(x, y)) + var rt = [] + + for (var i = 0; i < d.Subjects.length; i++) { + let s = new classes.Subject(d.Subjects[i].Name) + var j = 0 + for (j = 0; j < d.Subjects[i].Questions.length; j++) { + var currQ = d.Subjects[i].Questions[j] + s.AddQuestion(new classes.Question(currQ.Q, currQ.A, currQ.I)) + } + rt.push({ + name: d.Subjects[i].Name, + count: j + }) + r.AddSubject(s) + } + return r +} + +function ReadData (data) { + const d = data.split('\n') + const r = new classes.QuestionDB((x) => true, (x, y) => console.log(x, y)) + var logs = [] + var currSubj = '' // the current subjects name + var ExpectedIdentifier = ['+', '?'] + let currQuestion = new classes.Question() + + var i = -1 + while (i < d.length) { + let currIdentifier + let skipped = 0 + do { + if (skipped >= 1) { logs.push(i + ': ' + d[i]) } + i++ + if (i >= d.length) { + if (currQuestion.IsComplete()) { r.AddQuestion(currSubj, currQuestion) } + return { + result: r, + logs: logs + } + } + currIdentifier = d[i][0] + skipped++ + } while (!ExpectedIdentifier.includes(currIdentifier) && i < d.length) + + let currData = d[i].substring(1).trim() + + if (currIdentifier === '+') { + if (currQuestion.IsComplete()) { r.AddQuestion(currSubj, currQuestion) } + currQuestion = new classes.Question() + currSubj = currData + ExpectedIdentifier = ['?'] + continue + } + + if (currIdentifier === '?') { + if (currQuestion.IsComplete()) { + r.AddQuestion(currSubj, currQuestion) + currQuestion = new classes.Question() + } + // overwriting is allowed here, bcus: + // ?????!> + currQuestion.Q = currData + ExpectedIdentifier = ['!', '?'] + continue + } + + if (currIdentifier === '!') { + // if dont have question continue + if (!currQuestion.HasQuestion()) { throw new Error('No question! (A)') } + // dont allow overwriting + // ?!!!! + if (!currQuestion.HasAnswer()) { + currData = currData.replace('A helyes válaszok: ', '') + currData = currData.replace('A helyes válasz: ', '') + + currQuestion.A = currData + } + ExpectedIdentifier = ['?', '>', '+'] + continue + } + + if (currIdentifier === '>') { + // if dont have question or answer continue + if (!currQuestion.HasQuestion()) { throw new Error('No question! (I)') } + if (!currQuestion.HasAnswer()) { throw new Error('No asnwer! (I)') } + // dont allow overwriting + // ?!>>> + if (!currQuestion.HasImage()) { + try { + currQuestion.I = JSON.parse(currData) + } catch (e) { + currQuestion.I = currData.split(',') + } + } + ExpectedIdentifier = ['?', '+'] + continue + } + } + + return { + result: r, + logs: logs + } +}