parsing org files and get stats ok
This commit is contained in:
parent
6c95bc4353
commit
00b7fdcfef
|
@ -131,8 +131,8 @@ dist
|
||||||
.pnp.*
|
.pnp.*
|
||||||
|
|
||||||
output/*
|
output/*
|
||||||
source/*.json
|
|
||||||
sources/*.json
|
sources/*.json
|
||||||
|
sources/tasks.json
|
||||||
/scripts/all_tasks.org
|
/scripts/all_tasks.org
|
||||||
/scripts/all.pdf
|
/scripts/all.pdf
|
||||||
/scripts/all.tex
|
/scripts/all.tex
|
||||||
|
|
3
Makefile
3
Makefile
|
@ -2,7 +2,8 @@ default : concat
|
||||||
concat:
|
concat:
|
||||||
echo "* " | tee -a scripts/stats.org
|
echo "* " | tee -a scripts/stats.org
|
||||||
date | 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:
|
convert:
|
||||||
npm start
|
npm start
|
||||||
copyTasksJson :
|
copyTasksJson :
|
||||||
|
|
|
@ -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] = [];
|
||||||
|
}
|
||||||
|
}
|
|
@ -4,11 +4,12 @@ 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"
|
||||||
|
|
||||||
touch stats.org
|
touch stats.org
|
||||||
date >> stats.org
|
date >> stats.org
|
||||||
echo " décomptes: " >> 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`
|
todos=`grep -o '* TODO' all_tasks.org | wc -l`
|
||||||
echo " TODO : $todos"
|
echo " TODO : $todos"
|
||||||
|
|
||||||
|
|
|
@ -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
|
Loading…
Reference in New Issue