parsing org files and get stats ok

This commit is contained in:
Tykayn 2023-03-04 23:52:46 +01:00 committed by tykayn
parent 6c95bc4353
commit 00b7fdcfef
5 changed files with 96 additions and 5 deletions

2
.gitignore vendored
View File

@ -131,8 +131,8 @@ dist
.pnp.*
output/*
source/*.json
sources/*.json
sources/tasks.json
/scripts/all_tasks.org
/scripts/all.pdf
/scripts/all.tex

View File

@ -2,7 +2,8 @@ default : concat
concat:
echo "* " | tee -a scripts/stats.org
date | tee -a scripts/stats.org
bash scripts/concat_org.sh |tee -a scripts/stats.org
echo " " | tee -a scripts/stats.org
bash scripts/concat_org.sh |tee -a scripts/stats.org;
convert:
npm start
copyTasksJson :

79
parse_orgmode_to_json.mjs Normal file
View File

@ -0,0 +1,79 @@
/**
* convertir un fichier .org vers des données structurées en json
* @type {*}
*/
// const fileToParse = process.argv[0]
import fs from 'node-fs';
const sourceFilePath = './sources/demo.org';
console.log('parse some org file', sourceFilePath)
if (!sourceFilePath) {
console.error('pas de fichier à ouvrir')
}
let headers = []
let headersByKind = {}
fs.stat(sourceFilePath, function (err, stat) {
if (err == null) {
console.log(`File ${sourceFilePath} exists`);
} else if (err.code === 'ENOENT') {
// file does not exist
console.error(`le fichier ${sourceFilePath} est introuvable. Impossible d en extraire des infos.`, err);
} else {
console.log('Some other error: ', err.code);
}
});
let keyword = 'SOMEDAY';
let keywordList = ['SOMEDAY', 'NEXT','TODO', 'CANCELLED','DONE', 'WAITING'];
fs.readFile(sourceFilePath, 'utf8', function (err, data) {
if (err) {
return console.log(err);
}
console.log(" parsing...")
// parcourir chaque ligne du fichier org
let everyline = data.split('\n');
// trouver les entêtes toutes les lignes qui commencent par * et espace.
everyline.forEach((line) => {
if (line.match(/^\*+? /)) {
headers.push(line)
keywordList.forEach(keyword => lookForKeywordInLine(line, keyword))
// TODO gérer la création d'objets définissant les tâches et leurs propriétés
}
})
console.log('headers', headers)
console.log(" parsing fini")
console.log('nombre de lignes', everyline.length)
console.log('nombre de headers', headers.length)
keywordList.forEach(keyword => console.log('nombre de headers',keyword, headersByKind[keyword]?.length))
return;
})
function lookForKeywordInLine(line, keyword='TODO') {
// const regexp = new RegExp("(^\*+? "+ keyword+"", "gi")
// const regexp = new RegExp("^{\*}+? "+keyword+".*?", "gi")
// if ( line.match(regexp)) {
if ( line.indexOf('* '+keyword) !== -1) {
// console.log('ligne trouvée', keyword)
createNewHeaderKind(keyword)
headersByKind[keyword].push(line);
}
}
function createNewHeaderKind(keyword) {
if (!headersByKind[keyword]) {
headersByKind[keyword] = [];
}
}

View File

@ -4,11 +4,12 @@ echo "" > all_tasks.org
cat ~/Nextcloud/textes/orgmode/tasks.org >> all_tasks.org
cat ~/Nextcloud/textes/orgmode/tasks.org_archive >> all_tasks.org
cp all_tasks.org ~/Nextcloud/textes/orgmode/stats
echo "concaténation des fichiers tasks.org et tasks.org_archive faite dans all_tasks.org"
touch stats.org
date >> stats.org
echo " décomptes: " >> stats.org
# dans les archives, les tâches sont toujours un header de niveau 1, on peut donc les trouver avec la recherche de : "* "
todos=`grep -o '* TODO' all_tasks.org | wc -l`
echo " TODO : $todos"

10
sources/demo.org Normal file
View File

@ -0,0 +1,10 @@
* coucou la démo de fichier org
* voilà un 2e header
* TODO faire une démo
* NEXT écrire le fichier de démo [1/3] :demo:
** SOMEDAY oh un sous header, niveau 2 :subtil:
** CANCELLED un truc pas fait au final
** DONE et voilà ça c'est fait :projet_fini:ARCHIVE:
CLOSED : [2023-03-04 15:00]
* pas mal hein
c'est un texte de description