From 00b7fdcfefcfc810159bbdc4978bf4d3bcc2461e Mon Sep 17 00:00:00 2001 From: Tykayn Date: Sat, 4 Mar 2023 23:52:46 +0100 Subject: [PATCH] parsing org files and get stats ok --- .gitignore | 2 +- Makefile | 7 ++-- parse_orgmode_to_json.mjs | 79 +++++++++++++++++++++++++++++++++++++++ scripts/concat_org.sh | 3 +- sources/demo.org | 10 +++++ 5 files changed, 96 insertions(+), 5 deletions(-) create mode 100644 parse_orgmode_to_json.mjs create mode 100644 sources/demo.org diff --git a/.gitignore b/.gitignore index 88218d6..3f8ef7d 100644 --- a/.gitignore +++ b/.gitignore @@ -131,8 +131,8 @@ dist .pnp.* output/* -source/*.json sources/*.json +sources/tasks.json /scripts/all_tasks.org /scripts/all.pdf /scripts/all.tex diff --git a/Makefile b/Makefile index 6198969..f7408ae 100644 --- a/Makefile +++ b/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 : @@ -13,5 +14,5 @@ render: serve output; firefox http://localhost:3000/output_all_tasks_report; folders: - rm -rf emploi-du-temps/folders_build/*; - node emploi-du-temps/folder_from_tasks.mjs; \ No newline at end of file + rm -rf emploi-du-temps/folders_build/* ; + node emploi-du-temps/folder_from_tasks.mjs ; diff --git a/parse_orgmode_to_json.mjs b/parse_orgmode_to_json.mjs new file mode 100644 index 0000000..923ef1e --- /dev/null +++ b/parse_orgmode_to_json.mjs @@ -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] = []; + } +} \ No newline at end of file diff --git a/scripts/concat_org.sh b/scripts/concat_org.sh index e47a2f0..1b5d6c0 100644 --- a/scripts/concat_org.sh +++ b/scripts/concat_org.sh @@ -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" diff --git a/sources/demo.org b/sources/demo.org new file mode 100644 index 0000000..4a357c4 --- /dev/null +++ b/sources/demo.org @@ -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 \ No newline at end of file