/
iontrxne
/
PPSX_Text_Extractor
Обзор
Документация
Войти
/
iontrxne
/
PPSX_Text_Extractor
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
script.js
75 строк
2 KB
iontrxne
upd
24 дек 2025, 00:37
24 дек 2025, 00:37
92c1526
Код
Авторство
О чём код?
const fs = require("fs"); const path = require("path"); const AdmZip = require("adm-zip"); const { XMLParser } = require("fast-xml-parser"); const INPUT_DIR = path.join(__dirname, "../data"); const OUTPUT_DIR = path.join(__dirname, "../output"); if (!fs.existsSync(OUTPUT_DIR)) { fs.mkdirSync(OUTPUT_DIR); } const parser = new XMLParser({ ignoreAttributes: true, textNodeName: "text" }); function extractTextFromXml(xml) { const texts = []; function walk(node) { if (!node || typeof node !== "object") return; if (node["a:t"]) { if (Array.isArray(node["a:t"])) { node["a:t"].forEach(t => texts.push(t)); } else { texts.push(node["a:t"]); } } for (const key in node) { walk(node[key]); } } const parsed = parser.parse(xml); walk(parsed); return texts.join("\n"); } fs.readdirSync(INPUT_DIR) .filter(file => { const ext = path.extname(file).toLowerCase(); return ext === ".ppsx" || ext === ".pptx"; }) .forEach(file => { const pptxPath = path.join(INPUT_DIR, file); const zip = new AdmZip(pptxPath); const slideEntries = zip .getEntries() .filter(e => e.entryName.startsWith("ppt/slides/slide") && e.entryName.endsWith(".xml") ) .sort((a, b) => a.entryName.localeCompare(b.entryName)); const allText = []; slideEntries.forEach(entry => { const xml = entry.getData().toString("utf8"); const slideText = extractTextFromXml(xml); if (slideText.trim()) { allText.push(slideText); } }); const outName = path.basename(file, path.extname(file)) + ".txt"; const outPath = path.join(OUTPUT_DIR, outName); fs.writeFileSync(outPath, allText.join("\n\n"), "utf8"); console.log(`Готово: ${outPath}`); });