change conversion with new GTG structure

This commit is contained in:
Tykayn 2021-09-10 14:54:04 +02:00 committed by tykayn
parent d33eee1127
commit 7fb7a22f82
8 changed files with 4025 additions and 309 deletions

1
app.js
View File

@ -6,7 +6,6 @@ var logger = require('morgan');
var fs = require("fs"); var fs = require("fs");
var parseString = require("xml2js").parseString; var parseString = require("xml2js").parseString;
var indexRouter = require('./routes/index'); var indexRouter = require('./routes/index');
var usersRouter = require('./routes/users');
var app = express(); var app = express();

3
convert.sh Normal file
View File

@ -0,0 +1,3 @@
#!/usr/bin/env bash
echo "conversion de fichier source"

3682
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -3,7 +3,7 @@
"version": "0.0.0", "version": "0.0.0",
"private": true, "private": true,
"scripts": { "scripts": {
"start": "node app.js" "start": "nodemon app.js"
}, },
"dependencies": { "dependencies": {
"cookie-parser": "^1.4.5", "cookie-parser": "^1.4.5",
@ -17,6 +17,7 @@
"pug": "^3.0.0" "pug": "^3.0.0"
}, },
"devDependencies": { "devDependencies": {
"nodemon": "^2.0.12",
"xml2js": "^0.4.23" "xml2js": "^0.4.23"
} }
} }

View File

