Transform Stream et htmlparser2
Bonjour à tous,
Je connais assez mal l'API Stream de Node.js et j'ai quelques difficultés à l'utiliser pour venir transformer des fichiers HTML analysés avec la lib htmlparser2: https://github.com/fb55/htmlparser2
Mon objectif est de récupérer les éléments <t> texte à traduire </t> et les attributs <img t-src="url à traduire"> pour venir remplacer leur contenu par une traduction et écrire le tout dans le répertoire de la langue correspondante.
Je sais déjà récupérer et lister ces éléments, mais je bute sur la manière la plus efficace de venir remplacer ces textes au moment du parsing et écrire le tout dans un fichier de destination.
Voilà où j'en suis:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
| const htmlParser = require('htmlparser2'),
promisify = require("promisify-node"),
fs = promisify("fs-extra"),
log = require("../logger")
module.exports = function parseHTML(filepaths){
var tElements = [],
tAttributes = [],
buffer;
const parser = new htmlParser.Parser({
onopentag: (tagname, attrs) => {
if(tagname === "t"){
buffer="";
}
Object.keys(attrs).filter(attr=>attr.startsWith("t-")).forEach(attr => {
tAttributes.push(attrs[attr]);
})
},
ontext: (text) => {
if(buffer != null){
buffer+=text;
}
},
onclosetag: (tagname) => {
if(tagname === "t"){
tElements.push(buffer);
buffer = null;
}
}
});
return Promise.all(filepaths.map(filepath => fs.readFile(filepath).then(data => {
buffer= null;
parser.write(data)
parser.end()
log.debug("HTML parsing done")
fs.writeFileSync("destination/"+ filepath, data) // <-- comment relier le stream d'entrée et de sortie ? Stream.Transform ? Pipes ?
return { elements: tElements, attributes: tAttributes }
}).catch(log.error)
} |
J'utilise donc de bêtes String en guise de buffer de fortune pour venir y écrire le contenu de mes éléments. Je pourrais sans doute faire une série de replace() sur le contenu pour réécrire le tout avec fs.writeFile, mais j'imagine qu'il y a une façon plus propre et performante de faire ça. L'API Stream.Transform semble tout indiquée mais je ne vois pas comment l'interfacer avec htmlparser2. J'ai mon stream d'entrée avec fs.readFile, mon stream de sortie fs.writeFile, comment relier les deux au moment du parsing ?