org-report-stats/parse_orgmode_to_json.mjs

79 lines
2.2 KiB
JavaScript
Raw Normal View History

2023-03-04 23:52:46 +01:00
/**
* 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] = [];
}
}