@ -1,6 +1,12 @@
html, body {
font: 14px "Lucida Grande", Helvetica, Arial, sans-serif;
background: #111;
color: #fff;
height: 100vh;
}
body { body {
padding: 50px; padding: 50px;
font: 14px "Lucida Grande", Helvetica, Arial, sans-serif;
} }
a { a {

View File

@ -12,39 +12,48 @@ let computeDataOnExtract = true;
// let computeDataOnExtract = false; // let computeDataOnExtract = false;
let jsonAllData = { let jsonAllData = {
tasks : {}, all: {},
stats : {}, tasks: {},
stats: {},
projects: {}, projects: {},
tags : {}, tags: {},
} }
/* GET home page. */ /* GET home page. */
/** /**
* obtenir la liste de tags que l'on a entré * convertir le fichier XML et
* obtenir la liste de tags que l'on a entré dans GTG
*/ */
router.get('/xml', async function (req, res, next) { router.get('/xml', async function (req, res, next) {
fs.stat('sources/gtg_tasks.xml', function(err, stat) {
if(err == null) { console.log(' ### lecture de sources/gtg_data.xml');
console.log('File sources/gtg_tasks.xml exists'); fs.stat('sources/gtg_data.xml', function (err, stat) {
} else if(err.code === 'ENOENT') { if (err == null) {
console.log('File sources/gtg_data.xml exists');
} else if (err.code === 'ENOENT') {
// file does not exist // file does not exist
res.send('le fichier sources/gtg_tasks.xml est introuvable. Impossible d en extraire des infos. Importez d abord les fichiers de données xml de Getting Things Gnome dans le dossier sources') res.send('le fichier sources/gtg_data.xml est introuvable. Impossible d en extraire des infos. Importez d abord les fichiers de données xml de Getting Things Gnome dans le dossier sources')
} else { } else {
console.log('Some other error: ', err.code); console.log('Some other error: ', err.code);
} }
}); });
convertOneXmlToJson('gtg_tasks', res) convertOneXmlToJson('gtg_data', res)
convertOneXmlToJson('tags', res)
convertOneXmlToJson('projects', res)
console.log('success conversion xml') console.log('success conversion xml')
res.redirect('/') res.render('layout', {
title: 'Conversion en Json',
message: 'ok fichier converti'
})
// res.redirect('/')
}) })
/**
* voir le compte rendu des tâches
*/
router.get('/', async function (req, res, next) { router.get('/', async function (req, res, next) {
// récupérer le contenu des json console.log(" ### récupérer le contenu des json sources/gtg_data_gtg.json")
jsonAllData.tags = require('../sources/tags_gtg.json') jsonAllData.all = require('../sources/gtg_data_gtg.json')
jsonAllData.tasks = require('../sources/gtg_tasks_gtg.json') if (!jsonAllData.all.gtgData) {
if(!jsonAllData.tasks){
res.redirect('/xml') res.redirect('/xml')
} }
@ -59,8 +68,8 @@ router.get('/', async function (req, res, next) {
console.log('json files read') console.log('json files read')
res.render('index', { res.render('index', {
title: "Conversion de GTG tâches", title: "Conversion de GTG tâches",
json : jsonAllData, json: jsonAllData,
markdown : markdownExportData, markdown: markdownExportData,
weeklyDevReport, weeklyDevReport,
getPercent, getPercent,
computeBgColorOnProportionOfOpenTasks, computeBgColorOnProportionOfOpenTasks,
@ -76,112 +85,125 @@ async function readfileJson(fileToOpen) {
}); });
} }
function computeData(jsonAllData) { function computeData(jsonConvertedData) {
let gtgData = jsonConvertedData.all.gtgData
console.log('================== calcul des tâches depuis le fichier json ================== ')
console.log('gtgData : ');
console.log(gtgData);
// trouver le nombre de tâches ayant un tag en particulier // trouver le nombre de tâches ayant un tag en particulier
// et rajouter ce nombre à chaque tag, dans countTasks : N // et rajouter ce nombre à chaque tag, dans countTasks : N
// let tagCountTasks = Object.create(jsonAllData.tags);
// let counterOfTasks = jsonConvertedData.tasklist
// compter les tâches
// console.log('counterOfTasks',counterOfTasks);
jsonAllData.stats = { jsonAllData.stats = {
tasksCount : jsonAllData.tasks.project.task.length, // tasksCount : counterOfTasks.length,
tasksClosed : 0, tasksCount: 0,
tasksOpen : 0, tasksClosed: 0,
tasksOpen: 0,
maxTasksCountPerTag: 0, maxTasksCountPerTag: 0,
listOpen : [], listTags: [],
listOpenWeekly : [], listOpen: [],
listOpenMonthly : [], listOpenWeekly: [],
listClosed : [], listOpenMonthly: [],
listClosedWeekly : [], listClosed: [],
listDevWeeklyClosed : [], listClosedWeekly: [],
listDevWeeklyOpen : [], listDevWeeklyClosed: [],
listClosedMonthly : [], listDevWeeklyOpen: [],
listClosedMonthly: [],
} }
let now = new Date(); let now = new Date();
jsonAllData.stats.listTags = gtgData.taglist[0].tag
console.log('tasks', gtgData.tasklist[0].task);
for (let taskItem of gtgData.tasklist[0].task) {
for (let t of jsonAllData.tasks.project.task) {
// console.log('t', t)
let tags = t["$"].tags.split(',')
// count open and closed tasks // count open and closed tasks
let dateOfTask = new Date() let now = new Date()
if (t['$'].status == 'Active') { if (taskItem['$'].status == 'Active') {
jsonAllData.stats.listOpen.push(t) jsonAllData.stats.listOpen.push(taskItem)
let addeddate = new Date(t.addeddate) let addeddate = new Date(taskItem.addeddate)
let daysDiff = getNumberOfDaysDiffTwoDates(addeddate, now); let daysDiff = getNumberOfDaysDiffTwoDates(addeddate, now);
if (daysDiff <= 7) { if (daysDiff <= 7) {
jsonAllData.stats.listOpenWeekly.push(t) jsonAllData.stats.listOpenWeekly.push(taskItem)
// listDevWeeklyOpen // listDevWeeklyOpen
// tâches uniquement de dev // tâches uniquement de dev
if((searchTagsForHebdoReport).test(t['$'].tags) if ((searchTagsForHebdoReport).test(taskItem['$'].tags)
){ ) {
jsonAllData.stats.listDevWeeklyOpen.push(t) jsonAllData.stats.listDevWeeklyOpen.push(taskItem)
} }
} else if (daysDiff >= 7 & daysDiff <= 31) { } else if (daysDiff >= 7 & daysDiff <= 31) {
jsonAllData.stats.listOpenMonthly.push(t) jsonAllData.stats.listOpenMonthly.push(taskItem)
} }
} else if (t['$'].status == 'Done') { } else if (taskItem['$'].status == 'Done') {
jsonAllData.stats.listClosed.push(t) jsonAllData.stats.listClosed.push(taskItem)
let donedate = new Date(t.donedate) let donedate = new Date(taskItem.donedate)
let daysDiff = getNumberOfDaysDiffTwoDates(donedate, now); let daysDiff = getNumberOfDaysDiffTwoDates(donedate, now);
if (daysDiff <= 7) { if (daysDiff <= 7) {
jsonAllData.stats.listClosedWeekly.push(t) jsonAllData.stats.listClosedWeekly.push(taskItem)
// tâches uniquement de dev // tâches uniquement de dev
if((searchTagsForHebdoReport).test(t['$'].tags) if ((searchTagsForHebdoReport).test(taskItem['$'].tags)
){ ) {
jsonAllData.stats.listDevWeeklyClosed.push(t) jsonAllData.stats.listDevWeeklyClosed.push(taskItem)
} }
} else if (daysDiff >= 7 & daysDiff <= 31) { } else if (daysDiff >= 7 & daysDiff <= 31) {
jsonAllData.stats.listClosedMonthly.push(t) jsonAllData.stats.listClosedMonthly.push(taskItem)
} }
} }
for (let tag of tags) { for (let tag of jsonAllData.stats.listTags) {
// console.log('tag', tag) // console.log('tag', tag)
jsonAllData.tags.tagstore.tag.map(elem => { // jsonAllData.tags.tagstore.tag.map(elem => {
// console.log('elem', elem) // // console.log('elem', elem)
if (elem['$'].name == tag) { // if (elem['$'].name == tag) {
if (!elem.tasks) { // if (!elem.tasks) {
elem.tasks = 0 // elem.tasks = 0
} // }
if (!elem.tasksListById) { // if (!elem.tasksListById) {
elem.tasksListById = [] // elem.tasksListById = []
} // }
if (!elem.tasksListByTitle) { // if (!elem.tasksListByTitle) {
elem.tasksListByTitle = [] // elem.tasksListByTitle = []
} // }
if (!elem.tasksListIsActiveByTitle) { // if (!elem.tasksListIsActiveByTitle) {
elem.tasksListIsActiveByTitle = [] // elem.tasksListIsActiveByTitle = []
} // }
if (!elem.tasksListIsDoneByTitle) { // if (!elem.tasksListIsDoneByTitle) {
elem.tasksListIsDoneByTitle = [] // elem.tasksListIsDoneByTitle = []
} // }
elem.tasks++ // elem.tasks++
elem.tasksListById.push(t['$'].id) // elem.tasksListById.push(taskItem['$'].id)
elem.tasksListByTitle.push(t.title) // elem.tasksListByTitle.push(taskItem.title)
if (t['$'].status == "Active") { // if (taskItem['$'].status == "Active") {
elem.tasksListIsActiveByTitle.push(t.title) // elem.tasksListIsActiveByTitle.push(taskItem.title)
//
} // }
if (t['$'].status == "Done") { // if (taskItem['$'].status == "Done") {
elem.tasksListIsDoneByTitle.push(t.title) // elem.tasksListIsDoneByTitle.push(taskItem.title)
} // }
} // }
if (elem.tasks > jsonAllData.stats.maxTasksCountPerTag) { // if (elem.tasks > gtgData.stats.maxTasksCountPerTag) {
jsonAllData.stats.maxTasksCountPerTag = elem.tasks // jsonAllData.stats.maxTasksCountPerTag = elem.tasks
} // }
}) // })
} }
} }
// sort tags by name // sort tags by name
return jsonAllData console.log('stats', jsonAllData.stats);
return jsonAllData.stats
} }
@ -194,7 +216,7 @@ function convertOneXmlToJson(fileToOpen, res) {
fs.readFile(`sources/${fileToOpen}.xml`, "utf-8", function (err, data) { fs.readFile(`sources/${fileToOpen}.xml`, "utf-8", function (err, data) {
if (err) console.log(err); if (err) console.log(err);
const results = transformToJson(data, fileToOpen, res) const results = transformToJson(data, fileToOpen, res)
console.log('fichier converti en json', fileToOpen) console.log('#### fichier converti en json', res)
}); });
} }
@ -230,86 +252,89 @@ function computeBgColorOnProportionOfOpenTasks(someProportionNumber) {
return result; return result;
} }
let datenow = new Date(); let datenow = new Date();
let markdownExportData = '' let markdownExportData = ''
let weeklyDevReport = '' let weeklyDevReport = ''
function exportToMarkdown(res) { function exportToMarkdown(res) {
console.log('jsonAllData.stats', jsonAllData.stats);
markdownExportData = `# Export de Tâches GTG \n date: ` + datenow.toLocaleString() markdownExportData = `# Export de Tâches GTG \n date: ` + datenow.toLocaleString()
// fichier de rapport des tâches fermées durant les 7 derniers jours // // fichier de rapport des tâches fermées durant les 7 derniers jours
weeklyDevReport = `\n# Rapport hebdomadaire de dev `; // weeklyDevReport = `\n# Rapport hebdomadaire de dev `;
weeklyDevReport += `\n## 1/ Actions passées ou en cours // weeklyDevReport += `\n## 1/ Actions passées ou en cours
\n ` // \n `
weeklyDevReport += `\r\n## ${jsonAllData.stats.listDevWeeklyClosed.length} ont été fermées // weeklyDevReport += `\r\n## ${jsonAllData.stats.listDevWeeklyClosed.length} ont été fermées
\n___`; // \n___`;
jsonAllData.stats.listDevWeeklyClosed.map(elem => { // jsonAllData.stats.listDevWeeklyClosed.map(elem => {
weeklyDevReport += `\n| ${elem['$'].tags} | ${elem.title}|`;
})
weeklyDevReport += `
\n___
\n
\n## 2/ Actions à venir
\n `
weeklyDevReport += `\r\n## ${jsonAllData.stats.listDevWeeklyOpen.length} ont été ouvertes
\n___`;
jsonAllData.stats.listDevWeeklyOpen.map(elem => {
// weeklyDevReport += `\n| ${elem['$'].tags} | ${elem.title}|`; // weeklyDevReport += `\n| ${elem['$'].tags} | ${elem.title}|`;
weeklyDevReport += `\n| ${elem.title}|`; // })
}) // weeklyDevReport += `
weeklyDevReport += ` // \n___
\n___ // \n
\n // \n## 2/ Actions à venir
\n## 3/ Points de blocage / points en retard corrigés cette semaine // \n `
\n // weeklyDevReport += `\r\n## ${jsonAllData.stats.listDevWeeklyOpen.length} ont été ouvertes
\n## 4/ Points de blocage existants / points en retard à traiter // \n___`;
\n // jsonAllData.stats.listDevWeeklyOpen.map(elem => {
\n## 5/ Points forts de la semaine // // weeklyDevReport += `\n| ${elem['$'].tags} | ${elem.title}|`;
\n // weeklyDevReport += `\n| ${elem.title}|`;
\n## 6/ Points de vigilance de la semaine // })
\n // weeklyDevReport += `
\n## 7/ Points forts de la réunion // \n___
\n // \n
\n## 8/ Points de vigilance de la réunion `; // \n## 3/ Points de blocage / points en retard corrigés cette semaine
// \n
markdownExportData += `\n ${weeklyDevReport}`; // \n## 4/ Points de blocage existants / points en retard à traiter
markdownExportData += `\n---`; // \n
markdownExportData += `\n `; // \n## 5/ Points forts de la semaine
markdownExportData += `\n# Rapport des tâches durant les 7 derniers jours `; // \n
markdownExportData += `\n `; // \n## 6/ Points de vigilance de la semaine
markdownExportData += `\n## ${jsonAllData.stats.listClosedWeekly.length} ont été fermées `; // \n
markdownExportData += `\n `; // \n## 7/ Points forts de la réunion
jsonAllData.stats.listClosedWeekly.map(elem => { // \n
markdownExportData += `\n * ${elem.title}`; // \n## 8/ Points de vigilance de la réunion `;
}) //
markdownExportData += `\n## ${jsonAllData.stats.listOpenWeekly.length} ont été ouvertes `; // markdownExportData += `\n ${weeklyDevReport}`;
markdownExportData += `\n `; // markdownExportData += `\n---`;
jsonAllData.stats.listOpenWeekly.map(elem => { // markdownExportData += `\n `;
markdownExportData += `\n * ${elem.title}`; // markdownExportData += `\n# Rapport des tâches durant les 7 derniers jours `;
}) // markdownExportData += `\n `;
markdownExportData += `\n--- `; // markdownExportData += `\n## ${jsonAllData.stats.listClosedWeekly.length} ont été fermées `;
// fichier de rapport des tâches fermées durant les 31 derniers jours // markdownExportData += `\n `;
markdownExportData += `\n# Rapport des autres tâches durant le mois `; // jsonAllData.stats.listClosedWeekly.map(elem => {
markdownExportData += `\n `; // markdownExportData += `\n * ${elem.title}`;
markdownExportData += `\n## ${jsonAllData.stats.listClosedMonthly.length} ont été fermées `; // })
markdownExportData += `\n `; // markdownExportData += `\n## ${jsonAllData.stats.listOpenWeekly.length} ont été ouvertes `;
jsonAllData.stats.listClosedMonthly.map(elem => { // markdownExportData += `\n `;
markdownExportData += `\n * ${elem.title}`; // jsonAllData.stats.listOpenWeekly.map(elem => {
}) // markdownExportData += `\n * ${elem.title}`;
markdownExportData += `\n## ${jsonAllData.stats.listOpenMonthly.length} ont été ouvertes `; // })
markdownExportData += `\n `; // markdownExportData += `\n--- `;
jsonAllData.stats.listOpenMonthly.map(elem => { // // fichier de rapport des tâches fermées durant les 31 derniers jours
markdownExportData += `\n * ${elem.title}`; // markdownExportData += `\n# Rapport des autres tâches durant le mois `;
}) // markdownExportData += `\n `;
// markdownExportData += `\n## ${jsonAllData.stats.listClosedMonthly.length} ont été fermées `;
markdownExportData += `\n--- `; // markdownExportData += `\n `;
// stats de fermeture des tâches // jsonAllData.stats.listClosedMonthly.map(elem => {
markdownExportData += `\n# Stats de fermeture des tâches `; // markdownExportData += `\n * ${elem.title}`;
markdownExportData += `\n `; // })
markdownExportData += `\n--- `; // markdownExportData += `\n## ${jsonAllData.stats.listOpenMonthly.length} ont été ouvertes `;
markdownExportData += `\n `; // markdownExportData += `\n `;
markdownExportData += `\n# Export de toutes les ${jsonAllData.stats.listOpen.length} tâches ouvertes GTG \n `; // jsonAllData.stats.listOpenMonthly.map(elem => {
markdownExportData += `\n `; // markdownExportData += `\n * ${elem.title}`;
// })
//
// markdownExportData += `\n--- `;
// // stats de fermeture des tâches
// markdownExportData += `\n# Stats de fermeture des tâches `;
// markdownExportData += `\n `;
// markdownExportData += `\n--- `;
// markdownExportData += `\n `;
// markdownExportData += `\n# Export de toutes les ${jsonAllData.stats.listOpen.length} tâches ouvertes GTG \n `;
// markdownExportData += `\n `;
// jsonAllData.stats.listOpen.map(elem => { // jsonAllData.stats.listOpen.map(elem => {
// dataTagsMd += `\n## ${elem.title} `; // dataTagsMd += `\n## ${elem.title} `;
@ -319,30 +344,30 @@ weeklyDevReport += `
// dataTagsMd += `\n prévu pour : ${elem.duedate | ''} `; // dataTagsMd += `\n prévu pour : ${elem.duedate | ''} `;
// dataTagsMd += `\n ${elem.content} `; // dataTagsMd += `\n ${elem.content} `;
// }) // })
markdownExportData += `\n--- `; // markdownExportData += `\n--- `;
markdownExportData += `\n `; // markdownExportData += `\n `;
markdownExportData += `\n# Export de toutes les ${jsonAllData.stats.listClosed.length} tâches fermées GTG \n `; // markdownExportData += `\n# Export de toutes les ${jsonAllData.stats.listClosed.length} tâches fermées GTG \n `;
markdownExportData += `\n `; // markdownExportData += `\n `;
// //
// jsonAllData.stats.listClosed.map(elem=>{ // jsonAllData.stats.listClosed.map(elem=>{
// dataTagsMd += `\n * ${elem.title} `; // dataTagsMd += `\n * ${elem.title} `;
// }) // })
markdownExportData += `\n `; // markdownExportData += `\n `;
markdownExportData += `\n# Export de Tags GTG \n `; // markdownExportData += `\n# Export de Tags GTG \n `;
markdownExportData += `\n `; // markdownExportData += `\n `;
markdownExportData += `\n `; // markdownExportData += `\n `;
let sortedTagsByTitle = _.sortBy(jsonAllData.tags.tagstore.tag, [(o) => { // let sortedTagsByTitle = _.sortBy(jsonAllData.tags.tagstore.tag, [(o) => {
o["$"].name // o["$"].name
}]) // }])
//
sortedTagsByTitle.map(elem => { // sortedTagsByTitle.map(elem => {
markdownExportData += `\n * ${elem['$'].name} , ${elem.tasks | 0}`; // markdownExportData += `\n * ${elem['$'].name} , ${elem.tasks | 0}`;
}) // })
//
markdownExportData += `\n `; // markdownExportData += `\n `;
markdownExportData += `\n rapport généré avec gtg2nodejs par tykayn - contact@cipherbliss.com `; // markdownExportData += `\n rapport généré avec gtg2nodejs par tykayn - contact@cipherbliss.com `;
// write file to disk // write file to disk
fs.writeFile(`output/export_hebdo.md`, markdownExportData, `utf8`, (err) => { fs.writeFile(`output/export_hebdo.md`, markdownExportData, `utf8`, (err) => {
@ -358,6 +383,13 @@ weeklyDevReport += `
} }
/**
* transformToJson
* @param xml
* @param fileToOpen
* @param res
* @returns {*}
*/
function transformToJson(xml, fileToOpen, res) { function transformToJson(xml, fileToOpen, res) {
return parseString(xml, function (err, result) { return parseString(xml, function (err, result) {
if (err) console.log(err); if (err) console.log(err);
@ -366,7 +398,7 @@ function transformToJson(xml, fileToOpen, res) {
console.log('Done'); console.log('Done');
// write file to disk // write file to disk
fs.writeFile(`sources/${fileToOpen}_gtg.json`, JSON.stringify(result, null, 4), 'utf8', (err) => { fs.writeFile(`output/${fileToOpen}_gtg.json`, JSON.stringify(result, null, 4), 'utf8', (err) => {
if (err) { if (err) {
console.log(`Error writing file: ${err}`); console.log(`Error writing file: ${err}`);
@ -374,7 +406,7 @@ function transformToJson(xml, fileToOpen, res) {
res.send(err) res.send(err)
} else { } else {
console.log(`File \`sources/${fileToOpen}_gtg.json\` is written successfully!`); console.log(` ### File \`output/${fileToOpen}_gtg.json\` is written successfully!`);
} }

View File

@ -1,9 +0,0 @@
var express = require('express');
var router = express.Router();
/* GET users listing. */
router.get('/', function(req, res, next) {
res.send('respond with a resource');
});
module.exports = router;

View File

@ -5,3 +5,7 @@ html
link(rel='stylesheet', href='/stylesheets/style.css') link(rel='stylesheet', href='/stylesheets/style.css')
body body
block content block content
h1.title.is-1= title
.container= message
hr
a(href="/") retour à l'accueil