feat ⚡ add stats for created and closed by time spans in statistics
This commit is contained in:
parent
07ae0d6d0b
commit
c78830157f
|
@ -9,6 +9,13 @@ Compte rendu html des tâches réalisées dans des fichiers Orgmode
|
||||||
* avoir Nodejs version stable
|
* avoir Nodejs version stable
|
||||||
|
|
||||||
# Utilisation
|
# Utilisation
|
||||||
|
## compiler les fichiers org et les convertir en json
|
||||||
|
```bash
|
||||||
|
make convert
|
||||||
|
```
|
||||||
|
la sortie est générée dans "outputAbsolutePath" définie dans "parse_orgmode_to_json.mjs"
|
||||||
|
|
||||||
|
## voir le rendu
|
||||||
Lancer l'exécution du fichier app avec node, et consulter l'output html.
|
Lancer l'exécution du fichier app avec node, et consulter l'output html.
|
||||||
```bash
|
```bash
|
||||||
npm start
|
npm start
|
||||||
|
|
|
@ -0,0 +1,25 @@
|
||||||
|
import fs from "node-fs";
|
||||||
|
|
||||||
|
/**
|
||||||
|
convertir un json représentant toutes les tâches orgmode en un json rangé par dates
|
||||||
|
**/
|
||||||
|
const sourceFileName = 'all_tasks.org'
|
||||||
|
const sourceFilePath = './sources/' + sourceFileName;
|
||||||
|
const outputAbsolutePath = '/home/tykayn/Nextcloud/ressources/social sorting/output/';
|
||||||
|
const outputFileNameJson = 'export_' + sourceFileName + '_parsed.json';
|
||||||
|
|
||||||
|
function openJsonFile(){
|
||||||
|
|
||||||
|
fs.readFile(outputAbsolutePath+outputFileNameJson, 'utf8', function (err, data) {
|
||||||
|
|
||||||
|
|
||||||
|
if (err) {
|
||||||
|
return console.log(err);
|
||||||
|
}
|
||||||
|
const json_content = JSON.parse(data);
|
||||||
|
|
||||||
|
console.log(outputAbsolutePath+outputFileNameJson, json_content.tasks_list.length)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
openJsonFile()
|
|
@ -13,6 +13,7 @@ import moment from 'moment';
|
||||||
const sourceFileName = 'all_tasks.org'
|
const sourceFileName = 'all_tasks.org'
|
||||||
const sourceFilePath = './sources/' + sourceFileName;
|
const sourceFilePath = './sources/' + sourceFileName;
|
||||||
const outputAbsolutePath = '/home/tykayn/Nextcloud/ressources/social sorting/output/';
|
const outputAbsolutePath = '/home/tykayn/Nextcloud/ressources/social sorting/output/';
|
||||||
|
const outputFileNameJson = 'export_' + sourceFileName + '_parsed.json';
|
||||||
|
|
||||||
let headers = []
|
let headers = []
|
||||||
let tasksObjectsForJsonExport = []
|
let tasksObjectsForJsonExport = []
|
||||||
|
@ -24,7 +25,7 @@ writeJsonAfterParse = true;
|
||||||
* fetch the source orgmode file to read its contents
|
* fetch the source orgmode file to read its contents
|
||||||
*************************************************************/
|
*************************************************************/
|
||||||
|
|
||||||
console.log('parse some org file', sourceFilePath)
|
console.log('---------- parse some org file', sourceFilePath)
|
||||||
if (!sourceFilePath) {
|
if (!sourceFilePath) {
|
||||||
console.error('pas de fichier à ouvrir')
|
console.error('pas de fichier à ouvrir')
|
||||||
}
|
}
|
||||||
|
@ -52,7 +53,17 @@ let logBookSection = {} // TODO logbook listing
|
||||||
|
|
||||||
let statistics = {
|
let statistics = {
|
||||||
tags: {},
|
tags: {},
|
||||||
words: {}
|
words: {},
|
||||||
|
dates: {
|
||||||
|
havingDate: 0,
|
||||||
|
havingNoDate: 0,
|
||||||
|
oldEst: 0,
|
||||||
|
mostRecent: 0,
|
||||||
|
years:{},
|
||||||
|
weeks:{},
|
||||||
|
months:{},
|
||||||
|
days:{}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
let headerKeywordSearch = '[' + stateKeywordList.join('|') + ']'
|
let headerKeywordSearch = '[' + stateKeywordList.join('|') + ']'
|
||||||
|
@ -103,6 +114,68 @@ function makeWordsStatistics(sentence) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* pour chaque période de temps, compter les tâches créées et fermées
|
||||||
|
* @param keyword
|
||||||
|
* @param dateFoundElement
|
||||||
|
*/
|
||||||
|
function statisticDateFill(keyword, dateFoundElement) {
|
||||||
|
|
||||||
|
// décompte par années
|
||||||
|
|
||||||
|
let convertedDate = new Date(dateFoundElement )
|
||||||
|
let yearOfDate = convertedDate.getFullYear()
|
||||||
|
let monthOfDate = convertedDate.getFullYear()+ '-'+ convertedDate.getMonth()
|
||||||
|
let convertedMonth = convertedDate.getMonth() < 10 ? '0'+convertedDate.getMonth(): convertedDate.getMonth()
|
||||||
|
let convertedDay = convertedDate.getDay() < 10 ? '0'+convertedDate.getDay(): convertedDate.getDay()
|
||||||
|
let dayOfDate = convertedDate.getFullYear()+ '-'+ convertedMonth+ '-' + convertedDay
|
||||||
|
|
||||||
|
console.log('convertedDate', convertedDate,yearOfDate)
|
||||||
|
if(!statistics.dates.years[yearOfDate]){
|
||||||
|
statistics.dates.years[yearOfDate] = {
|
||||||
|
created:0,
|
||||||
|
closed:0,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(keyword=== 'CLOSED'){
|
||||||
|
statistics.dates.years[yearOfDate].closed++;
|
||||||
|
}
|
||||||
|
if(keyword=== 'CREATED'){
|
||||||
|
statistics.dates.years[yearOfDate].created++;
|
||||||
|
}
|
||||||
|
|
||||||
|
// décompte par mois
|
||||||
|
if(!statistics.dates.months[monthOfDate]){
|
||||||
|
statistics.dates.months[monthOfDate] = {
|
||||||
|
created:0,
|
||||||
|
closed:0,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(keyword=== 'CLOSED'){
|
||||||
|
statistics.dates.months[monthOfDate].closed++;
|
||||||
|
}
|
||||||
|
if(keyword=== 'CREATED'){
|
||||||
|
statistics.dates.months[monthOfDate].created++;
|
||||||
|
}
|
||||||
|
|
||||||
|
// décompte par jours
|
||||||
|
|
||||||
|
if(!statistics.dates.days[dayOfDate]){
|
||||||
|
statistics.dates.days[dayOfDate] = {
|
||||||
|
created:0,
|
||||||
|
closed:0,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(keyword=== 'CLOSED'){
|
||||||
|
statistics.dates.days[dayOfDate].closed++;
|
||||||
|
}
|
||||||
|
if(keyword=== 'CREATED'){
|
||||||
|
statistics.dates.days[dayOfDate].created++;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
/**********************
|
/**********************
|
||||||
* loop to parse all
|
* loop to parse all
|
||||||
*********************/
|
*********************/
|
||||||
|
@ -184,19 +257,43 @@ fs.readFile(sourceFilePath, 'utf8', function (err, data) {
|
||||||
// classer les dates de création, cloture, et de logbook
|
// classer les dates de création, cloture, et de logbook
|
||||||
let dateFound = searchDate(line)
|
let dateFound = searchDate(line)
|
||||||
if (dateFound) {
|
if (dateFound) {
|
||||||
|
/**
|
||||||
|
* we have found a date in the current line
|
||||||
|
*/
|
||||||
|
|
||||||
|
statistics.dates.havingDate += 1;
|
||||||
|
|
||||||
dateKeywordList.forEach(keyword => {
|
dateKeywordList.forEach(keyword => {
|
||||||
if (lineHasSubstring(line, keyword)) {
|
if (lineHasSubstring(line, keyword)) {
|
||||||
if (!currentTask.dates[keyword]) {
|
if (!currentTask.dates[keyword]) {
|
||||||
currentTask.dates[keyword] = '';
|
currentTask.dates[keyword] = '';
|
||||||
}
|
}
|
||||||
currentTask.dates[keyword] = new Date(dateFound[0]);
|
|
||||||
|
let convertedDate = dateFound[0].substring(0, 10)
|
||||||
|
let formattedDate = moment(convertedDate).format()
|
||||||
|
|
||||||
|
statisticDateFill(keyword,convertedDate)
|
||||||
|
|
||||||
|
currentTask.dates[keyword] = formattedDate;
|
||||||
|
|
||||||
|
console.log('formattedDate', keyword, formattedDate)
|
||||||
|
|
||||||
|
// trouver la plus ancienne date
|
||||||
|
if (!statistics.dates.oldEst) {
|
||||||
|
statistics.dates.oldEst = formattedDate;
|
||||||
|
} else {
|
||||||
|
var beginningTime = moment(statistics.dates.oldEst);
|
||||||
|
var endTime = moment(convertedDate);
|
||||||
|
if (!beginningTime.isBefore(endTime)) {
|
||||||
|
statistics.dates.oldEst = formattedDate;
|
||||||
|
}
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
// console.log('keyword', keyword)
|
// console.log('keyword', keyword)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
} else {
|
} else {
|
||||||
|
statistics.dates.havingNoDate += 1;
|
||||||
if (line.indexOf(dateKeywordList) !== -1 && line.indexOf(stateKeywordList) !== -1 && line.indexOf(sectionKeywordList) !== -1) {
|
if (line.indexOf(dateKeywordList) !== -1 && line.indexOf(stateKeywordList) !== -1 && line.indexOf(sectionKeywordList) !== -1) {
|
||||||
|
|
||||||
makeWordsStatistics(line)
|
makeWordsStatistics(line)
|
||||||
|
@ -216,17 +313,20 @@ fs.readFile(sourceFilePath, 'utf8', function (err, data) {
|
||||||
addAndRefreshCurrentTask();
|
addAndRefreshCurrentTask();
|
||||||
|
|
||||||
console.log(" parsing fini")
|
console.log(" parsing fini")
|
||||||
// stateKeywordList.forEach(keyword => console.log('nombre de headers', keyword, headersByKind[keyword]?.length))
|
|
||||||
|
// ranger par valeur décroissante les tags
|
||||||
|
|
||||||
|
let sorted_stats = [];
|
||||||
|
sorted_stats = Object.fromEntries(
|
||||||
|
Object.entries(statistics).sort(([, a], [, b]) => a - b)
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
const jsonContent = {
|
const jsonContent = {
|
||||||
statistics: {
|
statistics: {
|
||||||
lines_count: everyline.length,
|
lines_count: everyline.length,
|
||||||
headers_count: headers.length,
|
headers_count: headers.length,
|
||||||
statistics: Object.keys(statistics).sort(function (a, b) {
|
statistics: sorted_stats
|
||||||
return statistics[a] - statistics[b]
|
|
||||||
})
|
|
||||||
|
|
||||||
},
|
},
|
||||||
meta_data: {
|
meta_data: {
|
||||||
author: '@tykayn@mastodon.Cipherbliss.com',
|
author: '@tykayn@mastodon.Cipherbliss.com',
|
||||||
|
@ -237,11 +337,10 @@ fs.readFile(sourceFilePath, 'utf8', function (err, data) {
|
||||||
tasks_list: tasksObjectsForJsonExport
|
tasks_list: tasksObjectsForJsonExport
|
||||||
}
|
}
|
||||||
|
|
||||||
console.log('statistics', statistics)
|
|
||||||
// console.log('tasksObjectsForJsonExport', jsonContent)
|
|
||||||
|
|
||||||
if (writeJsonAfterParse) {
|
if (writeJsonAfterParse) {
|
||||||
writeFileInOuputFolder('export_' + sourceFileName + '_parsed.json', JSON.stringify(jsonContent));
|
|
||||||
|
writeFileInOuputFolder(outputFileNameJson, JSON.stringify(jsonContent));
|
||||||
}
|
}
|
||||||
|
|
||||||
})
|
})
|
||||||
|
@ -330,7 +429,8 @@ function cleanHeader(line) {
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function writeFileInOuputFolder(fileName, fileContent) {
|
export async function writeFileInOuputFolder(fileName, fileContent) {
|
||||||
console.log('write file ', fileName);
|
console.log('write file ', outputAbsolutePath, fileName);
|
||||||
|
console.log('date statistics ', statistics.dates);
|
||||||
|
|
||||||
return await fs.writeFile(
|
return await fs.writeFile(
|
||||||
`${outputAbsolutePath}${fileName}`,
|
`${outputAbsolutePath}${fileName}`,
|
||||||
|
|
|
@ -1,10 +1,12 @@
|
||||||
#!/usr/bin/bash
|
#!/usr/bin/bash
|
||||||
touch all_tasks.org
|
touch all_tasks.org
|
||||||
echo "" > all_tasks.org
|
echo "" > all_tasks.org
|
||||||
|
|
||||||
|
|
||||||
cat ~/Nextcloud/textes/orgmode/tasks.org >> all_tasks.org
|
cat ~/Nextcloud/textes/orgmode/tasks.org >> all_tasks.org
|
||||||
cat ~/Nextcloud/textes/orgmode/tasks.org_archive >> all_tasks.org
|
cat ~/Nextcloud/textes/orgmode/tasks.org_archive >> all_tasks.org
|
||||||
cp all_tasks.org ~/Nextcloud/textes/orgmode/stats
|
cp all_tasks.org ~/Nextcloud/textes/orgmode/stats
|
||||||
echo "concaténation des fichiers tasks.org et tasks.org_archive faite dans all_tasks.org"
|
echo "concaténation des fichiers tasks.org et tasks.org_archive faite dans all_tasks.org \n"
|
||||||
|
|
||||||
touch stats.org
|
touch stats.org
|
||||||
date >> stats.org
|
date >> stats.org
|
||||||
|
|
Loading…
Reference in New Issue