parsing org files and get stats ok
This commit is contained in:
parent
6c95bc4353
commit
00b7fdcfef
|
@ -131,8 +131,8 @@ dist
|
|||
.pnp.*
|
||||
|
||||
output/*
|
||||
source/*.json
|
||||
sources/*.json
|
||||
sources/tasks.json
|
||||
/scripts/all_tasks.org
|
||||
/scripts/all.pdf
|
||||
/scripts/all.tex
|
||||
|
|
3
Makefile
3
Makefile
|
@ -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 :
|
||||
|
|
|
@ -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_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"
|
||||
|
||||
|
|
|
@ -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