any-extractor 2.0.1 → 2.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.mts +0 -1
- package/dist/index.d.ts +0 -1
- package/dist/index.js +8 -5
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +8 -5
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.d.mts
CHANGED
|
@@ -39,7 +39,6 @@ declare class AnyExtractor {
|
|
|
39
39
|
private extractorConfig;
|
|
40
40
|
constructor(extractorConfig?: ExtractorConfig);
|
|
41
41
|
private mimeParserMap;
|
|
42
|
-
private parsers;
|
|
43
42
|
addParser: (method: AnyParserMethod) => this;
|
|
44
43
|
parseFile: (input: string | Buffer, basicAuth?: string | null, extractingOptions?: ExtractingOptions) => Promise<string>;
|
|
45
44
|
parseConfluenceDoc: (pageId: string, extractingOptions?: ConfluenceOptions) => Promise<string>;
|
package/dist/index.d.ts
CHANGED
|
@@ -39,7 +39,6 @@ declare class AnyExtractor {
|
|
|
39
39
|
private extractorConfig;
|
|
40
40
|
constructor(extractorConfig?: ExtractorConfig);
|
|
41
41
|
private mimeParserMap;
|
|
42
|
-
private parsers;
|
|
43
42
|
addParser: (method: AnyParserMethod) => this;
|
|
44
43
|
parseFile: (input: string | Buffer, basicAuth?: string | null, extractingOptions?: ExtractingOptions) => Promise<string>;
|
|
45
44
|
parseConfluenceDoc: (pageId: string, extractingOptions?: ConfluenceOptions) => Promise<string>;
|
package/dist/index.js
CHANGED
|
@@ -152,8 +152,13 @@ var ConfluenceCrawler = class {
|
|
|
152
152
|
return data.body.storage.value;
|
|
153
153
|
}
|
|
154
154
|
extractOrderedContentFromXml(xml, pageId) {
|
|
155
|
-
|
|
156
|
-
|
|
155
|
+
let $ = cheerio.load(xml, { xmlMode: true });
|
|
156
|
+
let node = $("ac\\:layout").first();
|
|
157
|
+
if (node.length === 0) {
|
|
158
|
+
const newXml = `<ac:layout>${xml}</ac:layout>`;
|
|
159
|
+
$ = cheerio.load(newXml, { xmlMode: true });
|
|
160
|
+
node = $("ac\\:layout").first();
|
|
161
|
+
}
|
|
157
162
|
const orderedContent = this.parseNodeContents(node, $, pageId);
|
|
158
163
|
return orderedContent;
|
|
159
164
|
}
|
|
@@ -350,9 +355,7 @@ var AnyExtractor = class {
|
|
|
350
355
|
}
|
|
351
356
|
};
|
|
352
357
|
this.mimeParserMap = /* @__PURE__ */ new Map();
|
|
353
|
-
this.parsers = [];
|
|
354
358
|
this.addParser = (method) => {
|
|
355
|
-
this.parsers.push(method);
|
|
356
359
|
method.mimes.forEach((mime) => {
|
|
357
360
|
this.mimeParserMap.set(mime, method);
|
|
358
361
|
});
|
|
@@ -390,7 +393,7 @@ var AnyExtractor = class {
|
|
|
390
393
|
const message = `AnyExtractor: No extraction method registered for MIME type '${mimeDetails.mime}'`;
|
|
391
394
|
throw new Error(message);
|
|
392
395
|
}
|
|
393
|
-
return extractor.apply(preparedInput, extractingOptions, this.extractorConfig);
|
|
396
|
+
return await extractor.apply(preparedInput, extractingOptions, this.extractorConfig);
|
|
394
397
|
};
|
|
395
398
|
this.parseConfluenceDoc = async (pageId, extractingOptions = {
|
|
396
399
|
extractAttachments: false,
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/extractors/any-extractor.ts","../src/util.ts","../src/constant.ts","../src/crawler/confluence-crawler.ts","../src/file-parser/excel-parser.ts","../src/file-parser/image-parser.ts","../src/file-parser/openoffice-paser.ts","../src/file-parser/pdf-parser.ts","../src/file-parser/powerpoint-parser.ts","../src/file-parser/simple-parser.ts","../src/file-parser/word-parser.ts"],"sourcesContent":["import { AnyExtractor } from './extractors/any-extractor';\nimport { ExtractorConfig } from './types';\nimport {\n ExcelParser,\n ImageParser,\n OpenOfficeParser,\n PDFParser,\n PowerPointParser,\n SimpleParser,\n WordParser,\n} from './file-parser';\n\n/**\n * Get an extractor with parsers for various file formats.\n *\n * @param {ExtractorConfig} [config] - Optional configuration for the extractor.\n * @returns {AnyExtractor} - The configured AnyExtractor instance.\n */\nexport const getAnyExtractor = (config?: ExtractorConfig): AnyExtractor => {\n const anyExtractor = new AnyExtractor(config);\n\n // List of parsers for handling various file types\n const parsers = [\n new ExcelParser(anyExtractor),\n new ImageParser(),\n new OpenOfficeParser(),\n new PDFParser(),\n new PowerPointParser(anyExtractor),\n new SimpleParser(),\n new WordParser(anyExtractor),\n ];\n\n parsers.forEach((parser) => anyExtractor.addParser(parser));\n\n return anyExtractor;\n};\n\nexport * from './types';\n","import { parse } from 'file-type-mime';\nimport { AnyParserMethod, ConfluenceOptions, ExtractingOptions, ExtractorConfig } from '../types';\nimport { isValidUrl, readFile, readFileUrl } from '../util';\nimport { ConfluenceCrawler } from '../crawler/confluence-crawler';\n\nexport class AnyExtractor {\n private extractorConfig: ExtractorConfig = {\n llm: {\n llmProvider: 'openai',\n visionModel: '',\n apikey: '',\n },\n confluence: {\n baseUrl: '',\n email: '',\n apiKey: '',\n },\n };\n\n constructor(extractorConfig?: ExtractorConfig) {\n if (extractorConfig) {\n this.extractorConfig = extractorConfig;\n }\n }\n\n private mimeParserMap: Map<string, AnyParserMethod> = new Map();\n private parsers: AnyParserMethod[] = [];\n\n public addParser = (method: AnyParserMethod): this => {\n this.parsers.push(method);\n method.mimes.forEach((mime) => {\n this.mimeParserMap.set(mime, method);\n });\n return this;\n };\n\n public parseFile = async (\n input: string | Buffer,\n basicAuth: string | null = null,\n extractingOptions: ExtractingOptions = {\n extractImages: false,\n imageExtractionMethod: 'ocr',\n language: 'eng',\n },\n ): Promise<string> => {\n let preparedInput: Buffer;\n if (typeof input === 'string') {\n if (isValidUrl(input)) {\n preparedInput = await readFileUrl(input, basicAuth);\n } else {\n preparedInput = await readFile(input);\n }\n } else {\n preparedInput = input;\n }\n if (!preparedInput) {\n throw new Error('AnyExtractor: No input provided');\n }\n\n const mimeDetails = parse(\n preparedInput.buffer.slice(\n preparedInput.byteOffset,\n preparedInput.byteOffset + preparedInput.byteLength,\n ) as ArrayBuffer,\n );\n if (!mimeDetails) {\n return preparedInput.toString('utf-8');\n }\n const extractor = this.mimeParserMap.get(mimeDetails.mime);\n\n if (!extractor?.apply) {\n const message = `AnyExtractor: No extraction method registered for MIME type '${mimeDetails.mime}'`;\n throw new Error(message);\n }\n\n return extractor.apply(preparedInput, extractingOptions, this.extractorConfig);\n };\n\n public parseConfluenceDoc = async (\n pageId: string,\n extractingOptions: ConfluenceOptions = {\n extractAttachments: false,\n extractImages: false,\n imageExtractionMethod: 'ocr',\n language: 'eng',\n },\n ): Promise<string> => {\n const { baseUrl, email, apiKey } = this.extractorConfig.confluence || {};\n if (!baseUrl || !email || !apiKey) {\n throw new Error('AnyExtractor: Confluence base URL, email, and API key are required');\n }\n const confCrawler = new ConfluenceCrawler(baseUrl, email, apiKey);\n const content = await confCrawler.extractPageContent(pageId);\n let textContent = '';\n for (const item of content) {\n if (item.type === 'image' && extractingOptions.extractImages) {\n const parsedFile = await this.parseFile(\n item.content,\n `Basic ${Buffer.from(`${email}:${apiKey}`).toString('base64')}`,\n extractingOptions,\n );\n textContent += parsedFile ? `\\n(Image): ${parsedFile}\\n` : '';\n } else if (item.type === 'view-file' && extractingOptions.extractAttachments) {\n const parsedFile = await this.parseFile(\n item.content,\n `Basic ${Buffer.from(`${email}:${apiKey}`).toString('base64')}`,\n extractingOptions,\n );\n textContent += parsedFile ? `\\n[Attachment]: ${parsedFile}\\n` : '';\n } else if (\n [\n 'h1',\n 'h2',\n 'h3',\n 'h4',\n 'h5',\n 'h6',\n 'p',\n 'table',\n 'li',\n 'code',\n 'info',\n 'warning',\n 'tip',\n 'note',\n 'panel',\n 'expand',\n 'adf-extension',\n ].includes(item.type)\n ) {\n textContent += `\\n${item.content}\\n`;\n } else if (item.type === 'text') {\n textContent += ` ${item.content}`;\n }\n }\n return textContent;\n };\n}\n","import { fetch } from 'undici';\nimport yauzl from 'yauzl';\nimport { ERRORMSG } from './constant';\nimport { ExtractedFile } from './types';\nimport concat from 'concat-stream';\nimport { DOMParser } from '@xmldom/xmldom';\nimport { promises as fs } from 'fs';\n\nexport async function readFile(filePath: string): Promise<Buffer> {\n return await fs.readFile(filePath);\n}\n\nexport const readFileUrl = async (url: string, basicAuth?: string | null): Promise<Buffer> => {\n const res = await fetch(url, {\n headers: {\n ...(basicAuth ? { Authorization: basicAuth } : {}),\n },\n });\n if (!res.ok) throw new Error(`Failed to fetch: ${res.statusText}`);\n return Buffer.from(await res.arrayBuffer());\n};\n\nexport const extractFiles = (\n zipInput: Buffer | string,\n filterFn: (x: string) => boolean,\n): Promise<ExtractedFile[]> => {\n return new Promise((res, rej) => {\n const processZipfile = (zipfile: yauzl.ZipFile) => {\n const extractedFiles: ExtractedFile[] = [];\n zipfile.readEntry();\n\n function processEntry(entry: yauzl.Entry) {\n if (filterFn(entry.fileName)) {\n zipfile.openReadStream(entry, (err, readStream) => {\n if (err) return rej(err);\n\n readStream.pipe(\n concat((data: Buffer) => {\n extractedFiles.push({\n path: entry.fileName,\n content: data,\n });\n zipfile.readEntry();\n }),\n );\n });\n } else zipfile.readEntry();\n }\n\n zipfile.on('entry', processEntry);\n zipfile.on('end', () => res(extractedFiles));\n zipfile.on('error', rej);\n };\n\n if (Buffer.isBuffer(zipInput)) {\n yauzl.fromBuffer(zipInput, { lazyEntries: true }, (err, zipfile) => {\n if (err) return rej(err);\n processZipfile(zipfile);\n });\n } else if (typeof zipInput === 'string') {\n yauzl.open(zipInput, { lazyEntries: true }, (err, zipfile) => {\n if (err) return rej(err);\n processZipfile(zipfile);\n });\n } else rej(ERRORMSG.invalidInput);\n });\n};\n\nexport const parseString = (xml: string) => {\n const parser = new DOMParser();\n return parser.parseFromString(xml, 'text/xml');\n};\n\nexport function isValidUrl(str: string | undefined | null): boolean {\n try {\n if (!str) return false;\n new URL(str);\n return true;\n } catch {\n return false;\n }\n}\n","/** Header for error messages */\nexport const ERRORHEADER = '[AnyExtractor]: ';\n\n/** Error messages */\nexport const ERRORMSG = {\n extensionUnsupported: (ext: string) =>\n `Sorry, AnyExtractor currently support docx, pptx, xlsx, odt, odp, ods, pdf files only. Create a ticket in Issues on github to add support for ${ext} files. Stay tuned for further updates.`,\n fileCorrupted: (filepath: string) =>\n `Your file ${filepath} seems to be corrupted. If you are sure it is fine, please create a ticket in Issues on github with the file to reproduce error.`,\n fileDoesNotExist: (filepath: string) =>\n `File ${filepath} could not be found! Check if the file exists or verify if the relative path to the file is correct from your terminal's location.`,\n locationNotFound: (location: string) =>\n `Entered location ${location} is not reachable! Please make sure that the entered directory location exists. Check relative paths and reenter.`,\n improperArguments: `Improper arguments`,\n improperBuffers: `Error occured while reading the file buffers`,\n invalidInput: `Invalid input type: Expected a Buffer or a valid file path`,\n};\n","import { fetch } from 'undici';\nimport { ExtractedXmlItem } from '../types';\nimport * as cheerio from 'cheerio';\nimport { Element, Text } from 'domhandler';\n\nexport class ConfluenceCrawler {\n private baseUrl: string;\n private email: string;\n private apiKey: string;\n private apiEndpoint: string;\n\n constructor(baseUrl: string, email: string, apiKey: string) {\n this.baseUrl = baseUrl.replace(/\\/+$/, '');\n this.email = email;\n this.apiKey = apiKey;\n\n this.apiEndpoint = this.baseUrl.includes('atlassian.net')\n ? `${this.baseUrl}/wiki/rest/api`\n : `${this.baseUrl}/rest/api`;\n }\n\n public async extractPageContent(pageId: string): Promise<ExtractedXmlItem[]> {\n const xmlContent = await this.fetchPageContent(pageId);\n return this.extractOrderedContentFromXml(xmlContent, pageId);\n }\n\n private async fetchPageContent(pageId: string): Promise<string> {\n const url = `${this.apiEndpoint}/content/${pageId}?expand=body.storage`;\n\n const response = await fetch(url, {\n headers: {\n Authorization: `Basic ${Buffer.from(`${this.email}:${this.apiKey}`).toString('base64')}`,\n 'Content-Type': 'application/json',\n },\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(\n `Request failed: ${response.status} ${response.statusText}. Response body: ${errorText}`,\n );\n }\n\n const data = (await response.json()) as { body: { [key: string]: { value: string } } };\n return data.body.storage.value;\n }\n\n private extractOrderedContentFromXml(xml: string, pageId: string): ExtractedXmlItem[] {\n const $ = cheerio.load(xml, { xmlMode: true });\n const node = $('ac\\\\:layout').first();\n const orderedContent = this.parseNodeContents(node, $, pageId);\n return orderedContent;\n }\n\n private parseNodeContents(\n node: cheerio.Cheerio<Element>,\n $: cheerio.CheerioAPI,\n pageId: string,\n ignoreTags: string[] = [],\n ): ExtractedXmlItem[] {\n let result: ExtractedXmlItem[] = [];\n const contents = node.contents();\n contents.each((_, ele) => {\n switch (ele.type) {\n case 'text':\n result.push(this.parseTextNode(ele));\n break;\n case 'tag':\n const tagResult = this.parseTagNode(ele, $, pageId, ignoreTags);\n result = result.concat(tagResult);\n break;\n default:\n break;\n }\n });\n return result;\n }\n\n private parseTextNode(ele: Text): ExtractedXmlItem {\n const text = ele.data.trim();\n return { type: 'text', content: text };\n }\n\n private parseTagNode(\n ele: Element,\n $: cheerio.CheerioAPI,\n pageId: string,\n ignoreTags: string[],\n ): ExtractedXmlItem[] {\n let result: ExtractedXmlItem[] = [];\n const tagName = ele.tagName;\n if (ignoreTags.includes(tagName)) {\n return result;\n }\n switch (tagName) {\n case 'ac:structured-macro':\n result = result.concat(this.parseStructuredMacro(ele, $, pageId));\n break;\n case 'ac:adf-extension':\n result = result.concat(this.parseAdfExtension(ele, $));\n break;\n case 'ac:task-list':\n result = result.concat(this.parseTaskList(ele, $, pageId));\n break;\n case 'ac:image':\n result = result.concat(this.parseImage(ele, $, pageId));\n break;\n case 'table':\n result = result.concat(this.parseTable(ele, $));\n break;\n case 'a':\n result = result.concat(this.parseLink(ele, $, pageId));\n break;\n default:\n result = result.concat(this.parseNodeContents($(ele), $, pageId));\n break;\n }\n return result;\n }\n\n private parseStructuredMacro(\n ele: Element,\n $: cheerio.CheerioAPI,\n pageId: string,\n ): ExtractedXmlItem[] {\n const macroName = ele.attribs['ac:name'];\n const result: ExtractedXmlItem[] = [];\n switch (macroName) {\n case 'code':\n result.push(this.parseCodeMacro(ele, $));\n break;\n case 'info':\n result.push(this.parseInfoMacro(ele, $, pageId));\n break;\n case 'warning':\n result.push(this.parseWarningMacro(ele, $, pageId));\n break;\n case 'note':\n result.push(this.parseNoteMacro(ele, $, pageId));\n break;\n case 'tip':\n result.push(this.parseTipMacro(ele, $, pageId));\n break;\n case 'panel':\n result.push(this.parsePanelMacro(ele, $, pageId));\n break;\n case 'expand':\n result.push(this.parseExpandMacro(ele, $, pageId));\n break;\n case 'status':\n result.push(this.parseStatusMacro(ele, $, pageId));\n break;\n case 'view-file':\n result.push(this.parseViewFileMacro(ele, $, pageId));\n break;\n }\n return result;\n }\n\n private parseLink(ele: Element, $: cheerio.CheerioAPI, pageId: string): ExtractedXmlItem[] {\n const href = $(ele).attr('href');\n const text = this.parseNodeContents($(ele), $, pageId);\n return [{ type: 'link', content: `${text.map((t) => t.content).join('')} (${href})` }];\n }\n\n private parseTaskList(ele: Element, $: cheerio.CheerioAPI, pageId: string): ExtractedXmlItem[] {\n const result: ExtractedXmlItem[] = [];\n const tasks = $(ele).find('ac\\\\:task');\n tasks.each((_, task) => {\n const taskStatus = $(task).find('ac\\\\:task-status').text().trim();\n const taskBody = this.parseNodeContents($(task).find('ac\\\\:task-body'), $, pageId);\n result.push({\n type: 'task',\n content: `${taskBody.map((t) => t.content).join('')} [Status: ${taskStatus}]`,\n });\n });\n return result;\n }\n\n private parseImage(ele: Element, $: cheerio.CheerioAPI, pageId: string): ExtractedXmlItem[] {\n const attachment = $(ele).find('ri\\\\:attachment');\n const filename = attachment.attr('ri:filename')?.trim();\n if (!filename) {\n return [];\n }\n\n const imageUrl = this.baseUrl.includes('atlassian.net')\n ? `${this.baseUrl}/wiki/download/attachments/${pageId}/${encodeURIComponent(filename)}`\n : `${this.baseUrl}/download/attachments/${pageId}/${encodeURIComponent(filename)}`;\n\n return [{ type: 'image', content: imageUrl }];\n }\n\n private parseTable(ele: Element, $: cheerio.CheerioAPI): ExtractedXmlItem[] {\n const result: ExtractedXmlItem[] = [];\n const rows = $(ele).find('tr');\n const tableData: string[] = [];\n rows.each((_, row) => {\n const cells = $(row).find('th, td');\n const rowData: string[] = [];\n cells.each((_, cell) => {\n rowData.push($(cell).text().trim());\n });\n tableData.push(rowData.join(' | '));\n });\n result.push({ type: 'table', content: tableData.join('\\n') });\n return result;\n }\n\n private parseCodeMacro(ele: Element, $: cheerio.CheerioAPI): ExtractedXmlItem {\n const code = $(ele).find('ac\\\\:plain-text-body').text().trim();\n return { type: 'code', content: code };\n }\n\n private parseInfoMacro(ele: Element, $: cheerio.CheerioAPI, pageId: string): ExtractedXmlItem {\n const info = this.parseNodeContents($(ele), $, pageId);\n return { type: 'info', content: info.map((t) => t.content).join('') };\n }\n\n private parseWarningMacro(ele: Element, $: cheerio.CheerioAPI, pageId: string): ExtractedXmlItem {\n const warning = this.parseNodeContents($(ele), $, pageId);\n return { type: 'warning', content: warning.map((t) => t.content).join('') };\n }\n\n private parseNoteMacro(ele: Element, $: cheerio.CheerioAPI, pageId: string): ExtractedXmlItem {\n const note = this.parseNodeContents($(ele), $, pageId);\n return { type: 'note', content: note.map((t) => t.content).join('') };\n }\n\n private parseTipMacro(ele: Element, $: cheerio.CheerioAPI, pageId: string): ExtractedXmlItem {\n const tip = this.parseNodeContents($(ele), $, pageId);\n return { type: 'tip', content: tip.map((t) => t.content).join('') };\n }\n\n private parsePanelMacro(ele: Element, $: cheerio.CheerioAPI, pageId: string): ExtractedXmlItem {\n const panel = this.parseNodeContents($(ele), $, pageId, ['ac:parameter']);\n return { type: 'panel', content: panel.map((t) => t.content).join('') };\n }\n\n private parseExpandMacro(ele: Element, $: cheerio.CheerioAPI, pageId: string): ExtractedXmlItem {\n const expand = this.parseNodeContents($(ele), $, pageId);\n return { type: 'expand', content: expand.map((t) => t.content).join('') };\n }\n\n private parseStatusMacro(ele: Element, $: cheerio.CheerioAPI, pageId: string): ExtractedXmlItem {\n const status = this.parseNodeContents($(ele), $, pageId);\n return { type: 'status', content: status.map((t) => t.content).join('') };\n }\n\n private parseAdfExtension(ele: Element, $: cheerio.CheerioAPI): ExtractedXmlItem[] {\n const adfNode = $(ele).find('ac\\\\:adf-node');\n const content = adfNode.find('ac\\\\:adf-content').text().trim();\n return [{ type: 'adf-extension', content }];\n }\n\n private parseViewFileMacro(\n ele: Element,\n $: cheerio.CheerioAPI,\n pageId: string,\n ): ExtractedXmlItem {\n const attachment = $(ele).find('ac\\\\:parameter[ac\\\\:name=\"name\"] ri\\\\:attachment');\n const filename = attachment.attr('ri:filename')?.trim();\n\n if (!filename) {\n return { type: 'view-file', content: '' };\n }\n\n const fileUrl = this.baseUrl.includes('atlassian.net')\n ? `${this.baseUrl}/wiki/download/attachments/${pageId}/${encodeURIComponent(filename)}`\n : `${this.baseUrl}/download/attachments/${pageId}/${encodeURIComponent(filename)}`;\n\n return { type: 'view-file', content: fileUrl };\n }\n}\n","import { Element } from '@xmldom/xmldom';\nimport { ERRORMSG } from '../constant';\nimport { AnyParserMethod, ExtractingOptions } from '../types';\nimport { extractFiles, parseString } from '../util';\nimport { AnyExtractor } from '../extractors/any-extractor';\n\nexport class ExcelParser implements AnyParserMethod {\n mimes = ['application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'];\n\n private anyExtractor: AnyExtractor;\n constructor(anyExtractor: AnyExtractor) {\n this.anyExtractor = anyExtractor;\n }\n\n async apply(file: Buffer, extractingOptions: ExtractingOptions): Promise<string> {\n const patterns = {\n sheets: /xl\\/worksheets\\/sheet\\d+.xml/g,\n drawings: /xl\\/drawings\\/drawing\\d+.xml/g,\n charts: /xl\\/charts\\/chart\\d+.xml/g,\n sharedStrings: 'xl/sharedStrings.xml',\n images: /xl\\/media\\/image\\d+\\.(png|jpeg|jpg|webp)/g,\n };\n\n try {\n const files = await extractFiles(\n file,\n (path) =>\n [patterns.sheets, patterns.drawings, patterns.charts, patterns.images].some((regex) =>\n regex.test(path),\n ) || path === patterns.sharedStrings,\n );\n\n if (files.length === 0 || !files.some((file) => patterns.sheets.test(file.path))) {\n throw ERRORMSG.fileCorrupted('Missing or corrupted sheet files.');\n }\n\n const xmlContent = {\n sheets: files\n .filter((file) => patterns.sheets.test(file.path))\n .map((file) => file.content.toString()),\n drawings: files\n .filter((file) => patterns.drawings.test(file.path))\n .map((file) => file.content.toString()),\n charts: files\n .filter((file) => patterns.charts.test(file.path))\n .map((file) => file.content.toString()),\n sharedStrings: files\n .find((file) => file.path === patterns.sharedStrings)\n ?.content.toString(),\n images: files.filter((file) => patterns.images.test(file.path)),\n };\n\n const sharedStrings = this.parseSharedStrings(xmlContent.sharedStrings);\n\n const orderedText = files\n .map(async (file) => {\n if (patterns.sheets.test(file.path)) {\n return this.extractSheetText([file.content.toString()], sharedStrings);\n } else if (patterns.drawings.test(file.path)) {\n return this.extractDrawingText([file.content.toString()]);\n } else if (patterns.charts.test(file.path)) {\n return this.extractChartText([file.content.toString()]);\n } else if (patterns.images.test(file.path)) {\n return await this.extractImageText([file], extractingOptions);\n }\n return null;\n })\n .filter(Boolean);\n\n const resolvedText = await Promise.all(orderedText);\n return resolvedText.filter(Boolean).join('\\n');\n } catch (error) {\n console.error('AnyExtractor: Error parsing Excel file:', error);\n throw error;\n }\n }\n\n private parseSharedStrings(sharedStringsXml?: string): string[] {\n if (!sharedStringsXml) return [];\n const tNodes = parseString(sharedStringsXml).getElementsByTagName('t');\n return Array.from(tNodes).map((node) => node.childNodes[0]?.nodeValue ?? '');\n }\n\n private extractSheetText(sheetFiles: string[], sharedStrings: string[]): string {\n return sheetFiles\n .map((content) => {\n const cNodes = parseString(content).getElementsByTagName('c');\n return Array.from(cNodes)\n .filter((node) => this.isValidInlineString(node) || this.hasValidValueNode(node))\n .map((node) => this.getCellValue(node, sharedStrings))\n .join('\\n');\n })\n .join('\\n');\n }\n\n private extractDrawingText(drawingFiles: string[]): string {\n return drawingFiles\n .map((content) => {\n const pNodes = parseString(content).getElementsByTagName('a:p');\n return Array.from(pNodes)\n .map((node) => {\n const tNodes = node.getElementsByTagName('a:t');\n return Array.from(tNodes)\n .map((tNode) => tNode.childNodes[0]?.nodeValue ?? '')\n .join('');\n })\n .join('\\n');\n })\n .join('\\n');\n }\n\n private extractChartText(chartFiles: string[]): string {\n return chartFiles\n .map((content) => {\n const vNodes = parseString(content).getElementsByTagName('c:v');\n return Array.from(vNodes)\n .map((node) => node.childNodes[0]?.nodeValue ?? '')\n .join('\\n');\n })\n .join('\\n');\n }\n\n private async extractImageText(\n imageFiles: { path: string; content: Buffer }[],\n extractingOptions: ExtractingOptions,\n ): Promise<string> {\n const texts = await Promise.all(\n imageFiles.map(async (file) => {\n try {\n return await this.anyExtractor.parseFile(file.content, null, extractingOptions);\n } catch (e) {\n console.log(`AnyExtractor: Error extracting text from image ${file.path}:`, e);\n return '';\n }\n }),\n );\n return texts.filter(Boolean).join('\\n');\n }\n\n private isValidInlineString(cNode: Element): boolean {\n if (cNode.tagName.toLowerCase() !== 'c' || cNode.getAttribute('t') !== 'inlineStr')\n return false;\n const isNodes = cNode.getElementsByTagName('is');\n const tNodes = isNodes[0]?.getElementsByTagName('t');\n return tNodes?.[0]?.childNodes[0]?.nodeValue !== undefined;\n }\n\n private hasValidValueNode(cNode: Element): boolean {\n const vNodes = cNode.getElementsByTagName('v');\n return vNodes[0]?.childNodes[0]?.nodeValue !== undefined;\n }\n\n private getCellValue(cNode: Element, sharedStrings: string[]): string {\n if (this.isValidInlineString(cNode)) {\n return (\n cNode.getElementsByTagName('is')[0].getElementsByTagName('t')[0].childNodes[0].nodeValue ??\n ''\n );\n }\n\n if (this.hasValidValueNode(cNode)) {\n const isSharedString = cNode.getAttribute('t') === 's';\n const valueIndex = parseInt(\n cNode.getElementsByTagName('v')[0].childNodes[0].nodeValue ?? '',\n 10,\n );\n\n if (isSharedString) {\n if (valueIndex >= sharedStrings.length) {\n throw ERRORMSG.fileCorrupted('AnyExtractor: Invalid shared string index.');\n }\n return sharedStrings[valueIndex];\n }\n\n return valueIndex.toString();\n }\n\n return '';\n }\n}\n","import Tesseract from 'tesseract.js';\nimport { AnyParserMethod, ExtractingOptions, ExtractorConfig } from '../types';\nimport { fetch } from 'undici';\nimport { parse } from 'file-type-mime';\n\nexport class ImageParser implements AnyParserMethod {\n mimes = ['image/jpeg', 'image/png', 'image/webp'];\n\n public apply = async (\n file: Buffer,\n extractingOptions: ExtractingOptions,\n extractorConfig: ExtractorConfig,\n ): Promise<string> => {\n const { extractImages, imageExtractionMethod, language } = extractingOptions;\n if (!extractImages) {\n return '';\n }\n const mimeDetails = parse(\n file.buffer.slice(file.byteOffset, file.byteOffset + file.byteLength) as ArrayBuffer,\n );\n if (!mimeDetails) {\n throw new Error('AnyExtractor: Unable to parse MIME type');\n }\n const mimeType = mimeDetails.mime;\n if (!this.mimes.includes(mimeType)) {\n return '';\n }\n if (imageExtractionMethod === 'ocr') {\n return await this.performOCR(file, language);\n }\n\n const { llmProvider, visionModel, apikey } = extractorConfig.llm || {};\n if (!llmProvider || !visionModel || !apikey) {\n throw new Error(\n 'AnyExtractor: LLM provider, vision model and API key are required for image extraction',\n );\n }\n\n const base64Image = file.toString('base64');\n switch (llmProvider) {\n case 'openai':\n return this.handleOpenAI(base64Image, mimeType, visionModel, apikey);\n case 'google':\n return this.handleGoogle(base64Image, mimeType, visionModel, apikey);\n case 'anthropic':\n return this.handleAnthropic(base64Image, mimeType, visionModel, apikey);\n default:\n throw new Error(`ImageParser: Unsupported LLM provider '${llmProvider}'`);\n }\n };\n\n private performOCR = async (file: Buffer, language: string): Promise<string> => {\n const worker = await Tesseract.createWorker(language);\n const {\n data: { text },\n } = await worker.recognize(file);\n await worker.terminate();\n return text;\n };\n\n private handleOpenAI = async (\n base64Image: string,\n mimeType: string,\n visionModel: string,\n apikey: string,\n ): Promise<string> => {\n const response = await fetch('https://api.openai.com/v1/chat/completions', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${apikey}`,\n },\n body: JSON.stringify({\n model: visionModel,\n messages: [\n {\n role: 'user',\n content: [\n {\n type: 'text',\n text: 'Provide a concise summary of the image for semantic search. Exclude any introductions, labels, or formatting — just return the core content. Also include visible text and contextual details about layout, content type, or purpose.',\n },\n {\n type: 'image_url',\n image_url: {\n url: `data:${mimeType};base64,${base64Image}`,\n },\n },\n ],\n },\n ],\n }),\n });\n\n if (!response.ok) {\n throw new Error(`ImageParser: OpenAI API error ${response.status}`);\n }\n\n const data = (await response.json()) as {\n choices: { message: { content: string } }[];\n };\n return data.choices[0].message.content;\n };\n\n private handleGoogle = async (\n base64Image: string,\n mimeType: string,\n visionModel: string,\n apikey: string,\n ): Promise<string> => {\n const response = await fetch(\n `https://generativelanguage.googleapis.com/v1beta/models/${visionModel}:generateContent?key=${apikey}`,\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n contents: [\n {\n parts: [\n {\n text: 'Provide a concise summary of the image for semantic search. Exclude any introductions, labels, or formatting — just return the core content. Also include visible text and contextual details about layout, content type, or purpose.',\n },\n {\n inlineData: {\n mimeType: mimeType,\n data: base64Image,\n },\n },\n ],\n },\n ],\n }),\n },\n );\n\n if (!response.ok) {\n throw new Error(`Google Gemini error: ${response.statusText}`);\n }\n\n const data = (await response.json()) as {\n candidates: { content: { parts: { text: string }[] } }[];\n };\n return data.candidates[0].content.parts[0].text;\n };\n\n private handleAnthropic = async (\n base64Image: string,\n mimeType: string,\n visionModel: string,\n apikey: string,\n ): Promise<string> => {\n const response = await fetch('https://api.anthropic.com/v1/messages', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': apikey,\n 'anthropic-version': '2023-06-01',\n },\n body: JSON.stringify({\n model: visionModel,\n max_tokens: 300,\n messages: [\n {\n role: 'user',\n content: [\n {\n type: 'text',\n text: 'Provide a concise summary of the image for semantic search. Exclude any introductions, labels, or formatting — just return the core content. Also include visible text and contextual details about layout, content type, or purpose.',\n },\n {\n type: 'image',\n source: {\n type: 'base64',\n media_type: mimeType,\n data: base64Image,\n },\n },\n ],\n },\n ],\n }),\n });\n\n if (!response.ok) {\n throw new Error(`Anthropic Claude error: ${response.statusText}`);\n }\n\n const data = (await response.json()) as { content: { text: string }[] };\n return data.content[0].text;\n };\n}\n","import { AnyParserMethod } from '../types';\nimport { extractFiles, parseString } from '../util';\nimport { Element, Node } from '@xmldom/xmldom';\n\nexport class OpenOfficeParser implements AnyParserMethod {\n mimes = [\n 'application/vnd.oasis.opendocument.text',\n 'application/vnd.oasis.opendocument.spreadsheet',\n 'application/vnd.oasis.opendocument.presentation',\n 'application/vnd.oasis.opendocument.graphics',\n 'application/vnd.oasis.opendocument.formula',\n ];\n\n apply = async (file: Buffer): Promise<string> => {\n const MAIN_CONTENT_FILE = 'content.xml';\n const OBJECT_CONTENT_REGEX = /Object \\d+\\/content.xml/;\n\n try {\n const files = await extractFiles(\n file,\n (path) => path === MAIN_CONTENT_FILE || OBJECT_CONTENT_REGEX.test(path),\n );\n\n const contentFiles = files\n .filter((file) => file.path === MAIN_CONTENT_FILE || OBJECT_CONTENT_REGEX.test(file.path))\n .sort((a, b) => a.path.localeCompare(b.path));\n\n const notesText: string[] = [];\n const outputChunks: string[] = [];\n\n const ALLOWED_TEXT_TAGS = ['text:p', 'text:h'];\n const NOTES_TAG = 'presentation:notes';\n\n const extractAllTextsFromNode = (root: Element): string => {\n const textArray: string[] = [];\n traverseNode(root, textArray, true);\n return textArray.join('');\n };\n\n const traverseNode = (node: Node, textArray: string[], isFirstRecursion: boolean): void => {\n if (!node.childNodes || node.childNodes.length === 0) {\n if (\n node.parentNode &&\n (node.parentNode as Element).tagName.startsWith('text') &&\n node.nodeValue\n ) {\n const parent = node.parentNode as Element;\n if (isNotesNode(parent)) {\n notesText.push(node.nodeValue);\n if (ALLOWED_TEXT_TAGS.includes(parent.tagName) && !isFirstRecursion) {\n notesText.push('\\n');\n }\n } else {\n textArray.push(node.nodeValue);\n if (ALLOWED_TEXT_TAGS.includes(parent.tagName) && !isFirstRecursion) {\n textArray.push('\\n');\n }\n }\n }\n return;\n }\n\n for (let i = 0; i < node.childNodes.length; i++) {\n traverseNode(node.childNodes[i], textArray, false);\n }\n };\n\n const isNotesNode = (node: Element): boolean => {\n return node.tagName === NOTES_TAG\n ? true\n : node.parentNode\n ? isNotesNode(node.parentNode as Element)\n : false;\n };\n\n const isInvalidTextNode = (node: Element): boolean => {\n return ALLOWED_TEXT_TAGS.includes(node.tagName)\n ? true\n : node.parentNode\n ? isInvalidTextNode(node.parentNode as Element)\n : false;\n };\n\n for (const contentFile of contentFiles) {\n const xmlDoc = parseString(contentFile.content.toString());\n const textNodes = Array.from(xmlDoc.getElementsByTagName('*')).filter(\n (node) =>\n ALLOWED_TEXT_TAGS.includes(node.tagName) &&\n !isInvalidTextNode(node.parentNode as Element),\n );\n\n const textChunk = textNodes\n .map((node) => extractAllTextsFromNode(node))\n .filter((text) => text.trim() !== '')\n .join('\\n');\n\n if (textChunk) {\n outputChunks.push(textChunk);\n }\n }\n\n return [...outputChunks, ...notesText].join('\\n\\n');\n } catch (error) {\n console.error('AnyExtractor: Error parsing OpenOffice file:', error);\n throw error;\n }\n };\n}\n","import pdf from 'pdf-parse';\nimport { AnyParserMethod } from '../types';\n\nexport class PDFParser implements AnyParserMethod {\n mimes = ['application/pdf'];\n\n apply = async (file: Buffer): Promise<string> => {\n try {\n const data = await pdf(file);\n const textContent = data.text;\n return textContent;\n } catch (error) {\n console.error('AnyExtractor: Error parsing PDF file:', error);\n throw error;\n }\n };\n}\n","import { AnyExtractor } from '../extractors/any-extractor';\nimport { AnyParserMethod, ExtractingOptions } from '../types';\nimport { extractFiles, parseString } from '../util';\n\nexport class PowerPointParser implements AnyParserMethod {\n private anyExtractor: AnyExtractor;\n\n constructor(anyExtractor: AnyExtractor) {\n this.anyExtractor = anyExtractor;\n }\n\n mimes = ['application/vnd.openxmlformats-officedocument.presentationml.presentation'];\n\n async apply(file: Buffer, extractingOptions: ExtractingOptions): Promise<string> {\n const fileMatchRegex =\n /ppt\\/(notesSlides|slides)\\/(notesSlide|slide)\\d+\\.xml|ppt\\/media\\/image\\d+\\..+|ppt\\/slides\\/_rels\\/slide\\d+\\.xml.rels/i;\n const slideNumberRegex = /slide(\\d+)\\.xml/;\n const imageRegex = /^ppt\\/media\\/image\\d+\\..+$/i;\n\n try {\n const files = await extractFiles(file, (x) => fileMatchRegex.test(x));\n const imageBuffers: Record<string, Buffer> = {};\n const slideXmls: Record<number, string> = {};\n const relsFiles: Record<number, string> = {};\n\n for (const file of files) {\n if (imageRegex.test(file.path)) {\n imageBuffers[file.path] = file.content;\n } else if (/ppt\\/slides\\/slide\\d+\\.xml/.test(file.path)) {\n const match = file.path.match(slideNumberRegex);\n if (match) slideXmls[+match[1]] = file.content.toString();\n } else if (/ppt\\/slides\\/_rels\\/slide\\d+\\.xml.rels/.test(file.path)) {\n const match = file.path.match(slideNumberRegex);\n if (match) relsFiles[+match[1]] = file.content.toString();\n }\n }\n\n const results: string[] = [];\n\n const sortedSlideNumbers = Object.keys(slideXmls)\n .map(Number)\n .sort((a, b) => a - b);\n\n for (const slideNumber of sortedSlideNumbers) {\n const xmlContent = slideXmls[slideNumber];\n const slideText = this.extractTextFromXml(xmlContent);\n if (slideText) results.push(slideText);\n\n const imagePaths = this.extractImagePathsFromRels(relsFiles[slideNumber]);\n for (const imagePath of imagePaths) {\n const imageFullPath = `ppt/${imagePath.replace(/^(\\.\\.\\/)+/, '')}`;\n const imageBuffer = imageBuffers[imageFullPath];\n if (imageBuffer) {\n const imageDescription = await this.convertImageToText(imageBuffer, extractingOptions);\n if (imageDescription) {\n results.push(`[Image]: ${imageDescription}`);\n }\n }\n }\n }\n\n return results.join('\\n');\n } catch (error) {\n console.error('AnyExtractor: Error parsing PowerPoint file:', error);\n throw error;\n }\n }\n\n private extractTextFromXml(xml: string): string {\n const xmlParagraphNodesList = parseString(xml).getElementsByTagName('a:p');\n\n return Array.from(xmlParagraphNodesList)\n .filter((paragraphNode) => paragraphNode.getElementsByTagName('a:t').length > 0)\n .map((paragraphNode) => {\n const xmlTextNodeList = paragraphNode.getElementsByTagName('a:t');\n return Array.from(xmlTextNodeList)\n .map((textNode) => textNode.childNodes[0]?.nodeValue || '')\n .join('');\n })\n .join('\\n');\n }\n\n private extractImagePathsFromRels(relsXml?: string): string[] {\n if (!relsXml) return [];\n\n const rels = parseString(relsXml).getElementsByTagName('Relationship');\n return Array.from(rels)\n .filter((rel) => rel.getAttribute('Type')?.includes('/image') && rel.getAttribute('Target'))\n .map((rel) => rel.getAttribute('Target')!);\n }\n\n private async convertImageToText(\n imageBuffer: Buffer,\n extractingOptions: ExtractingOptions,\n ): Promise<string> {\n return this.anyExtractor.parseFile(imageBuffer, null, extractingOptions);\n }\n}\n","import { AnyParserMethod } from '../types';\n\nexport class SimpleParser implements AnyParserMethod {\n mimes = ['text/plain', 'application/json'];\n\n apply = async (file: Buffer): Promise<string> => {\n return file.toString('utf-8');\n };\n}\n","import { ERRORMSG } from '../constant';\nimport { AnyExtractor } from '../extractors/any-extractor';\nimport { AnyParserMethod, ExtractingOptions, ExtractedFile } from '../types';\nimport { extractFiles, parseString } from '../util';\n\nexport class WordParser implements AnyParserMethod {\n private anyExtractor: AnyExtractor;\n constructor(anyExtractor: AnyExtractor) {\n this.anyExtractor = anyExtractor;\n }\n\n mimes = ['application/vnd.openxmlformats-officedocument.wordprocessingml.document'];\n\n async apply(file: Buffer, extractingOptions: ExtractingOptions): Promise<string> {\n const mainRegex = /word\\/document[\\d+]?.xml/;\n const footnotesRegex = /word\\/footnotes[\\d+]?.xml/;\n const endnotesRegex = /word\\/endnotes[\\d+]?.xml/;\n const mediaRegex = /^word\\/media\\//;\n const relsRegex = /^word\\/_rels\\/document.xml.rels$/;\n\n try {\n const files = await extractFiles(\n file,\n (filePath) =>\n [mainRegex, footnotesRegex, endnotesRegex, relsRegex].some((r) => r.test(filePath)) ||\n mediaRegex.test(filePath),\n );\n\n const getFile = (regex: RegExp) => files.find((f) => regex.test(f.path));\n\n const mainDoc = getFile(mainRegex);\n const footnotesDoc = getFile(footnotesRegex);\n const endnotesDoc = getFile(endnotesRegex);\n const relsFile = getFile(relsRegex);\n\n if (!mainDoc || !relsFile) {\n throw ERRORMSG.fileCorrupted('Main content or relationships file is missing.');\n }\n\n const mediaFiles: Record<string, ExtractedFile> = {};\n for (const file of files) {\n if (mediaRegex.test(file.path)) {\n const fileName = file.path.split('/').pop()!;\n mediaFiles[fileName] = file;\n }\n }\n\n const embedMap = this.parseRelationships(relsFile.content.toString());\n\n const mainText = await this.extractTextAndImages(\n mainDoc.content.toString(),\n embedMap,\n mediaFiles,\n extractingOptions,\n );\n const footnotesText = footnotesDoc\n ? await this.extractTextAndImages(\n footnotesDoc.content.toString(),\n embedMap,\n mediaFiles,\n extractingOptions,\n )\n : '';\n const endnotesText = endnotesDoc\n ? await this.extractTextAndImages(\n endnotesDoc.content.toString(),\n embedMap,\n mediaFiles,\n extractingOptions,\n )\n : '';\n\n return [\n mainText,\n footnotesText ? '\\n--- Footnotes ---\\n' + footnotesText : '',\n endnotesText ? '\\n--- Endnotes ---\\n' + endnotesText : '',\n ].join('\\n');\n } catch (error) {\n console.error('AnyExtractor: Error parsing Word file:', error);\n throw error;\n }\n }\n\n private parseRelationships(xmlContent: string): Record<string, string> {\n const doc = parseString(xmlContent);\n const rels = doc.getElementsByTagName('Relationship');\n\n const map: Record<string, string> = {};\n for (const rel of Array.from(rels)) {\n const id = rel.getAttribute('Id');\n const target = rel.getAttribute('Target');\n if (id && target?.startsWith('media/')) {\n const filename = target.split('/').pop()!;\n map[id] = filename;\n }\n }\n return map;\n }\n\n private async extractTextAndImages(\n xmlContent: string,\n embedMap: Record<string, string>,\n mediaFiles: Record<string, ExtractedFile>,\n extractingOptions: ExtractingOptions,\n ): Promise<string> {\n const doc = parseString(xmlContent);\n const paragraphs = Array.from(doc.getElementsByTagName('w:p'));\n\n const parts: string[] = [];\n\n for (const paragraph of paragraphs) {\n let paragraphText = '';\n\n // Extract text nodes\n const texts = Array.from(paragraph.getElementsByTagName('w:t'));\n paragraphText += texts.map((t) => t.childNodes[0]?.nodeValue || '').join('');\n\n // Extract drawings/images\n const drawings = Array.from(paragraph.getElementsByTagName('w:drawing'));\n for (const drawing of drawings) {\n const blip = drawing.getElementsByTagName('a:blip')[0];\n const embedId = blip?.getAttribute('r:embed');\n\n if (embedId && embedMap[embedId]) {\n const imageFile = mediaFiles[embedMap[embedId]];\n if (imageFile) {\n const imageBuffer = imageFile.content;\n const imageDescription = await this.convertImageToText(imageBuffer, extractingOptions);\n paragraphText += `\\n[Image: ${imageDescription}]`;\n }\n }\n }\n\n if (paragraphText.trim()) {\n parts.push(paragraphText.trim());\n }\n }\n\n return parts.join('\\n');\n }\n\n private async convertImageToText(\n imageBuffer: Buffer,\n extractingOptions: ExtractingOptions,\n ): Promise<string> {\n return await this.anyExtractor.parseFile(imageBuffer, null, extractingOptions);\n }\n}\n"],"mappings":"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","names":["fs","concat","yauzl","import_undici","_","file","import_undici","import_file_type_mime","Tesseract","file","pdf","file","file"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/extractors/any-extractor.ts","../src/util.ts","../src/constant.ts","../src/crawler/confluence-crawler.ts","../src/file-parser/excel-parser.ts","../src/file-parser/image-parser.ts","../src/file-parser/openoffice-paser.ts","../src/file-parser/pdf-parser.ts","../src/file-parser/powerpoint-parser.ts","../src/file-parser/simple-parser.ts","../src/file-parser/word-parser.ts"],"sourcesContent":["import { AnyExtractor } from './extractors/any-extractor';\nimport { ExtractorConfig } from './types';\nimport {\n ExcelParser,\n ImageParser,\n OpenOfficeParser,\n PDFParser,\n PowerPointParser,\n SimpleParser,\n WordParser,\n} from './file-parser';\n\n/**\n * Get an extractor with parsers for various file formats.\n *\n * @param {ExtractorConfig} [config] - Optional configuration for the extractor.\n * @returns {AnyExtractor} - The configured AnyExtractor instance.\n */\nexport const getAnyExtractor = (config?: ExtractorConfig): AnyExtractor => {\n const anyExtractor = new AnyExtractor(config);\n\n // List of parsers for handling various file types\n const parsers = [\n new ExcelParser(anyExtractor),\n new ImageParser(),\n new OpenOfficeParser(),\n new PDFParser(),\n new PowerPointParser(anyExtractor),\n new SimpleParser(),\n new WordParser(anyExtractor),\n ];\n\n parsers.forEach((parser) => anyExtractor.addParser(parser));\n\n return anyExtractor;\n};\n\nexport * from './types';\n","import { parse } from 'file-type-mime';\nimport { AnyParserMethod, ConfluenceOptions, ExtractingOptions, ExtractorConfig } from '../types';\nimport { isValidUrl, readFile, readFileUrl } from '../util';\nimport { ConfluenceCrawler } from '../crawler/confluence-crawler';\n\nexport class AnyExtractor {\n private extractorConfig: ExtractorConfig = {\n llm: {\n llmProvider: 'openai',\n visionModel: '',\n apikey: '',\n },\n confluence: {\n baseUrl: '',\n email: '',\n apiKey: '',\n },\n };\n\n constructor(extractorConfig?: ExtractorConfig) {\n if (extractorConfig) {\n this.extractorConfig = extractorConfig;\n }\n }\n\n private mimeParserMap: Map<string, AnyParserMethod> = new Map();\n\n public addParser = (method: AnyParserMethod): this => {\n method.mimes.forEach((mime) => {\n this.mimeParserMap.set(mime, method);\n });\n return this;\n };\n\n public parseFile = async (\n input: string | Buffer,\n basicAuth: string | null = null,\n extractingOptions: ExtractingOptions = {\n extractImages: false,\n imageExtractionMethod: 'ocr',\n language: 'eng',\n },\n ): Promise<string> => {\n let preparedInput: Buffer;\n if (typeof input === 'string') {\n if (isValidUrl(input)) {\n preparedInput = await readFileUrl(input, basicAuth);\n } else {\n preparedInput = await readFile(input);\n }\n } else {\n preparedInput = input;\n }\n if (!preparedInput) {\n throw new Error('AnyExtractor: No input provided');\n }\n\n const mimeDetails = parse(\n preparedInput.buffer.slice(\n preparedInput.byteOffset,\n preparedInput.byteOffset + preparedInput.byteLength,\n ) as ArrayBuffer,\n );\n if (!mimeDetails) {\n return preparedInput.toString('utf-8');\n }\n const extractor = this.mimeParserMap.get(mimeDetails.mime);\n\n if (!extractor?.apply) {\n const message = `AnyExtractor: No extraction method registered for MIME type '${mimeDetails.mime}'`;\n throw new Error(message);\n }\n\n return await extractor.apply(preparedInput, extractingOptions, this.extractorConfig);\n };\n\n public parseConfluenceDoc = async (\n pageId: string,\n extractingOptions: ConfluenceOptions = {\n extractAttachments: false,\n extractImages: false,\n imageExtractionMethod: 'ocr',\n language: 'eng',\n },\n ): Promise<string> => {\n const { baseUrl, email, apiKey } = this.extractorConfig.confluence || {};\n if (!baseUrl || !email || !apiKey) {\n throw new Error('AnyExtractor: Confluence base URL, email, and API key are required');\n }\n const confCrawler = new ConfluenceCrawler(baseUrl, email, apiKey);\n const content = await confCrawler.extractPageContent(pageId);\n let textContent = '';\n for (const item of content) {\n if (item.type === 'image' && extractingOptions.extractImages) {\n const parsedFile = await this.parseFile(\n item.content,\n `Basic ${Buffer.from(`${email}:${apiKey}`).toString('base64')}`,\n extractingOptions,\n );\n textContent += parsedFile ? `\\n(Image): ${parsedFile}\\n` : '';\n } else if (item.type === 'view-file' && extractingOptions.extractAttachments) {\n const parsedFile = await this.parseFile(\n item.content,\n `Basic ${Buffer.from(`${email}:${apiKey}`).toString('base64')}`,\n extractingOptions,\n );\n textContent += parsedFile ? `\\n[Attachment]: ${parsedFile}\\n` : '';\n } else if (\n [\n 'h1',\n 'h2',\n 'h3',\n 'h4',\n 'h5',\n 'h6',\n 'p',\n 'table',\n 'li',\n 'code',\n 'info',\n 'warning',\n 'tip',\n 'note',\n 'panel',\n 'expand',\n 'adf-extension',\n ].includes(item.type)\n ) {\n textContent += `\\n${item.content}\\n`;\n } else if (item.type === 'text') {\n textContent += ` ${item.content}`;\n }\n }\n return textContent;\n };\n}\n","import { fetch } from 'undici';\nimport yauzl from 'yauzl';\nimport { ERRORMSG } from './constant';\nimport { ExtractedFile } from './types';\nimport concat from 'concat-stream';\nimport { DOMParser } from '@xmldom/xmldom';\nimport { promises as fs } from 'fs';\n\nexport async function readFile(filePath: string): Promise<Buffer> {\n return await fs.readFile(filePath);\n}\n\nexport const readFileUrl = async (url: string, basicAuth?: string | null): Promise<Buffer> => {\n const res = await fetch(url, {\n headers: {\n ...(basicAuth ? { Authorization: basicAuth } : {}),\n },\n });\n if (!res.ok) throw new Error(`Failed to fetch: ${res.statusText}`);\n return Buffer.from(await res.arrayBuffer());\n};\n\nexport const extractFiles = (\n zipInput: Buffer | string,\n filterFn: (x: string) => boolean,\n): Promise<ExtractedFile[]> => {\n return new Promise((res, rej) => {\n const processZipfile = (zipfile: yauzl.ZipFile) => {\n const extractedFiles: ExtractedFile[] = [];\n zipfile.readEntry();\n\n function processEntry(entry: yauzl.Entry) {\n if (filterFn(entry.fileName)) {\n zipfile.openReadStream(entry, (err, readStream) => {\n if (err) return rej(err);\n\n readStream.pipe(\n concat((data: Buffer) => {\n extractedFiles.push({\n path: entry.fileName,\n content: data,\n });\n zipfile.readEntry();\n }),\n );\n });\n } else zipfile.readEntry();\n }\n\n zipfile.on('entry', processEntry);\n zipfile.on('end', () => res(extractedFiles));\n zipfile.on('error', rej);\n };\n\n if (Buffer.isBuffer(zipInput)) {\n yauzl.fromBuffer(zipInput, { lazyEntries: true }, (err, zipfile) => {\n if (err) return rej(err);\n processZipfile(zipfile);\n });\n } else if (typeof zipInput === 'string') {\n yauzl.open(zipInput, { lazyEntries: true }, (err, zipfile) => {\n if (err) return rej(err);\n processZipfile(zipfile);\n });\n } else rej(ERRORMSG.invalidInput);\n });\n};\n\nexport const parseString = (xml: string) => {\n const parser = new DOMParser();\n return parser.parseFromString(xml, 'text/xml');\n};\n\nexport function isValidUrl(str: string | undefined | null): boolean {\n try {\n if (!str) return false;\n new URL(str);\n return true;\n } catch {\n return false;\n }\n}\n","/** Header for error messages */\nexport const ERRORHEADER = '[AnyExtractor]: ';\n\n/** Error messages */\nexport const ERRORMSG = {\n extensionUnsupported: (ext: string) =>\n `Sorry, AnyExtractor currently support docx, pptx, xlsx, odt, odp, ods, pdf files only. Create a ticket in Issues on github to add support for ${ext} files. Stay tuned for further updates.`,\n fileCorrupted: (filepath: string) =>\n `Your file ${filepath} seems to be corrupted. If you are sure it is fine, please create a ticket in Issues on github with the file to reproduce error.`,\n fileDoesNotExist: (filepath: string) =>\n `File ${filepath} could not be found! Check if the file exists or verify if the relative path to the file is correct from your terminal's location.`,\n locationNotFound: (location: string) =>\n `Entered location ${location} is not reachable! Please make sure that the entered directory location exists. Check relative paths and reenter.`,\n improperArguments: `Improper arguments`,\n improperBuffers: `Error occured while reading the file buffers`,\n invalidInput: `Invalid input type: Expected a Buffer or a valid file path`,\n};\n","import { fetch } from 'undici';\nimport { ExtractedXmlItem } from '../types';\nimport * as cheerio from 'cheerio';\nimport { Element, Text } from 'domhandler';\n\nexport class ConfluenceCrawler {\n private baseUrl: string;\n private email: string;\n private apiKey: string;\n private apiEndpoint: string;\n\n constructor(baseUrl: string, email: string, apiKey: string) {\n this.baseUrl = baseUrl.replace(/\\/+$/, '');\n this.email = email;\n this.apiKey = apiKey;\n\n this.apiEndpoint = this.baseUrl.includes('atlassian.net')\n ? `${this.baseUrl}/wiki/rest/api`\n : `${this.baseUrl}/rest/api`;\n }\n\n public async extractPageContent(pageId: string): Promise<ExtractedXmlItem[]> {\n const xmlContent = await this.fetchPageContent(pageId);\n return this.extractOrderedContentFromXml(xmlContent, pageId);\n }\n\n private async fetchPageContent(pageId: string): Promise<string> {\n const url = `${this.apiEndpoint}/content/${pageId}?expand=body.storage`;\n\n const response = await fetch(url, {\n headers: {\n Authorization: `Basic ${Buffer.from(`${this.email}:${this.apiKey}`).toString('base64')}`,\n 'Content-Type': 'application/json',\n },\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(\n `Request failed: ${response.status} ${response.statusText}. Response body: ${errorText}`,\n );\n }\n\n const data = (await response.json()) as { body: { [key: string]: { value: string } } };\n return data.body.storage.value;\n }\n\n private extractOrderedContentFromXml(xml: string, pageId: string): ExtractedXmlItem[] {\n let $ = cheerio.load(xml, { xmlMode: true });\n let node = $('ac\\\\:layout').first();\n if (node.length === 0) {\n const newXml = `<ac:layout>${xml}</ac:layout>`;\n $ = cheerio.load(newXml, { xmlMode: true });\n node = $('ac\\\\:layout').first();\n }\n const orderedContent = this.parseNodeContents(node, $, pageId);\n return orderedContent;\n }\n\n private parseNodeContents(\n node: cheerio.Cheerio<Element>,\n $: cheerio.CheerioAPI,\n pageId: string,\n ignoreTags: string[] = [],\n ): ExtractedXmlItem[] {\n let result: ExtractedXmlItem[] = [];\n const contents = node.contents();\n contents.each((_, ele) => {\n switch (ele.type) {\n case 'text':\n result.push(this.parseTextNode(ele));\n break;\n case 'tag':\n const tagResult = this.parseTagNode(ele, $, pageId, ignoreTags);\n result = result.concat(tagResult);\n break;\n default:\n break;\n }\n });\n return result;\n }\n\n private parseTextNode(ele: Text): ExtractedXmlItem {\n const text = ele.data.trim();\n return { type: 'text', content: text };\n }\n\n private parseTagNode(\n ele: Element,\n $: cheerio.CheerioAPI,\n pageId: string,\n ignoreTags: string[],\n ): ExtractedXmlItem[] {\n let result: ExtractedXmlItem[] = [];\n const tagName = ele.tagName;\n if (ignoreTags.includes(tagName)) {\n return result;\n }\n switch (tagName) {\n case 'ac:structured-macro':\n result = result.concat(this.parseStructuredMacro(ele, $, pageId));\n break;\n case 'ac:adf-extension':\n result = result.concat(this.parseAdfExtension(ele, $));\n break;\n case 'ac:task-list':\n result = result.concat(this.parseTaskList(ele, $, pageId));\n break;\n case 'ac:image':\n result = result.concat(this.parseImage(ele, $, pageId));\n break;\n case 'table':\n result = result.concat(this.parseTable(ele, $));\n break;\n case 'a':\n result = result.concat(this.parseLink(ele, $, pageId));\n break;\n default:\n result = result.concat(this.parseNodeContents($(ele), $, pageId));\n break;\n }\n return result;\n }\n\n private parseStructuredMacro(\n ele: Element,\n $: cheerio.CheerioAPI,\n pageId: string,\n ): ExtractedXmlItem[] {\n const macroName = ele.attribs['ac:name'];\n const result: ExtractedXmlItem[] = [];\n switch (macroName) {\n case 'code':\n result.push(this.parseCodeMacro(ele, $));\n break;\n case 'info':\n result.push(this.parseInfoMacro(ele, $, pageId));\n break;\n case 'warning':\n result.push(this.parseWarningMacro(ele, $, pageId));\n break;\n case 'note':\n result.push(this.parseNoteMacro(ele, $, pageId));\n break;\n case 'tip':\n result.push(this.parseTipMacro(ele, $, pageId));\n break;\n case 'panel':\n result.push(this.parsePanelMacro(ele, $, pageId));\n break;\n case 'expand':\n result.push(this.parseExpandMacro(ele, $, pageId));\n break;\n case 'status':\n result.push(this.parseStatusMacro(ele, $, pageId));\n break;\n case 'view-file':\n result.push(this.parseViewFileMacro(ele, $, pageId));\n break;\n }\n return result;\n }\n\n private parseLink(ele: Element, $: cheerio.CheerioAPI, pageId: string): ExtractedXmlItem[] {\n const href = $(ele).attr('href');\n const text = this.parseNodeContents($(ele), $, pageId);\n return [{ type: 'link', content: `${text.map((t) => t.content).join('')} (${href})` }];\n }\n\n private parseTaskList(ele: Element, $: cheerio.CheerioAPI, pageId: string): ExtractedXmlItem[] {\n const result: ExtractedXmlItem[] = [];\n const tasks = $(ele).find('ac\\\\:task');\n tasks.each((_, task) => {\n const taskStatus = $(task).find('ac\\\\:task-status').text().trim();\n const taskBody = this.parseNodeContents($(task).find('ac\\\\:task-body'), $, pageId);\n result.push({\n type: 'task',\n content: `${taskBody.map((t) => t.content).join('')} [Status: ${taskStatus}]`,\n });\n });\n return result;\n }\n\n private parseImage(ele: Element, $: cheerio.CheerioAPI, pageId: string): ExtractedXmlItem[] {\n const attachment = $(ele).find('ri\\\\:attachment');\n const filename = attachment.attr('ri:filename')?.trim();\n if (!filename) {\n return [];\n }\n\n const imageUrl = this.baseUrl.includes('atlassian.net')\n ? `${this.baseUrl}/wiki/download/attachments/${pageId}/${encodeURIComponent(filename)}`\n : `${this.baseUrl}/download/attachments/${pageId}/${encodeURIComponent(filename)}`;\n\n return [{ type: 'image', content: imageUrl }];\n }\n\n private parseTable(ele: Element, $: cheerio.CheerioAPI): ExtractedXmlItem[] {\n const result: ExtractedXmlItem[] = [];\n const rows = $(ele).find('tr');\n const tableData: string[] = [];\n rows.each((_, row) => {\n const cells = $(row).find('th, td');\n const rowData: string[] = [];\n cells.each((_, cell) => {\n rowData.push($(cell).text().trim());\n });\n tableData.push(rowData.join(' | '));\n });\n result.push({ type: 'table', content: tableData.join('\\n') });\n return result;\n }\n\n private parseCodeMacro(ele: Element, $: cheerio.CheerioAPI): ExtractedXmlItem {\n const code = $(ele).find('ac\\\\:plain-text-body').text().trim();\n return { type: 'code', content: code };\n }\n\n private parseInfoMacro(ele: Element, $: cheerio.CheerioAPI, pageId: string): ExtractedXmlItem {\n const info = this.parseNodeContents($(ele), $, pageId);\n return { type: 'info', content: info.map((t) => t.content).join('') };\n }\n\n private parseWarningMacro(ele: Element, $: cheerio.CheerioAPI, pageId: string): ExtractedXmlItem {\n const warning = this.parseNodeContents($(ele), $, pageId);\n return { type: 'warning', content: warning.map((t) => t.content).join('') };\n }\n\n private parseNoteMacro(ele: Element, $: cheerio.CheerioAPI, pageId: string): ExtractedXmlItem {\n const note = this.parseNodeContents($(ele), $, pageId);\n return { type: 'note', content: note.map((t) => t.content).join('') };\n }\n\n private parseTipMacro(ele: Element, $: cheerio.CheerioAPI, pageId: string): ExtractedXmlItem {\n const tip = this.parseNodeContents($(ele), $, pageId);\n return { type: 'tip', content: tip.map((t) => t.content).join('') };\n }\n\n private parsePanelMacro(ele: Element, $: cheerio.CheerioAPI, pageId: string): ExtractedXmlItem {\n const panel = this.parseNodeContents($(ele), $, pageId, ['ac:parameter']);\n return { type: 'panel', content: panel.map((t) => t.content).join('') };\n }\n\n private parseExpandMacro(ele: Element, $: cheerio.CheerioAPI, pageId: string): ExtractedXmlItem {\n const expand = this.parseNodeContents($(ele), $, pageId);\n return { type: 'expand', content: expand.map((t) => t.content).join('') };\n }\n\n private parseStatusMacro(ele: Element, $: cheerio.CheerioAPI, pageId: string): ExtractedXmlItem {\n const status = this.parseNodeContents($(ele), $, pageId);\n return { type: 'status', content: status.map((t) => t.content).join('') };\n }\n\n private parseAdfExtension(ele: Element, $: cheerio.CheerioAPI): ExtractedXmlItem[] {\n const adfNode = $(ele).find('ac\\\\:adf-node');\n const content = adfNode.find('ac\\\\:adf-content').text().trim();\n return [{ type: 'adf-extension', content }];\n }\n\n private parseViewFileMacro(\n ele: Element,\n $: cheerio.CheerioAPI,\n pageId: string,\n ): ExtractedXmlItem {\n const attachment = $(ele).find('ac\\\\:parameter[ac\\\\:name=\"name\"] ri\\\\:attachment');\n const filename = attachment.attr('ri:filename')?.trim();\n\n if (!filename) {\n return { type: 'view-file', content: '' };\n }\n\n const fileUrl = this.baseUrl.includes('atlassian.net')\n ? `${this.baseUrl}/wiki/download/attachments/${pageId}/${encodeURIComponent(filename)}`\n : `${this.baseUrl}/download/attachments/${pageId}/${encodeURIComponent(filename)}`;\n\n return { type: 'view-file', content: fileUrl };\n }\n}\n","import { Element } from '@xmldom/xmldom';\nimport { ERRORMSG } from '../constant';\nimport { AnyParserMethod, ExtractingOptions } from '../types';\nimport { extractFiles, parseString } from '../util';\nimport { AnyExtractor } from '../extractors/any-extractor';\n\nexport class ExcelParser implements AnyParserMethod {\n mimes = ['application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'];\n\n private anyExtractor: AnyExtractor;\n constructor(anyExtractor: AnyExtractor) {\n this.anyExtractor = anyExtractor;\n }\n\n async apply(file: Buffer, extractingOptions: ExtractingOptions): Promise<string> {\n const patterns = {\n sheets: /xl\\/worksheets\\/sheet\\d+.xml/g,\n drawings: /xl\\/drawings\\/drawing\\d+.xml/g,\n charts: /xl\\/charts\\/chart\\d+.xml/g,\n sharedStrings: 'xl/sharedStrings.xml',\n images: /xl\\/media\\/image\\d+\\.(png|jpeg|jpg|webp)/g,\n };\n\n try {\n const files = await extractFiles(\n file,\n (path) =>\n [patterns.sheets, patterns.drawings, patterns.charts, patterns.images].some((regex) =>\n regex.test(path),\n ) || path === patterns.sharedStrings,\n );\n\n if (files.length === 0 || !files.some((file) => patterns.sheets.test(file.path))) {\n throw ERRORMSG.fileCorrupted('Missing or corrupted sheet files.');\n }\n\n const xmlContent = {\n sheets: files\n .filter((file) => patterns.sheets.test(file.path))\n .map((file) => file.content.toString()),\n drawings: files\n .filter((file) => patterns.drawings.test(file.path))\n .map((file) => file.content.toString()),\n charts: files\n .filter((file) => patterns.charts.test(file.path))\n .map((file) => file.content.toString()),\n sharedStrings: files\n .find((file) => file.path === patterns.sharedStrings)\n ?.content.toString(),\n images: files.filter((file) => patterns.images.test(file.path)),\n };\n\n const sharedStrings = this.parseSharedStrings(xmlContent.sharedStrings);\n\n const orderedText = files\n .map(async (file) => {\n if (patterns.sheets.test(file.path)) {\n return this.extractSheetText([file.content.toString()], sharedStrings);\n } else if (patterns.drawings.test(file.path)) {\n return this.extractDrawingText([file.content.toString()]);\n } else if (patterns.charts.test(file.path)) {\n return this.extractChartText([file.content.toString()]);\n } else if (patterns.images.test(file.path)) {\n return await this.extractImageText([file], extractingOptions);\n }\n return null;\n })\n .filter(Boolean);\n\n const resolvedText = await Promise.all(orderedText);\n return resolvedText.filter(Boolean).join('\\n');\n } catch (error) {\n console.error('AnyExtractor: Error parsing Excel file:', error);\n throw error;\n }\n }\n\n private parseSharedStrings(sharedStringsXml?: string): string[] {\n if (!sharedStringsXml) return [];\n const tNodes = parseString(sharedStringsXml).getElementsByTagName('t');\n return Array.from(tNodes).map((node) => node.childNodes[0]?.nodeValue ?? '');\n }\n\n private extractSheetText(sheetFiles: string[], sharedStrings: string[]): string {\n return sheetFiles\n .map((content) => {\n const cNodes = parseString(content).getElementsByTagName('c');\n return Array.from(cNodes)\n .filter((node) => this.isValidInlineString(node) || this.hasValidValueNode(node))\n .map((node) => this.getCellValue(node, sharedStrings))\n .join('\\n');\n })\n .join('\\n');\n }\n\n private extractDrawingText(drawingFiles: string[]): string {\n return drawingFiles\n .map((content) => {\n const pNodes = parseString(content).getElementsByTagName('a:p');\n return Array.from(pNodes)\n .map((node) => {\n const tNodes = node.getElementsByTagName('a:t');\n return Array.from(tNodes)\n .map((tNode) => tNode.childNodes[0]?.nodeValue ?? '')\n .join('');\n })\n .join('\\n');\n })\n .join('\\n');\n }\n\n private extractChartText(chartFiles: string[]): string {\n return chartFiles\n .map((content) => {\n const vNodes = parseString(content).getElementsByTagName('c:v');\n return Array.from(vNodes)\n .map((node) => node.childNodes[0]?.nodeValue ?? '')\n .join('\\n');\n })\n .join('\\n');\n }\n\n private async extractImageText(\n imageFiles: { path: string; content: Buffer }[],\n extractingOptions: ExtractingOptions,\n ): Promise<string> {\n const texts = await Promise.all(\n imageFiles.map(async (file) => {\n try {\n return await this.anyExtractor.parseFile(file.content, null, extractingOptions);\n } catch (e) {\n console.log(`AnyExtractor: Error extracting text from image ${file.path}:`, e);\n return '';\n }\n }),\n );\n return texts.filter(Boolean).join('\\n');\n }\n\n private isValidInlineString(cNode: Element): boolean {\n if (cNode.tagName.toLowerCase() !== 'c' || cNode.getAttribute('t') !== 'inlineStr')\n return false;\n const isNodes = cNode.getElementsByTagName('is');\n const tNodes = isNodes[0]?.getElementsByTagName('t');\n return tNodes?.[0]?.childNodes[0]?.nodeValue !== undefined;\n }\n\n private hasValidValueNode(cNode: Element): boolean {\n const vNodes = cNode.getElementsByTagName('v');\n return vNodes[0]?.childNodes[0]?.nodeValue !== undefined;\n }\n\n private getCellValue(cNode: Element, sharedStrings: string[]): string {\n if (this.isValidInlineString(cNode)) {\n return (\n cNode.getElementsByTagName('is')[0].getElementsByTagName('t')[0].childNodes[0].nodeValue ??\n ''\n );\n }\n\n if (this.hasValidValueNode(cNode)) {\n const isSharedString = cNode.getAttribute('t') === 's';\n const valueIndex = parseInt(\n cNode.getElementsByTagName('v')[0].childNodes[0].nodeValue ?? '',\n 10,\n );\n\n if (isSharedString) {\n if (valueIndex >= sharedStrings.length) {\n throw ERRORMSG.fileCorrupted('AnyExtractor: Invalid shared string index.');\n }\n return sharedStrings[valueIndex];\n }\n\n return valueIndex.toString();\n }\n\n return '';\n }\n}\n","import Tesseract from 'tesseract.js';\nimport { AnyParserMethod, ExtractingOptions, ExtractorConfig } from '../types';\nimport { fetch } from 'undici';\nimport { parse } from 'file-type-mime';\n\nexport class ImageParser implements AnyParserMethod {\n mimes = ['image/jpeg', 'image/png', 'image/webp'];\n\n public apply = async (\n file: Buffer,\n extractingOptions: ExtractingOptions,\n extractorConfig: ExtractorConfig,\n ): Promise<string> => {\n const { extractImages, imageExtractionMethod, language } = extractingOptions;\n if (!extractImages) {\n return '';\n }\n const mimeDetails = parse(\n file.buffer.slice(file.byteOffset, file.byteOffset + file.byteLength) as ArrayBuffer,\n );\n if (!mimeDetails) {\n throw new Error('AnyExtractor: Unable to parse MIME type');\n }\n const mimeType = mimeDetails.mime;\n if (!this.mimes.includes(mimeType)) {\n return '';\n }\n if (imageExtractionMethod === 'ocr') {\n return await this.performOCR(file, language);\n }\n\n const { llmProvider, visionModel, apikey } = extractorConfig.llm || {};\n if (!llmProvider || !visionModel || !apikey) {\n throw new Error(\n 'AnyExtractor: LLM provider, vision model and API key are required for image extraction',\n );\n }\n\n const base64Image = file.toString('base64');\n switch (llmProvider) {\n case 'openai':\n return this.handleOpenAI(base64Image, mimeType, visionModel, apikey);\n case 'google':\n return this.handleGoogle(base64Image, mimeType, visionModel, apikey);\n case 'anthropic':\n return this.handleAnthropic(base64Image, mimeType, visionModel, apikey);\n default:\n throw new Error(`ImageParser: Unsupported LLM provider '${llmProvider}'`);\n }\n };\n\n private performOCR = async (file: Buffer, language: string): Promise<string> => {\n const worker = await Tesseract.createWorker(language);\n const {\n data: { text },\n } = await worker.recognize(file);\n await worker.terminate();\n return text;\n };\n\n private handleOpenAI = async (\n base64Image: string,\n mimeType: string,\n visionModel: string,\n apikey: string,\n ): Promise<string> => {\n const response = await fetch('https://api.openai.com/v1/chat/completions', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${apikey}`,\n },\n body: JSON.stringify({\n model: visionModel,\n messages: [\n {\n role: 'user',\n content: [\n {\n type: 'text',\n text: 'Provide a concise summary of the image for semantic search. Exclude any introductions, labels, or formatting — just return the core content. Also include visible text and contextual details about layout, content type, or purpose.',\n },\n {\n type: 'image_url',\n image_url: {\n url: `data:${mimeType};base64,${base64Image}`,\n },\n },\n ],\n },\n ],\n }),\n });\n\n if (!response.ok) {\n throw new Error(`ImageParser: OpenAI API error ${response.status}`);\n }\n\n const data = (await response.json()) as {\n choices: { message: { content: string } }[];\n };\n return data.choices[0].message.content;\n };\n\n private handleGoogle = async (\n base64Image: string,\n mimeType: string,\n visionModel: string,\n apikey: string,\n ): Promise<string> => {\n const response = await fetch(\n `https://generativelanguage.googleapis.com/v1beta/models/${visionModel}:generateContent?key=${apikey}`,\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n contents: [\n {\n parts: [\n {\n text: 'Provide a concise summary of the image for semantic search. Exclude any introductions, labels, or formatting — just return the core content. Also include visible text and contextual details about layout, content type, or purpose.',\n },\n {\n inlineData: {\n mimeType: mimeType,\n data: base64Image,\n },\n },\n ],\n },\n ],\n }),\n },\n );\n\n if (!response.ok) {\n throw new Error(`Google Gemini error: ${response.statusText}`);\n }\n\n const data = (await response.json()) as {\n candidates: { content: { parts: { text: string }[] } }[];\n };\n return data.candidates[0].content.parts[0].text;\n };\n\n private handleAnthropic = async (\n base64Image: string,\n mimeType: string,\n visionModel: string,\n apikey: string,\n ): Promise<string> => {\n const response = await fetch('https://api.anthropic.com/v1/messages', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': apikey,\n 'anthropic-version': '2023-06-01',\n },\n body: JSON.stringify({\n model: visionModel,\n max_tokens: 300,\n messages: [\n {\n role: 'user',\n content: [\n {\n type: 'text',\n text: 'Provide a concise summary of the image for semantic search. Exclude any introductions, labels, or formatting — just return the core content. Also include visible text and contextual details about layout, content type, or purpose.',\n },\n {\n type: 'image',\n source: {\n type: 'base64',\n media_type: mimeType,\n data: base64Image,\n },\n },\n ],\n },\n ],\n }),\n });\n\n if (!response.ok) {\n throw new Error(`Anthropic Claude error: ${response.statusText}`);\n }\n\n const data = (await response.json()) as { content: { text: string }[] };\n return data.content[0].text;\n };\n}\n","import { AnyParserMethod } from '../types';\nimport { extractFiles, parseString } from '../util';\nimport { Element, Node } from '@xmldom/xmldom';\n\nexport class OpenOfficeParser implements AnyParserMethod {\n mimes = [\n 'application/vnd.oasis.opendocument.text',\n 'application/vnd.oasis.opendocument.spreadsheet',\n 'application/vnd.oasis.opendocument.presentation',\n 'application/vnd.oasis.opendocument.graphics',\n 'application/vnd.oasis.opendocument.formula',\n ];\n\n apply = async (file: Buffer): Promise<string> => {\n const MAIN_CONTENT_FILE = 'content.xml';\n const OBJECT_CONTENT_REGEX = /Object \\d+\\/content.xml/;\n\n try {\n const files = await extractFiles(\n file,\n (path) => path === MAIN_CONTENT_FILE || OBJECT_CONTENT_REGEX.test(path),\n );\n\n const contentFiles = files\n .filter((file) => file.path === MAIN_CONTENT_FILE || OBJECT_CONTENT_REGEX.test(file.path))\n .sort((a, b) => a.path.localeCompare(b.path));\n\n const notesText: string[] = [];\n const outputChunks: string[] = [];\n\n const ALLOWED_TEXT_TAGS = ['text:p', 'text:h'];\n const NOTES_TAG = 'presentation:notes';\n\n const extractAllTextsFromNode = (root: Element): string => {\n const textArray: string[] = [];\n traverseNode(root, textArray, true);\n return textArray.join('');\n };\n\n const traverseNode = (node: Node, textArray: string[], isFirstRecursion: boolean): void => {\n if (!node.childNodes || node.childNodes.length === 0) {\n if (\n node.parentNode &&\n (node.parentNode as Element).tagName.startsWith('text') &&\n node.nodeValue\n ) {\n const parent = node.parentNode as Element;\n if (isNotesNode(parent)) {\n notesText.push(node.nodeValue);\n if (ALLOWED_TEXT_TAGS.includes(parent.tagName) && !isFirstRecursion) {\n notesText.push('\\n');\n }\n } else {\n textArray.push(node.nodeValue);\n if (ALLOWED_TEXT_TAGS.includes(parent.tagName) && !isFirstRecursion) {\n textArray.push('\\n');\n }\n }\n }\n return;\n }\n\n for (let i = 0; i < node.childNodes.length; i++) {\n traverseNode(node.childNodes[i], textArray, false);\n }\n };\n\n const isNotesNode = (node: Element): boolean => {\n return node.tagName === NOTES_TAG\n ? true\n : node.parentNode\n ? isNotesNode(node.parentNode as Element)\n : false;\n };\n\n const isInvalidTextNode = (node: Element): boolean => {\n return ALLOWED_TEXT_TAGS.includes(node.tagName)\n ? true\n : node.parentNode\n ? isInvalidTextNode(node.parentNode as Element)\n : false;\n };\n\n for (const contentFile of contentFiles) {\n const xmlDoc = parseString(contentFile.content.toString());\n const textNodes = Array.from(xmlDoc.getElementsByTagName('*')).filter(\n (node) =>\n ALLOWED_TEXT_TAGS.includes(node.tagName) &&\n !isInvalidTextNode(node.parentNode as Element),\n );\n\n const textChunk = textNodes\n .map((node) => extractAllTextsFromNode(node))\n .filter((text) => text.trim() !== '')\n .join('\\n');\n\n if (textChunk) {\n outputChunks.push(textChunk);\n }\n }\n\n return [...outputChunks, ...notesText].join('\\n\\n');\n } catch (error) {\n console.error('AnyExtractor: Error parsing OpenOffice file:', error);\n throw error;\n }\n };\n}\n","import pdf from 'pdf-parse';\nimport { AnyParserMethod } from '../types';\n\nexport class PDFParser implements AnyParserMethod {\n mimes = ['application/pdf'];\n\n apply = async (file: Buffer): Promise<string> => {\n try {\n const data = await pdf(file);\n const textContent = data.text;\n return textContent;\n } catch (error) {\n console.error('AnyExtractor: Error parsing PDF file:', error);\n throw error;\n }\n };\n}\n","import { AnyExtractor } from '../extractors/any-extractor';\nimport { AnyParserMethod, ExtractingOptions } from '../types';\nimport { extractFiles, parseString } from '../util';\n\nexport class PowerPointParser implements AnyParserMethod {\n private anyExtractor: AnyExtractor;\n\n constructor(anyExtractor: AnyExtractor) {\n this.anyExtractor = anyExtractor;\n }\n\n mimes = ['application/vnd.openxmlformats-officedocument.presentationml.presentation'];\n\n async apply(file: Buffer, extractingOptions: ExtractingOptions): Promise<string> {\n const fileMatchRegex =\n /ppt\\/(notesSlides|slides)\\/(notesSlide|slide)\\d+\\.xml|ppt\\/media\\/image\\d+\\..+|ppt\\/slides\\/_rels\\/slide\\d+\\.xml.rels/i;\n const slideNumberRegex = /slide(\\d+)\\.xml/;\n const imageRegex = /^ppt\\/media\\/image\\d+\\..+$/i;\n\n try {\n const files = await extractFiles(file, (x) => fileMatchRegex.test(x));\n const imageBuffers: Record<string, Buffer> = {};\n const slideXmls: Record<number, string> = {};\n const relsFiles: Record<number, string> = {};\n\n for (const file of files) {\n if (imageRegex.test(file.path)) {\n imageBuffers[file.path] = file.content;\n } else if (/ppt\\/slides\\/slide\\d+\\.xml/.test(file.path)) {\n const match = file.path.match(slideNumberRegex);\n if (match) slideXmls[+match[1]] = file.content.toString();\n } else if (/ppt\\/slides\\/_rels\\/slide\\d+\\.xml.rels/.test(file.path)) {\n const match = file.path.match(slideNumberRegex);\n if (match) relsFiles[+match[1]] = file.content.toString();\n }\n }\n\n const results: string[] = [];\n\n const sortedSlideNumbers = Object.keys(slideXmls)\n .map(Number)\n .sort((a, b) => a - b);\n\n for (const slideNumber of sortedSlideNumbers) {\n const xmlContent = slideXmls[slideNumber];\n const slideText = this.extractTextFromXml(xmlContent);\n if (slideText) results.push(slideText);\n\n const imagePaths = this.extractImagePathsFromRels(relsFiles[slideNumber]);\n for (const imagePath of imagePaths) {\n const imageFullPath = `ppt/${imagePath.replace(/^(\\.\\.\\/)+/, '')}`;\n const imageBuffer = imageBuffers[imageFullPath];\n if (imageBuffer) {\n const imageDescription = await this.convertImageToText(imageBuffer, extractingOptions);\n if (imageDescription) {\n results.push(`[Image]: ${imageDescription}`);\n }\n }\n }\n }\n\n return results.join('\\n');\n } catch (error) {\n console.error('AnyExtractor: Error parsing PowerPoint file:', error);\n throw error;\n }\n }\n\n private extractTextFromXml(xml: string): string {\n const xmlParagraphNodesList = parseString(xml).getElementsByTagName('a:p');\n\n return Array.from(xmlParagraphNodesList)\n .filter((paragraphNode) => paragraphNode.getElementsByTagName('a:t').length > 0)\n .map((paragraphNode) => {\n const xmlTextNodeList = paragraphNode.getElementsByTagName('a:t');\n return Array.from(xmlTextNodeList)\n .map((textNode) => textNode.childNodes[0]?.nodeValue || '')\n .join('');\n })\n .join('\\n');\n }\n\n private extractImagePathsFromRels(relsXml?: string): string[] {\n if (!relsXml) return [];\n\n const rels = parseString(relsXml).getElementsByTagName('Relationship');\n return Array.from(rels)\n .filter((rel) => rel.getAttribute('Type')?.includes('/image') && rel.getAttribute('Target'))\n .map((rel) => rel.getAttribute('Target')!);\n }\n\n private async convertImageToText(\n imageBuffer: Buffer,\n extractingOptions: ExtractingOptions,\n ): Promise<string> {\n return this.anyExtractor.parseFile(imageBuffer, null, extractingOptions);\n }\n}\n","import { AnyParserMethod } from '../types';\n\nexport class SimpleParser implements AnyParserMethod {\n mimes = ['text/plain', 'application/json'];\n\n apply = async (file: Buffer): Promise<string> => {\n return file.toString('utf-8');\n };\n}\n","import { ERRORMSG } from '../constant';\nimport { AnyExtractor } from '../extractors/any-extractor';\nimport { AnyParserMethod, ExtractingOptions, ExtractedFile } from '../types';\nimport { extractFiles, parseString } from '../util';\n\nexport class WordParser implements AnyParserMethod {\n private anyExtractor: AnyExtractor;\n constructor(anyExtractor: AnyExtractor) {\n this.anyExtractor = anyExtractor;\n }\n\n mimes = ['application/vnd.openxmlformats-officedocument.wordprocessingml.document'];\n\n async apply(file: Buffer, extractingOptions: ExtractingOptions): Promise<string> {\n const mainRegex = /word\\/document[\\d+]?.xml/;\n const footnotesRegex = /word\\/footnotes[\\d+]?.xml/;\n const endnotesRegex = /word\\/endnotes[\\d+]?.xml/;\n const mediaRegex = /^word\\/media\\//;\n const relsRegex = /^word\\/_rels\\/document.xml.rels$/;\n\n try {\n const files = await extractFiles(\n file,\n (filePath) =>\n [mainRegex, footnotesRegex, endnotesRegex, relsRegex].some((r) => r.test(filePath)) ||\n mediaRegex.test(filePath),\n );\n\n const getFile = (regex: RegExp) => files.find((f) => regex.test(f.path));\n\n const mainDoc = getFile(mainRegex);\n const footnotesDoc = getFile(footnotesRegex);\n const endnotesDoc = getFile(endnotesRegex);\n const relsFile = getFile(relsRegex);\n\n if (!mainDoc || !relsFile) {\n throw ERRORMSG.fileCorrupted('Main content or relationships file is missing.');\n }\n\n const mediaFiles: Record<string, ExtractedFile> = {};\n for (const file of files) {\n if (mediaRegex.test(file.path)) {\n const fileName = file.path.split('/').pop()!;\n mediaFiles[fileName] = file;\n }\n }\n\n const embedMap = this.parseRelationships(relsFile.content.toString());\n\n const mainText = await this.extractTextAndImages(\n mainDoc.content.toString(),\n embedMap,\n mediaFiles,\n extractingOptions,\n );\n const footnotesText = footnotesDoc\n ? await this.extractTextAndImages(\n footnotesDoc.content.toString(),\n embedMap,\n mediaFiles,\n extractingOptions,\n )\n : '';\n const endnotesText = endnotesDoc\n ? await this.extractTextAndImages(\n endnotesDoc.content.toString(),\n embedMap,\n mediaFiles,\n extractingOptions,\n )\n : '';\n\n return [\n mainText,\n footnotesText ? '\\n--- Footnotes ---\\n' + footnotesText : '',\n endnotesText ? '\\n--- Endnotes ---\\n' + endnotesText : '',\n ].join('\\n');\n } catch (error) {\n console.error('AnyExtractor: Error parsing Word file:', error);\n throw error;\n }\n }\n\n private parseRelationships(xmlContent: string): Record<string, string> {\n const doc = parseString(xmlContent);\n const rels = doc.getElementsByTagName('Relationship');\n\n const map: Record<string, string> = {};\n for (const rel of Array.from(rels)) {\n const id = rel.getAttribute('Id');\n const target = rel.getAttribute('Target');\n if (id && target?.startsWith('media/')) {\n const filename = target.split('/').pop()!;\n map[id] = filename;\n }\n }\n return map;\n }\n\n private async extractTextAndImages(\n xmlContent: string,\n embedMap: Record<string, string>,\n mediaFiles: Record<string, ExtractedFile>,\n extractingOptions: ExtractingOptions,\n ): Promise<string> {\n const doc = parseString(xmlContent);\n const paragraphs = Array.from(doc.getElementsByTagName('w:p'));\n\n const parts: string[] = [];\n\n for (const paragraph of paragraphs) {\n let paragraphText = '';\n\n // Extract text nodes\n const texts = Array.from(paragraph.getElementsByTagName('w:t'));\n paragraphText += texts.map((t) => t.childNodes[0]?.nodeValue || '').join('');\n\n // Extract drawings/images\n const drawings = Array.from(paragraph.getElementsByTagName('w:drawing'));\n for (const drawing of drawings) {\n const blip = drawing.getElementsByTagName('a:blip')[0];\n const embedId = blip?.getAttribute('r:embed');\n\n if (embedId && embedMap[embedId]) {\n const imageFile = mediaFiles[embedMap[embedId]];\n if (imageFile) {\n const imageBuffer = imageFile.content;\n const imageDescription = await this.convertImageToText(imageBuffer, extractingOptions);\n paragraphText += `\\n[Image: ${imageDescription}]`;\n }\n }\n }\n\n if (paragraphText.trim()) {\n parts.push(paragraphText.trim());\n }\n }\n\n return parts.join('\\n');\n }\n\n private async convertImageToText(\n imageBuffer: Buffer,\n extractingOptions: ExtractingOptions,\n ): Promise<string> {\n return await this.anyExtractor.parseFile(imageBuffer, null, extractingOptions);\n }\n}\n"],"mappings":"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","names":["fs","concat","yauzl","import_undici","_","file","import_undici","import_file_type_mime","Tesseract","file","pdf","file","file"]}
|
package/dist/index.mjs
CHANGED
|
@@ -116,8 +116,13 @@ var ConfluenceCrawler = class {
|
|
|
116
116
|
return data.body.storage.value;
|
|
117
117
|
}
|
|
118
118
|
extractOrderedContentFromXml(xml, pageId) {
|
|
119
|
-
|
|
120
|
-
|
|
119
|
+
let $ = cheerio.load(xml, { xmlMode: true });
|
|
120
|
+
let node = $("ac\\:layout").first();
|
|
121
|
+
if (node.length === 0) {
|
|
122
|
+
const newXml = `<ac:layout>${xml}</ac:layout>`;
|
|
123
|
+
$ = cheerio.load(newXml, { xmlMode: true });
|
|
124
|
+
node = $("ac\\:layout").first();
|
|
125
|
+
}
|
|
121
126
|
const orderedContent = this.parseNodeContents(node, $, pageId);
|
|
122
127
|
return orderedContent;
|
|
123
128
|
}
|
|
@@ -314,9 +319,7 @@ var AnyExtractor = class {
|
|
|
314
319
|
}
|
|
315
320
|
};
|
|
316
321
|
this.mimeParserMap = /* @__PURE__ */ new Map();
|
|
317
|
-
this.parsers = [];
|
|
318
322
|
this.addParser = (method) => {
|
|
319
|
-
this.parsers.push(method);
|
|
320
323
|
method.mimes.forEach((mime) => {
|
|
321
324
|
this.mimeParserMap.set(mime, method);
|
|
322
325
|
});
|
|
@@ -354,7 +357,7 @@ var AnyExtractor = class {
|
|
|
354
357
|
const message = `AnyExtractor: No extraction method registered for MIME type '${mimeDetails.mime}'`;
|
|
355
358
|
throw new Error(message);
|
|
356
359
|
}
|
|
357
|
-
return extractor.apply(preparedInput, extractingOptions, this.extractorConfig);
|
|
360
|
+
return await extractor.apply(preparedInput, extractingOptions, this.extractorConfig);
|
|
358
361
|
};
|
|
359
362
|
this.parseConfluenceDoc = async (pageId, extractingOptions = {
|
|
360
363
|
extractAttachments: false,
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/extractors/any-extractor.ts","../src/util.ts","../src/constant.ts","../src/crawler/confluence-crawler.ts","../src/file-parser/excel-parser.ts","../src/file-parser/image-parser.ts","../src/file-parser/openoffice-paser.ts","../src/file-parser/pdf-parser.ts","../src/file-parser/powerpoint-parser.ts","../src/file-parser/simple-parser.ts","../src/file-parser/word-parser.ts","../src/index.ts"],"sourcesContent":["import { parse } from 'file-type-mime';\nimport { AnyParserMethod, ConfluenceOptions, ExtractingOptions, ExtractorConfig } from '../types';\nimport { isValidUrl, readFile, readFileUrl } from '../util';\nimport { ConfluenceCrawler } from '../crawler/confluence-crawler';\n\nexport class AnyExtractor {\n private extractorConfig: ExtractorConfig = {\n llm: {\n llmProvider: 'openai',\n visionModel: '',\n apikey: '',\n },\n confluence: {\n baseUrl: '',\n email: '',\n apiKey: '',\n },\n };\n\n constructor(extractorConfig?: ExtractorConfig) {\n if (extractorConfig) {\n this.extractorConfig = extractorConfig;\n }\n }\n\n private mimeParserMap: Map<string, AnyParserMethod> = new Map();\n private parsers: AnyParserMethod[] = [];\n\n public addParser = (method: AnyParserMethod): this => {\n this.parsers.push(method);\n method.mimes.forEach((mime) => {\n this.mimeParserMap.set(mime, method);\n });\n return this;\n };\n\n public parseFile = async (\n input: string | Buffer,\n basicAuth: string | null = null,\n extractingOptions: ExtractingOptions = {\n extractImages: false,\n imageExtractionMethod: 'ocr',\n language: 'eng',\n },\n ): Promise<string> => {\n let preparedInput: Buffer;\n if (typeof input === 'string') {\n if (isValidUrl(input)) {\n preparedInput = await readFileUrl(input, basicAuth);\n } else {\n preparedInput = await readFile(input);\n }\n } else {\n preparedInput = input;\n }\n if (!preparedInput) {\n throw new Error('AnyExtractor: No input provided');\n }\n\n const mimeDetails = parse(\n preparedInput.buffer.slice(\n preparedInput.byteOffset,\n preparedInput.byteOffset + preparedInput.byteLength,\n ) as ArrayBuffer,\n );\n if (!mimeDetails) {\n return preparedInput.toString('utf-8');\n }\n const extractor = this.mimeParserMap.get(mimeDetails.mime);\n\n if (!extractor?.apply) {\n const message = `AnyExtractor: No extraction method registered for MIME type '${mimeDetails.mime}'`;\n throw new Error(message);\n }\n\n return extractor.apply(preparedInput, extractingOptions, this.extractorConfig);\n };\n\n public parseConfluenceDoc = async (\n pageId: string,\n extractingOptions: ConfluenceOptions = {\n extractAttachments: false,\n extractImages: false,\n imageExtractionMethod: 'ocr',\n language: 'eng',\n },\n ): Promise<string> => {\n const { baseUrl, email, apiKey } = this.extractorConfig.confluence || {};\n if (!baseUrl || !email || !apiKey) {\n throw new Error('AnyExtractor: Confluence base URL, email, and API key are required');\n }\n const confCrawler = new ConfluenceCrawler(baseUrl, email, apiKey);\n const content = await confCrawler.extractPageContent(pageId);\n let textContent = '';\n for (const item of content) {\n if (item.type === 'image' && extractingOptions.extractImages) {\n const parsedFile = await this.parseFile(\n item.content,\n `Basic ${Buffer.from(`${email}:${apiKey}`).toString('base64')}`,\n extractingOptions,\n );\n textContent += parsedFile ? `\\n(Image): ${parsedFile}\\n` : '';\n } else if (item.type === 'view-file' && extractingOptions.extractAttachments) {\n const parsedFile = await this.parseFile(\n item.content,\n `Basic ${Buffer.from(`${email}:${apiKey}`).toString('base64')}`,\n extractingOptions,\n );\n textContent += parsedFile ? `\\n[Attachment]: ${parsedFile}\\n` : '';\n } else if (\n [\n 'h1',\n 'h2',\n 'h3',\n 'h4',\n 'h5',\n 'h6',\n 'p',\n 'table',\n 'li',\n 'code',\n 'info',\n 'warning',\n 'tip',\n 'note',\n 'panel',\n 'expand',\n 'adf-extension',\n ].includes(item.type)\n ) {\n textContent += `\\n${item.content}\\n`;\n } else if (item.type === 'text') {\n textContent += ` ${item.content}`;\n }\n }\n return textContent;\n };\n}\n","import { fetch } from 'undici';\nimport yauzl from 'yauzl';\nimport { ERRORMSG } from './constant';\nimport { ExtractedFile } from './types';\nimport concat from 'concat-stream';\nimport { DOMParser } from '@xmldom/xmldom';\nimport { promises as fs } from 'fs';\n\nexport async function readFile(filePath: string): Promise<Buffer> {\n return await fs.readFile(filePath);\n}\n\nexport const readFileUrl = async (url: string, basicAuth?: string | null): Promise<Buffer> => {\n const res = await fetch(url, {\n headers: {\n ...(basicAuth ? { Authorization: basicAuth } : {}),\n },\n });\n if (!res.ok) throw new Error(`Failed to fetch: ${res.statusText}`);\n return Buffer.from(await res.arrayBuffer());\n};\n\nexport const extractFiles = (\n zipInput: Buffer | string,\n filterFn: (x: string) => boolean,\n): Promise<ExtractedFile[]> => {\n return new Promise((res, rej) => {\n const processZipfile = (zipfile: yauzl.ZipFile) => {\n const extractedFiles: ExtractedFile[] = [];\n zipfile.readEntry();\n\n function processEntry(entry: yauzl.Entry) {\n if (filterFn(entry.fileName)) {\n zipfile.openReadStream(entry, (err, readStream) => {\n if (err) return rej(err);\n\n readStream.pipe(\n concat((data: Buffer) => {\n extractedFiles.push({\n path: entry.fileName,\n content: data,\n });\n zipfile.readEntry();\n }),\n );\n });\n } else zipfile.readEntry();\n }\n\n zipfile.on('entry', processEntry);\n zipfile.on('end', () => res(extractedFiles));\n zipfile.on('error', rej);\n };\n\n if (Buffer.isBuffer(zipInput)) {\n yauzl.fromBuffer(zipInput, { lazyEntries: true }, (err, zipfile) => {\n if (err) return rej(err);\n processZipfile(zipfile);\n });\n } else if (typeof zipInput === 'string') {\n yauzl.open(zipInput, { lazyEntries: true }, (err, zipfile) => {\n if (err) return rej(err);\n processZipfile(zipfile);\n });\n } else rej(ERRORMSG.invalidInput);\n });\n};\n\nexport const parseString = (xml: string) => {\n const parser = new DOMParser();\n return parser.parseFromString(xml, 'text/xml');\n};\n\nexport function isValidUrl(str: string | undefined | null): boolean {\n try {\n if (!str) return false;\n new URL(str);\n return true;\n } catch {\n return false;\n }\n}\n","/** Header for error messages */\nexport const ERRORHEADER = '[AnyExtractor]: ';\n\n/** Error messages */\nexport const ERRORMSG = {\n extensionUnsupported: (ext: string) =>\n `Sorry, AnyExtractor currently support docx, pptx, xlsx, odt, odp, ods, pdf files only. Create a ticket in Issues on github to add support for ${ext} files. Stay tuned for further updates.`,\n fileCorrupted: (filepath: string) =>\n `Your file ${filepath} seems to be corrupted. If you are sure it is fine, please create a ticket in Issues on github with the file to reproduce error.`,\n fileDoesNotExist: (filepath: string) =>\n `File ${filepath} could not be found! Check if the file exists or verify if the relative path to the file is correct from your terminal's location.`,\n locationNotFound: (location: string) =>\n `Entered location ${location} is not reachable! Please make sure that the entered directory location exists. Check relative paths and reenter.`,\n improperArguments: `Improper arguments`,\n improperBuffers: `Error occured while reading the file buffers`,\n invalidInput: `Invalid input type: Expected a Buffer or a valid file path`,\n};\n","import { fetch } from 'undici';\nimport { ExtractedXmlItem } from '../types';\nimport * as cheerio from 'cheerio';\nimport { Element, Text } from 'domhandler';\n\nexport class ConfluenceCrawler {\n private baseUrl: string;\n private email: string;\n private apiKey: string;\n private apiEndpoint: string;\n\n constructor(baseUrl: string, email: string, apiKey: string) {\n this.baseUrl = baseUrl.replace(/\\/+$/, '');\n this.email = email;\n this.apiKey = apiKey;\n\n this.apiEndpoint = this.baseUrl.includes('atlassian.net')\n ? `${this.baseUrl}/wiki/rest/api`\n : `${this.baseUrl}/rest/api`;\n }\n\n public async extractPageContent(pageId: string): Promise<ExtractedXmlItem[]> {\n const xmlContent = await this.fetchPageContent(pageId);\n return this.extractOrderedContentFromXml(xmlContent, pageId);\n }\n\n private async fetchPageContent(pageId: string): Promise<string> {\n const url = `${this.apiEndpoint}/content/${pageId}?expand=body.storage`;\n\n const response = await fetch(url, {\n headers: {\n Authorization: `Basic ${Buffer.from(`${this.email}:${this.apiKey}`).toString('base64')}`,\n 'Content-Type': 'application/json',\n },\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(\n `Request failed: ${response.status} ${response.statusText}. Response body: ${errorText}`,\n );\n }\n\n const data = (await response.json()) as { body: { [key: string]: { value: string } } };\n return data.body.storage.value;\n }\n\n private extractOrderedContentFromXml(xml: string, pageId: string): ExtractedXmlItem[] {\n const $ = cheerio.load(xml, { xmlMode: true });\n const node = $('ac\\\\:layout').first();\n const orderedContent = this.parseNodeContents(node, $, pageId);\n return orderedContent;\n }\n\n private parseNodeContents(\n node: cheerio.Cheerio<Element>,\n $: cheerio.CheerioAPI,\n pageId: string,\n ignoreTags: string[] = [],\n ): ExtractedXmlItem[] {\n let result: ExtractedXmlItem[] = [];\n const contents = node.contents();\n contents.each((_, ele) => {\n switch (ele.type) {\n case 'text':\n result.push(this.parseTextNode(ele));\n break;\n case 'tag':\n const tagResult = this.parseTagNode(ele, $, pageId, ignoreTags);\n result = result.concat(tagResult);\n break;\n default:\n break;\n }\n });\n return result;\n }\n\n private parseTextNode(ele: Text): ExtractedXmlItem {\n const text = ele.data.trim();\n return { type: 'text', content: text };\n }\n\n private parseTagNode(\n ele: Element,\n $: cheerio.CheerioAPI,\n pageId: string,\n ignoreTags: string[],\n ): ExtractedXmlItem[] {\n let result: ExtractedXmlItem[] = [];\n const tagName = ele.tagName;\n if (ignoreTags.includes(tagName)) {\n return result;\n }\n switch (tagName) {\n case 'ac:structured-macro':\n result = result.concat(this.parseStructuredMacro(ele, $, pageId));\n break;\n case 'ac:adf-extension':\n result = result.concat(this.parseAdfExtension(ele, $));\n break;\n case 'ac:task-list':\n result = result.concat(this.parseTaskList(ele, $, pageId));\n break;\n case 'ac:image':\n result = result.concat(this.parseImage(ele, $, pageId));\n break;\n case 'table':\n result = result.concat(this.parseTable(ele, $));\n break;\n case 'a':\n result = result.concat(this.parseLink(ele, $, pageId));\n break;\n default:\n result = result.concat(this.parseNodeContents($(ele), $, pageId));\n break;\n }\n return result;\n }\n\n private parseStructuredMacro(\n ele: Element,\n $: cheerio.CheerioAPI,\n pageId: string,\n ): ExtractedXmlItem[] {\n const macroName = ele.attribs['ac:name'];\n const result: ExtractedXmlItem[] = [];\n switch (macroName) {\n case 'code':\n result.push(this.parseCodeMacro(ele, $));\n break;\n case 'info':\n result.push(this.parseInfoMacro(ele, $, pageId));\n break;\n case 'warning':\n result.push(this.parseWarningMacro(ele, $, pageId));\n break;\n case 'note':\n result.push(this.parseNoteMacro(ele, $, pageId));\n break;\n case 'tip':\n result.push(this.parseTipMacro(ele, $, pageId));\n break;\n case 'panel':\n result.push(this.parsePanelMacro(ele, $, pageId));\n break;\n case 'expand':\n result.push(this.parseExpandMacro(ele, $, pageId));\n break;\n case 'status':\n result.push(this.parseStatusMacro(ele, $, pageId));\n break;\n case 'view-file':\n result.push(this.parseViewFileMacro(ele, $, pageId));\n break;\n }\n return result;\n }\n\n private parseLink(ele: Element, $: cheerio.CheerioAPI, pageId: string): ExtractedXmlItem[] {\n const href = $(ele).attr('href');\n const text = this.parseNodeContents($(ele), $, pageId);\n return [{ type: 'link', content: `${text.map((t) => t.content).join('')} (${href})` }];\n }\n\n private parseTaskList(ele: Element, $: cheerio.CheerioAPI, pageId: string): ExtractedXmlItem[] {\n const result: ExtractedXmlItem[] = [];\n const tasks = $(ele).find('ac\\\\:task');\n tasks.each((_, task) => {\n const taskStatus = $(task).find('ac\\\\:task-status').text().trim();\n const taskBody = this.parseNodeContents($(task).find('ac\\\\:task-body'), $, pageId);\n result.push({\n type: 'task',\n content: `${taskBody.map((t) => t.content).join('')} [Status: ${taskStatus}]`,\n });\n });\n return result;\n }\n\n private parseImage(ele: Element, $: cheerio.CheerioAPI, pageId: string): ExtractedXmlItem[] {\n const attachment = $(ele).find('ri\\\\:attachment');\n const filename = attachment.attr('ri:filename')?.trim();\n if (!filename) {\n return [];\n }\n\n const imageUrl = this.baseUrl.includes('atlassian.net')\n ? `${this.baseUrl}/wiki/download/attachments/${pageId}/${encodeURIComponent(filename)}`\n : `${this.baseUrl}/download/attachments/${pageId}/${encodeURIComponent(filename)}`;\n\n return [{ type: 'image', content: imageUrl }];\n }\n\n private parseTable(ele: Element, $: cheerio.CheerioAPI): ExtractedXmlItem[] {\n const result: ExtractedXmlItem[] = [];\n const rows = $(ele).find('tr');\n const tableData: string[] = [];\n rows.each((_, row) => {\n const cells = $(row).find('th, td');\n const rowData: string[] = [];\n cells.each((_, cell) => {\n rowData.push($(cell).text().trim());\n });\n tableData.push(rowData.join(' | '));\n });\n result.push({ type: 'table', content: tableData.join('\\n') });\n return result;\n }\n\n private parseCodeMacro(ele: Element, $: cheerio.CheerioAPI): ExtractedXmlItem {\n const code = $(ele).find('ac\\\\:plain-text-body').text().trim();\n return { type: 'code', content: code };\n }\n\n private parseInfoMacro(ele: Element, $: cheerio.CheerioAPI, pageId: string): ExtractedXmlItem {\n const info = this.parseNodeContents($(ele), $, pageId);\n return { type: 'info', content: info.map((t) => t.content).join('') };\n }\n\n private parseWarningMacro(ele: Element, $: cheerio.CheerioAPI, pageId: string): ExtractedXmlItem {\n const warning = this.parseNodeContents($(ele), $, pageId);\n return { type: 'warning', content: warning.map((t) => t.content).join('') };\n }\n\n private parseNoteMacro(ele: Element, $: cheerio.CheerioAPI, pageId: string): ExtractedXmlItem {\n const note = this.parseNodeContents($(ele), $, pageId);\n return { type: 'note', content: note.map((t) => t.content).join('') };\n }\n\n private parseTipMacro(ele: Element, $: cheerio.CheerioAPI, pageId: string): ExtractedXmlItem {\n const tip = this.parseNodeContents($(ele), $, pageId);\n return { type: 'tip', content: tip.map((t) => t.content).join('') };\n }\n\n private parsePanelMacro(ele: Element, $: cheerio.CheerioAPI, pageId: string): ExtractedXmlItem {\n const panel = this.parseNodeContents($(ele), $, pageId, ['ac:parameter']);\n return { type: 'panel', content: panel.map((t) => t.content).join('') };\n }\n\n private parseExpandMacro(ele: Element, $: cheerio.CheerioAPI, pageId: string): ExtractedXmlItem {\n const expand = this.parseNodeContents($(ele), $, pageId);\n return { type: 'expand', content: expand.map((t) => t.content).join('') };\n }\n\n private parseStatusMacro(ele: Element, $: cheerio.CheerioAPI, pageId: string): ExtractedXmlItem {\n const status = this.parseNodeContents($(ele), $, pageId);\n return { type: 'status', content: status.map((t) => t.content).join('') };\n }\n\n private parseAdfExtension(ele: Element, $: cheerio.CheerioAPI): ExtractedXmlItem[] {\n const adfNode = $(ele).find('ac\\\\:adf-node');\n const content = adfNode.find('ac\\\\:adf-content').text().trim();\n return [{ type: 'adf-extension', content }];\n }\n\n private parseViewFileMacro(\n ele: Element,\n $: cheerio.CheerioAPI,\n pageId: string,\n ): ExtractedXmlItem {\n const attachment = $(ele).find('ac\\\\:parameter[ac\\\\:name=\"name\"] ri\\\\:attachment');\n const filename = attachment.attr('ri:filename')?.trim();\n\n if (!filename) {\n return { type: 'view-file', content: '' };\n }\n\n const fileUrl = this.baseUrl.includes('atlassian.net')\n ? `${this.baseUrl}/wiki/download/attachments/${pageId}/${encodeURIComponent(filename)}`\n : `${this.baseUrl}/download/attachments/${pageId}/${encodeURIComponent(filename)}`;\n\n return { type: 'view-file', content: fileUrl };\n }\n}\n","import { Element } from '@xmldom/xmldom';\nimport { ERRORMSG } from '../constant';\nimport { AnyParserMethod, ExtractingOptions } from '../types';\nimport { extractFiles, parseString } from '../util';\nimport { AnyExtractor } from '../extractors/any-extractor';\n\nexport class ExcelParser implements AnyParserMethod {\n mimes = ['application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'];\n\n private anyExtractor: AnyExtractor;\n constructor(anyExtractor: AnyExtractor) {\n this.anyExtractor = anyExtractor;\n }\n\n async apply(file: Buffer, extractingOptions: ExtractingOptions): Promise<string> {\n const patterns = {\n sheets: /xl\\/worksheets\\/sheet\\d+.xml/g,\n drawings: /xl\\/drawings\\/drawing\\d+.xml/g,\n charts: /xl\\/charts\\/chart\\d+.xml/g,\n sharedStrings: 'xl/sharedStrings.xml',\n images: /xl\\/media\\/image\\d+\\.(png|jpeg|jpg|webp)/g,\n };\n\n try {\n const files = await extractFiles(\n file,\n (path) =>\n [patterns.sheets, patterns.drawings, patterns.charts, patterns.images].some((regex) =>\n regex.test(path),\n ) || path === patterns.sharedStrings,\n );\n\n if (files.length === 0 || !files.some((file) => patterns.sheets.test(file.path))) {\n throw ERRORMSG.fileCorrupted('Missing or corrupted sheet files.');\n }\n\n const xmlContent = {\n sheets: files\n .filter((file) => patterns.sheets.test(file.path))\n .map((file) => file.content.toString()),\n drawings: files\n .filter((file) => patterns.drawings.test(file.path))\n .map((file) => file.content.toString()),\n charts: files\n .filter((file) => patterns.charts.test(file.path))\n .map((file) => file.content.toString()),\n sharedStrings: files\n .find((file) => file.path === patterns.sharedStrings)\n ?.content.toString(),\n images: files.filter((file) => patterns.images.test(file.path)),\n };\n\n const sharedStrings = this.parseSharedStrings(xmlContent.sharedStrings);\n\n const orderedText = files\n .map(async (file) => {\n if (patterns.sheets.test(file.path)) {\n return this.extractSheetText([file.content.toString()], sharedStrings);\n } else if (patterns.drawings.test(file.path)) {\n return this.extractDrawingText([file.content.toString()]);\n } else if (patterns.charts.test(file.path)) {\n return this.extractChartText([file.content.toString()]);\n } else if (patterns.images.test(file.path)) {\n return await this.extractImageText([file], extractingOptions);\n }\n return null;\n })\n .filter(Boolean);\n\n const resolvedText = await Promise.all(orderedText);\n return resolvedText.filter(Boolean).join('\\n');\n } catch (error) {\n console.error('AnyExtractor: Error parsing Excel file:', error);\n throw error;\n }\n }\n\n private parseSharedStrings(sharedStringsXml?: string): string[] {\n if (!sharedStringsXml) return [];\n const tNodes = parseString(sharedStringsXml).getElementsByTagName('t');\n return Array.from(tNodes).map((node) => node.childNodes[0]?.nodeValue ?? '');\n }\n\n private extractSheetText(sheetFiles: string[], sharedStrings: string[]): string {\n return sheetFiles\n .map((content) => {\n const cNodes = parseString(content).getElementsByTagName('c');\n return Array.from(cNodes)\n .filter((node) => this.isValidInlineString(node) || this.hasValidValueNode(node))\n .map((node) => this.getCellValue(node, sharedStrings))\n .join('\\n');\n })\n .join('\\n');\n }\n\n private extractDrawingText(drawingFiles: string[]): string {\n return drawingFiles\n .map((content) => {\n const pNodes = parseString(content).getElementsByTagName('a:p');\n return Array.from(pNodes)\n .map((node) => {\n const tNodes = node.getElementsByTagName('a:t');\n return Array.from(tNodes)\n .map((tNode) => tNode.childNodes[0]?.nodeValue ?? '')\n .join('');\n })\n .join('\\n');\n })\n .join('\\n');\n }\n\n private extractChartText(chartFiles: string[]): string {\n return chartFiles\n .map((content) => {\n const vNodes = parseString(content).getElementsByTagName('c:v');\n return Array.from(vNodes)\n .map((node) => node.childNodes[0]?.nodeValue ?? '')\n .join('\\n');\n })\n .join('\\n');\n }\n\n private async extractImageText(\n imageFiles: { path: string; content: Buffer }[],\n extractingOptions: ExtractingOptions,\n ): Promise<string> {\n const texts = await Promise.all(\n imageFiles.map(async (file) => {\n try {\n return await this.anyExtractor.parseFile(file.content, null, extractingOptions);\n } catch (e) {\n console.log(`AnyExtractor: Error extracting text from image ${file.path}:`, e);\n return '';\n }\n }),\n );\n return texts.filter(Boolean).join('\\n');\n }\n\n private isValidInlineString(cNode: Element): boolean {\n if (cNode.tagName.toLowerCase() !== 'c' || cNode.getAttribute('t') !== 'inlineStr')\n return false;\n const isNodes = cNode.getElementsByTagName('is');\n const tNodes = isNodes[0]?.getElementsByTagName('t');\n return tNodes?.[0]?.childNodes[0]?.nodeValue !== undefined;\n }\n\n private hasValidValueNode(cNode: Element): boolean {\n const vNodes = cNode.getElementsByTagName('v');\n return vNodes[0]?.childNodes[0]?.nodeValue !== undefined;\n }\n\n private getCellValue(cNode: Element, sharedStrings: string[]): string {\n if (this.isValidInlineString(cNode)) {\n return (\n cNode.getElementsByTagName('is')[0].getElementsByTagName('t')[0].childNodes[0].nodeValue ??\n ''\n );\n }\n\n if (this.hasValidValueNode(cNode)) {\n const isSharedString = cNode.getAttribute('t') === 's';\n const valueIndex = parseInt(\n cNode.getElementsByTagName('v')[0].childNodes[0].nodeValue ?? '',\n 10,\n );\n\n if (isSharedString) {\n if (valueIndex >= sharedStrings.length) {\n throw ERRORMSG.fileCorrupted('AnyExtractor: Invalid shared string index.');\n }\n return sharedStrings[valueIndex];\n }\n\n return valueIndex.toString();\n }\n\n return '';\n }\n}\n","import Tesseract from 'tesseract.js';\nimport { AnyParserMethod, ExtractingOptions, ExtractorConfig } from '../types';\nimport { fetch } from 'undici';\nimport { parse } from 'file-type-mime';\n\nexport class ImageParser implements AnyParserMethod {\n mimes = ['image/jpeg', 'image/png', 'image/webp'];\n\n public apply = async (\n file: Buffer,\n extractingOptions: ExtractingOptions,\n extractorConfig: ExtractorConfig,\n ): Promise<string> => {\n const { extractImages, imageExtractionMethod, language } = extractingOptions;\n if (!extractImages) {\n return '';\n }\n const mimeDetails = parse(\n file.buffer.slice(file.byteOffset, file.byteOffset + file.byteLength) as ArrayBuffer,\n );\n if (!mimeDetails) {\n throw new Error('AnyExtractor: Unable to parse MIME type');\n }\n const mimeType = mimeDetails.mime;\n if (!this.mimes.includes(mimeType)) {\n return '';\n }\n if (imageExtractionMethod === 'ocr') {\n return await this.performOCR(file, language);\n }\n\n const { llmProvider, visionModel, apikey } = extractorConfig.llm || {};\n if (!llmProvider || !visionModel || !apikey) {\n throw new Error(\n 'AnyExtractor: LLM provider, vision model and API key are required for image extraction',\n );\n }\n\n const base64Image = file.toString('base64');\n switch (llmProvider) {\n case 'openai':\n return this.handleOpenAI(base64Image, mimeType, visionModel, apikey);\n case 'google':\n return this.handleGoogle(base64Image, mimeType, visionModel, apikey);\n case 'anthropic':\n return this.handleAnthropic(base64Image, mimeType, visionModel, apikey);\n default:\n throw new Error(`ImageParser: Unsupported LLM provider '${llmProvider}'`);\n }\n };\n\n private performOCR = async (file: Buffer, language: string): Promise<string> => {\n const worker = await Tesseract.createWorker(language);\n const {\n data: { text },\n } = await worker.recognize(file);\n await worker.terminate();\n return text;\n };\n\n private handleOpenAI = async (\n base64Image: string,\n mimeType: string,\n visionModel: string,\n apikey: string,\n ): Promise<string> => {\n const response = await fetch('https://api.openai.com/v1/chat/completions', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${apikey}`,\n },\n body: JSON.stringify({\n model: visionModel,\n messages: [\n {\n role: 'user',\n content: [\n {\n type: 'text',\n text: 'Provide a concise summary of the image for semantic search. Exclude any introductions, labels, or formatting — just return the core content. Also include visible text and contextual details about layout, content type, or purpose.',\n },\n {\n type: 'image_url',\n image_url: {\n url: `data:${mimeType};base64,${base64Image}`,\n },\n },\n ],\n },\n ],\n }),\n });\n\n if (!response.ok) {\n throw new Error(`ImageParser: OpenAI API error ${response.status}`);\n }\n\n const data = (await response.json()) as {\n choices: { message: { content: string } }[];\n };\n return data.choices[0].message.content;\n };\n\n private handleGoogle = async (\n base64Image: string,\n mimeType: string,\n visionModel: string,\n apikey: string,\n ): Promise<string> => {\n const response = await fetch(\n `https://generativelanguage.googleapis.com/v1beta/models/${visionModel}:generateContent?key=${apikey}`,\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n contents: [\n {\n parts: [\n {\n text: 'Provide a concise summary of the image for semantic search. Exclude any introductions, labels, or formatting — just return the core content. Also include visible text and contextual details about layout, content type, or purpose.',\n },\n {\n inlineData: {\n mimeType: mimeType,\n data: base64Image,\n },\n },\n ],\n },\n ],\n }),\n },\n );\n\n if (!response.ok) {\n throw new Error(`Google Gemini error: ${response.statusText}`);\n }\n\n const data = (await response.json()) as {\n candidates: { content: { parts: { text: string }[] } }[];\n };\n return data.candidates[0].content.parts[0].text;\n };\n\n private handleAnthropic = async (\n base64Image: string,\n mimeType: string,\n visionModel: string,\n apikey: string,\n ): Promise<string> => {\n const response = await fetch('https://api.anthropic.com/v1/messages', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': apikey,\n 'anthropic-version': '2023-06-01',\n },\n body: JSON.stringify({\n model: visionModel,\n max_tokens: 300,\n messages: [\n {\n role: 'user',\n content: [\n {\n type: 'text',\n text: 'Provide a concise summary of the image for semantic search. Exclude any introductions, labels, or formatting — just return the core content. Also include visible text and contextual details about layout, content type, or purpose.',\n },\n {\n type: 'image',\n source: {\n type: 'base64',\n media_type: mimeType,\n data: base64Image,\n },\n },\n ],\n },\n ],\n }),\n });\n\n if (!response.ok) {\n throw new Error(`Anthropic Claude error: ${response.statusText}`);\n }\n\n const data = (await response.json()) as { content: { text: string }[] };\n return data.content[0].text;\n };\n}\n","import { AnyParserMethod } from '../types';\nimport { extractFiles, parseString } from '../util';\nimport { Element, Node } from '@xmldom/xmldom';\n\nexport class OpenOfficeParser implements AnyParserMethod {\n mimes = [\n 'application/vnd.oasis.opendocument.text',\n 'application/vnd.oasis.opendocument.spreadsheet',\n 'application/vnd.oasis.opendocument.presentation',\n 'application/vnd.oasis.opendocument.graphics',\n 'application/vnd.oasis.opendocument.formula',\n ];\n\n apply = async (file: Buffer): Promise<string> => {\n const MAIN_CONTENT_FILE = 'content.xml';\n const OBJECT_CONTENT_REGEX = /Object \\d+\\/content.xml/;\n\n try {\n const files = await extractFiles(\n file,\n (path) => path === MAIN_CONTENT_FILE || OBJECT_CONTENT_REGEX.test(path),\n );\n\n const contentFiles = files\n .filter((file) => file.path === MAIN_CONTENT_FILE || OBJECT_CONTENT_REGEX.test(file.path))\n .sort((a, b) => a.path.localeCompare(b.path));\n\n const notesText: string[] = [];\n const outputChunks: string[] = [];\n\n const ALLOWED_TEXT_TAGS = ['text:p', 'text:h'];\n const NOTES_TAG = 'presentation:notes';\n\n const extractAllTextsFromNode = (root: Element): string => {\n const textArray: string[] = [];\n traverseNode(root, textArray, true);\n return textArray.join('');\n };\n\n const traverseNode = (node: Node, textArray: string[], isFirstRecursion: boolean): void => {\n if (!node.childNodes || node.childNodes.length === 0) {\n if (\n node.parentNode &&\n (node.parentNode as Element).tagName.startsWith('text') &&\n node.nodeValue\n ) {\n const parent = node.parentNode as Element;\n if (isNotesNode(parent)) {\n notesText.push(node.nodeValue);\n if (ALLOWED_TEXT_TAGS.includes(parent.tagName) && !isFirstRecursion) {\n notesText.push('\\n');\n }\n } else {\n textArray.push(node.nodeValue);\n if (ALLOWED_TEXT_TAGS.includes(parent.tagName) && !isFirstRecursion) {\n textArray.push('\\n');\n }\n }\n }\n return;\n }\n\n for (let i = 0; i < node.childNodes.length; i++) {\n traverseNode(node.childNodes[i], textArray, false);\n }\n };\n\n const isNotesNode = (node: Element): boolean => {\n return node.tagName === NOTES_TAG\n ? true\n : node.parentNode\n ? isNotesNode(node.parentNode as Element)\n : false;\n };\n\n const isInvalidTextNode = (node: Element): boolean => {\n return ALLOWED_TEXT_TAGS.includes(node.tagName)\n ? true\n : node.parentNode\n ? isInvalidTextNode(node.parentNode as Element)\n : false;\n };\n\n for (const contentFile of contentFiles) {\n const xmlDoc = parseString(contentFile.content.toString());\n const textNodes = Array.from(xmlDoc.getElementsByTagName('*')).filter(\n (node) =>\n ALLOWED_TEXT_TAGS.includes(node.tagName) &&\n !isInvalidTextNode(node.parentNode as Element),\n );\n\n const textChunk = textNodes\n .map((node) => extractAllTextsFromNode(node))\n .filter((text) => text.trim() !== '')\n .join('\\n');\n\n if (textChunk) {\n outputChunks.push(textChunk);\n }\n }\n\n return [...outputChunks, ...notesText].join('\\n\\n');\n } catch (error) {\n console.error('AnyExtractor: Error parsing OpenOffice file:', error);\n throw error;\n }\n };\n}\n","import pdf from 'pdf-parse';\nimport { AnyParserMethod } from '../types';\n\nexport class PDFParser implements AnyParserMethod {\n mimes = ['application/pdf'];\n\n apply = async (file: Buffer): Promise<string> => {\n try {\n const data = await pdf(file);\n const textContent = data.text;\n return textContent;\n } catch (error) {\n console.error('AnyExtractor: Error parsing PDF file:', error);\n throw error;\n }\n };\n}\n","import { AnyExtractor } from '../extractors/any-extractor';\nimport { AnyParserMethod, ExtractingOptions } from '../types';\nimport { extractFiles, parseString } from '../util';\n\nexport class PowerPointParser implements AnyParserMethod {\n private anyExtractor: AnyExtractor;\n\n constructor(anyExtractor: AnyExtractor) {\n this.anyExtractor = anyExtractor;\n }\n\n mimes = ['application/vnd.openxmlformats-officedocument.presentationml.presentation'];\n\n async apply(file: Buffer, extractingOptions: ExtractingOptions): Promise<string> {\n const fileMatchRegex =\n /ppt\\/(notesSlides|slides)\\/(notesSlide|slide)\\d+\\.xml|ppt\\/media\\/image\\d+\\..+|ppt\\/slides\\/_rels\\/slide\\d+\\.xml.rels/i;\n const slideNumberRegex = /slide(\\d+)\\.xml/;\n const imageRegex = /^ppt\\/media\\/image\\d+\\..+$/i;\n\n try {\n const files = await extractFiles(file, (x) => fileMatchRegex.test(x));\n const imageBuffers: Record<string, Buffer> = {};\n const slideXmls: Record<number, string> = {};\n const relsFiles: Record<number, string> = {};\n\n for (const file of files) {\n if (imageRegex.test(file.path)) {\n imageBuffers[file.path] = file.content;\n } else if (/ppt\\/slides\\/slide\\d+\\.xml/.test(file.path)) {\n const match = file.path.match(slideNumberRegex);\n if (match) slideXmls[+match[1]] = file.content.toString();\n } else if (/ppt\\/slides\\/_rels\\/slide\\d+\\.xml.rels/.test(file.path)) {\n const match = file.path.match(slideNumberRegex);\n if (match) relsFiles[+match[1]] = file.content.toString();\n }\n }\n\n const results: string[] = [];\n\n const sortedSlideNumbers = Object.keys(slideXmls)\n .map(Number)\n .sort((a, b) => a - b);\n\n for (const slideNumber of sortedSlideNumbers) {\n const xmlContent = slideXmls[slideNumber];\n const slideText = this.extractTextFromXml(xmlContent);\n if (slideText) results.push(slideText);\n\n const imagePaths = this.extractImagePathsFromRels(relsFiles[slideNumber]);\n for (const imagePath of imagePaths) {\n const imageFullPath = `ppt/${imagePath.replace(/^(\\.\\.\\/)+/, '')}`;\n const imageBuffer = imageBuffers[imageFullPath];\n if (imageBuffer) {\n const imageDescription = await this.convertImageToText(imageBuffer, extractingOptions);\n if (imageDescription) {\n results.push(`[Image]: ${imageDescription}`);\n }\n }\n }\n }\n\n return results.join('\\n');\n } catch (error) {\n console.error('AnyExtractor: Error parsing PowerPoint file:', error);\n throw error;\n }\n }\n\n private extractTextFromXml(xml: string): string {\n const xmlParagraphNodesList = parseString(xml).getElementsByTagName('a:p');\n\n return Array.from(xmlParagraphNodesList)\n .filter((paragraphNode) => paragraphNode.getElementsByTagName('a:t').length > 0)\n .map((paragraphNode) => {\n const xmlTextNodeList = paragraphNode.getElementsByTagName('a:t');\n return Array.from(xmlTextNodeList)\n .map((textNode) => textNode.childNodes[0]?.nodeValue || '')\n .join('');\n })\n .join('\\n');\n }\n\n private extractImagePathsFromRels(relsXml?: string): string[] {\n if (!relsXml) return [];\n\n const rels = parseString(relsXml).getElementsByTagName('Relationship');\n return Array.from(rels)\n .filter((rel) => rel.getAttribute('Type')?.includes('/image') && rel.getAttribute('Target'))\n .map((rel) => rel.getAttribute('Target')!);\n }\n\n private async convertImageToText(\n imageBuffer: Buffer,\n extractingOptions: ExtractingOptions,\n ): Promise<string> {\n return this.anyExtractor.parseFile(imageBuffer, null, extractingOptions);\n }\n}\n","import { AnyParserMethod } from '../types';\n\nexport class SimpleParser implements AnyParserMethod {\n mimes = ['text/plain', 'application/json'];\n\n apply = async (file: Buffer): Promise<string> => {\n return file.toString('utf-8');\n };\n}\n","import { ERRORMSG } from '../constant';\nimport { AnyExtractor } from '../extractors/any-extractor';\nimport { AnyParserMethod, ExtractingOptions, ExtractedFile } from '../types';\nimport { extractFiles, parseString } from '../util';\n\nexport class WordParser implements AnyParserMethod {\n private anyExtractor: AnyExtractor;\n constructor(anyExtractor: AnyExtractor) {\n this.anyExtractor = anyExtractor;\n }\n\n mimes = ['application/vnd.openxmlformats-officedocument.wordprocessingml.document'];\n\n async apply(file: Buffer, extractingOptions: ExtractingOptions): Promise<string> {\n const mainRegex = /word\\/document[\\d+]?.xml/;\n const footnotesRegex = /word\\/footnotes[\\d+]?.xml/;\n const endnotesRegex = /word\\/endnotes[\\d+]?.xml/;\n const mediaRegex = /^word\\/media\\//;\n const relsRegex = /^word\\/_rels\\/document.xml.rels$/;\n\n try {\n const files = await extractFiles(\n file,\n (filePath) =>\n [mainRegex, footnotesRegex, endnotesRegex, relsRegex].some((r) => r.test(filePath)) ||\n mediaRegex.test(filePath),\n );\n\n const getFile = (regex: RegExp) => files.find((f) => regex.test(f.path));\n\n const mainDoc = getFile(mainRegex);\n const footnotesDoc = getFile(footnotesRegex);\n const endnotesDoc = getFile(endnotesRegex);\n const relsFile = getFile(relsRegex);\n\n if (!mainDoc || !relsFile) {\n throw ERRORMSG.fileCorrupted('Main content or relationships file is missing.');\n }\n\n const mediaFiles: Record<string, ExtractedFile> = {};\n for (const file of files) {\n if (mediaRegex.test(file.path)) {\n const fileName = file.path.split('/').pop()!;\n mediaFiles[fileName] = file;\n }\n }\n\n const embedMap = this.parseRelationships(relsFile.content.toString());\n\n const mainText = await this.extractTextAndImages(\n mainDoc.content.toString(),\n embedMap,\n mediaFiles,\n extractingOptions,\n );\n const footnotesText = footnotesDoc\n ? await this.extractTextAndImages(\n footnotesDoc.content.toString(),\n embedMap,\n mediaFiles,\n extractingOptions,\n )\n : '';\n const endnotesText = endnotesDoc\n ? await this.extractTextAndImages(\n endnotesDoc.content.toString(),\n embedMap,\n mediaFiles,\n extractingOptions,\n )\n : '';\n\n return [\n mainText,\n footnotesText ? '\\n--- Footnotes ---\\n' + footnotesText : '',\n endnotesText ? '\\n--- Endnotes ---\\n' + endnotesText : '',\n ].join('\\n');\n } catch (error) {\n console.error('AnyExtractor: Error parsing Word file:', error);\n throw error;\n }\n }\n\n private parseRelationships(xmlContent: string): Record<string, string> {\n const doc = parseString(xmlContent);\n const rels = doc.getElementsByTagName('Relationship');\n\n const map: Record<string, string> = {};\n for (const rel of Array.from(rels)) {\n const id = rel.getAttribute('Id');\n const target = rel.getAttribute('Target');\n if (id && target?.startsWith('media/')) {\n const filename = target.split('/').pop()!;\n map[id] = filename;\n }\n }\n return map;\n }\n\n private async extractTextAndImages(\n xmlContent: string,\n embedMap: Record<string, string>,\n mediaFiles: Record<string, ExtractedFile>,\n extractingOptions: ExtractingOptions,\n ): Promise<string> {\n const doc = parseString(xmlContent);\n const paragraphs = Array.from(doc.getElementsByTagName('w:p'));\n\n const parts: string[] = [];\n\n for (const paragraph of paragraphs) {\n let paragraphText = '';\n\n // Extract text nodes\n const texts = Array.from(paragraph.getElementsByTagName('w:t'));\n paragraphText += texts.map((t) => t.childNodes[0]?.nodeValue || '').join('');\n\n // Extract drawings/images\n const drawings = Array.from(paragraph.getElementsByTagName('w:drawing'));\n for (const drawing of drawings) {\n const blip = drawing.getElementsByTagName('a:blip')[0];\n const embedId = blip?.getAttribute('r:embed');\n\n if (embedId && embedMap[embedId]) {\n const imageFile = mediaFiles[embedMap[embedId]];\n if (imageFile) {\n const imageBuffer = imageFile.content;\n const imageDescription = await this.convertImageToText(imageBuffer, extractingOptions);\n paragraphText += `\\n[Image: ${imageDescription}]`;\n }\n }\n }\n\n if (paragraphText.trim()) {\n parts.push(paragraphText.trim());\n }\n }\n\n return parts.join('\\n');\n }\n\n private async convertImageToText(\n imageBuffer: Buffer,\n extractingOptions: ExtractingOptions,\n ): Promise<string> {\n return await this.anyExtractor.parseFile(imageBuffer, null, extractingOptions);\n }\n}\n","import { AnyExtractor } from './extractors/any-extractor';\nimport { ExtractorConfig } from './types';\nimport {\n ExcelParser,\n ImageParser,\n OpenOfficeParser,\n PDFParser,\n PowerPointParser,\n SimpleParser,\n WordParser,\n} from './file-parser';\n\n/**\n * Get an extractor with parsers for various file formats.\n *\n * @param {ExtractorConfig} [config] - Optional configuration for the extractor.\n * @returns {AnyExtractor} - The configured AnyExtractor instance.\n */\nexport const getAnyExtractor = (config?: ExtractorConfig): AnyExtractor => {\n const anyExtractor = new AnyExtractor(config);\n\n // List of parsers for handling various file types\n const parsers = [\n new ExcelParser(anyExtractor),\n new ImageParser(),\n new OpenOfficeParser(),\n new PDFParser(),\n new PowerPointParser(anyExtractor),\n new SimpleParser(),\n new WordParser(anyExtractor),\n ];\n\n parsers.forEach((parser) => anyExtractor.addParser(parser));\n\n return anyExtractor;\n};\n\nexport * from './types';\n"],"mappings":"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","names":["fetch","_","file","fetch","parse","file","file","file"]}
|
|
1
|
+
{"version":3,"sources":["../src/extractors/any-extractor.ts","../src/util.ts","../src/constant.ts","../src/crawler/confluence-crawler.ts","../src/file-parser/excel-parser.ts","../src/file-parser/image-parser.ts","../src/file-parser/openoffice-paser.ts","../src/file-parser/pdf-parser.ts","../src/file-parser/powerpoint-parser.ts","../src/file-parser/simple-parser.ts","../src/file-parser/word-parser.ts","../src/index.ts"],"sourcesContent":["import { parse } from 'file-type-mime';\nimport { AnyParserMethod, ConfluenceOptions, ExtractingOptions, ExtractorConfig } from '../types';\nimport { isValidUrl, readFile, readFileUrl } from '../util';\nimport { ConfluenceCrawler } from '../crawler/confluence-crawler';\n\nexport class AnyExtractor {\n private extractorConfig: ExtractorConfig = {\n llm: {\n llmProvider: 'openai',\n visionModel: '',\n apikey: '',\n },\n confluence: {\n baseUrl: '',\n email: '',\n apiKey: '',\n },\n };\n\n constructor(extractorConfig?: ExtractorConfig) {\n if (extractorConfig) {\n this.extractorConfig = extractorConfig;\n }\n }\n\n private mimeParserMap: Map<string, AnyParserMethod> = new Map();\n\n public addParser = (method: AnyParserMethod): this => {\n method.mimes.forEach((mime) => {\n this.mimeParserMap.set(mime, method);\n });\n return this;\n };\n\n public parseFile = async (\n input: string | Buffer,\n basicAuth: string | null = null,\n extractingOptions: ExtractingOptions = {\n extractImages: false,\n imageExtractionMethod: 'ocr',\n language: 'eng',\n },\n ): Promise<string> => {\n let preparedInput: Buffer;\n if (typeof input === 'string') {\n if (isValidUrl(input)) {\n preparedInput = await readFileUrl(input, basicAuth);\n } else {\n preparedInput = await readFile(input);\n }\n } else {\n preparedInput = input;\n }\n if (!preparedInput) {\n throw new Error('AnyExtractor: No input provided');\n }\n\n const mimeDetails = parse(\n preparedInput.buffer.slice(\n preparedInput.byteOffset,\n preparedInput.byteOffset + preparedInput.byteLength,\n ) as ArrayBuffer,\n );\n if (!mimeDetails) {\n return preparedInput.toString('utf-8');\n }\n const extractor = this.mimeParserMap.get(mimeDetails.mime);\n\n if (!extractor?.apply) {\n const message = `AnyExtractor: No extraction method registered for MIME type '${mimeDetails.mime}'`;\n throw new Error(message);\n }\n\n return await extractor.apply(preparedInput, extractingOptions, this.extractorConfig);\n };\n\n public parseConfluenceDoc = async (\n pageId: string,\n extractingOptions: ConfluenceOptions = {\n extractAttachments: false,\n extractImages: false,\n imageExtractionMethod: 'ocr',\n language: 'eng',\n },\n ): Promise<string> => {\n const { baseUrl, email, apiKey } = this.extractorConfig.confluence || {};\n if (!baseUrl || !email || !apiKey) {\n throw new Error('AnyExtractor: Confluence base URL, email, and API key are required');\n }\n const confCrawler = new ConfluenceCrawler(baseUrl, email, apiKey);\n const content = await confCrawler.extractPageContent(pageId);\n let textContent = '';\n for (const item of content) {\n if (item.type === 'image' && extractingOptions.extractImages) {\n const parsedFile = await this.parseFile(\n item.content,\n `Basic ${Buffer.from(`${email}:${apiKey}`).toString('base64')}`,\n extractingOptions,\n );\n textContent += parsedFile ? `\\n(Image): ${parsedFile}\\n` : '';\n } else if (item.type === 'view-file' && extractingOptions.extractAttachments) {\n const parsedFile = await this.parseFile(\n item.content,\n `Basic ${Buffer.from(`${email}:${apiKey}`).toString('base64')}`,\n extractingOptions,\n );\n textContent += parsedFile ? `\\n[Attachment]: ${parsedFile}\\n` : '';\n } else if (\n [\n 'h1',\n 'h2',\n 'h3',\n 'h4',\n 'h5',\n 'h6',\n 'p',\n 'table',\n 'li',\n 'code',\n 'info',\n 'warning',\n 'tip',\n 'note',\n 'panel',\n 'expand',\n 'adf-extension',\n ].includes(item.type)\n ) {\n textContent += `\\n${item.content}\\n`;\n } else if (item.type === 'text') {\n textContent += ` ${item.content}`;\n }\n }\n return textContent;\n };\n}\n","import { fetch } from 'undici';\nimport yauzl from 'yauzl';\nimport { ERRORMSG } from './constant';\nimport { ExtractedFile } from './types';\nimport concat from 'concat-stream';\nimport { DOMParser } from '@xmldom/xmldom';\nimport { promises as fs } from 'fs';\n\nexport async function readFile(filePath: string): Promise<Buffer> {\n return await fs.readFile(filePath);\n}\n\nexport const readFileUrl = async (url: string, basicAuth?: string | null): Promise<Buffer> => {\n const res = await fetch(url, {\n headers: {\n ...(basicAuth ? { Authorization: basicAuth } : {}),\n },\n });\n if (!res.ok) throw new Error(`Failed to fetch: ${res.statusText}`);\n return Buffer.from(await res.arrayBuffer());\n};\n\nexport const extractFiles = (\n zipInput: Buffer | string,\n filterFn: (x: string) => boolean,\n): Promise<ExtractedFile[]> => {\n return new Promise((res, rej) => {\n const processZipfile = (zipfile: yauzl.ZipFile) => {\n const extractedFiles: ExtractedFile[] = [];\n zipfile.readEntry();\n\n function processEntry(entry: yauzl.Entry) {\n if (filterFn(entry.fileName)) {\n zipfile.openReadStream(entry, (err, readStream) => {\n if (err) return rej(err);\n\n readStream.pipe(\n concat((data: Buffer) => {\n extractedFiles.push({\n path: entry.fileName,\n content: data,\n });\n zipfile.readEntry();\n }),\n );\n });\n } else zipfile.readEntry();\n }\n\n zipfile.on('entry', processEntry);\n zipfile.on('end', () => res(extractedFiles));\n zipfile.on('error', rej);\n };\n\n if (Buffer.isBuffer(zipInput)) {\n yauzl.fromBuffer(zipInput, { lazyEntries: true }, (err, zipfile) => {\n if (err) return rej(err);\n processZipfile(zipfile);\n });\n } else if (typeof zipInput === 'string') {\n yauzl.open(zipInput, { lazyEntries: true }, (err, zipfile) => {\n if (err) return rej(err);\n processZipfile(zipfile);\n });\n } else rej(ERRORMSG.invalidInput);\n });\n};\n\nexport const parseString = (xml: string) => {\n const parser = new DOMParser();\n return parser.parseFromString(xml, 'text/xml');\n};\n\nexport function isValidUrl(str: string | undefined | null): boolean {\n try {\n if (!str) return false;\n new URL(str);\n return true;\n } catch {\n return false;\n }\n}\n","/** Header for error messages */\nexport const ERRORHEADER = '[AnyExtractor]: ';\n\n/** Error messages */\nexport const ERRORMSG = {\n extensionUnsupported: (ext: string) =>\n `Sorry, AnyExtractor currently support docx, pptx, xlsx, odt, odp, ods, pdf files only. Create a ticket in Issues on github to add support for ${ext} files. Stay tuned for further updates.`,\n fileCorrupted: (filepath: string) =>\n `Your file ${filepath} seems to be corrupted. If you are sure it is fine, please create a ticket in Issues on github with the file to reproduce error.`,\n fileDoesNotExist: (filepath: string) =>\n `File ${filepath} could not be found! Check if the file exists or verify if the relative path to the file is correct from your terminal's location.`,\n locationNotFound: (location: string) =>\n `Entered location ${location} is not reachable! Please make sure that the entered directory location exists. Check relative paths and reenter.`,\n improperArguments: `Improper arguments`,\n improperBuffers: `Error occured while reading the file buffers`,\n invalidInput: `Invalid input type: Expected a Buffer or a valid file path`,\n};\n","import { fetch } from 'undici';\nimport { ExtractedXmlItem } from '../types';\nimport * as cheerio from 'cheerio';\nimport { Element, Text } from 'domhandler';\n\nexport class ConfluenceCrawler {\n private baseUrl: string;\n private email: string;\n private apiKey: string;\n private apiEndpoint: string;\n\n constructor(baseUrl: string, email: string, apiKey: string) {\n this.baseUrl = baseUrl.replace(/\\/+$/, '');\n this.email = email;\n this.apiKey = apiKey;\n\n this.apiEndpoint = this.baseUrl.includes('atlassian.net')\n ? `${this.baseUrl}/wiki/rest/api`\n : `${this.baseUrl}/rest/api`;\n }\n\n public async extractPageContent(pageId: string): Promise<ExtractedXmlItem[]> {\n const xmlContent = await this.fetchPageContent(pageId);\n return this.extractOrderedContentFromXml(xmlContent, pageId);\n }\n\n private async fetchPageContent(pageId: string): Promise<string> {\n const url = `${this.apiEndpoint}/content/${pageId}?expand=body.storage`;\n\n const response = await fetch(url, {\n headers: {\n Authorization: `Basic ${Buffer.from(`${this.email}:${this.apiKey}`).toString('base64')}`,\n 'Content-Type': 'application/json',\n },\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(\n `Request failed: ${response.status} ${response.statusText}. Response body: ${errorText}`,\n );\n }\n\n const data = (await response.json()) as { body: { [key: string]: { value: string } } };\n return data.body.storage.value;\n }\n\n private extractOrderedContentFromXml(xml: string, pageId: string): ExtractedXmlItem[] {\n let $ = cheerio.load(xml, { xmlMode: true });\n let node = $('ac\\\\:layout').first();\n if (node.length === 0) {\n const newXml = `<ac:layout>${xml}</ac:layout>`;\n $ = cheerio.load(newXml, { xmlMode: true });\n node = $('ac\\\\:layout').first();\n }\n const orderedContent = this.parseNodeContents(node, $, pageId);\n return orderedContent;\n }\n\n private parseNodeContents(\n node: cheerio.Cheerio<Element>,\n $: cheerio.CheerioAPI,\n pageId: string,\n ignoreTags: string[] = [],\n ): ExtractedXmlItem[] {\n let result: ExtractedXmlItem[] = [];\n const contents = node.contents();\n contents.each((_, ele) => {\n switch (ele.type) {\n case 'text':\n result.push(this.parseTextNode(ele));\n break;\n case 'tag':\n const tagResult = this.parseTagNode(ele, $, pageId, ignoreTags);\n result = result.concat(tagResult);\n break;\n default:\n break;\n }\n });\n return result;\n }\n\n private parseTextNode(ele: Text): ExtractedXmlItem {\n const text = ele.data.trim();\n return { type: 'text', content: text };\n }\n\n private parseTagNode(\n ele: Element,\n $: cheerio.CheerioAPI,\n pageId: string,\n ignoreTags: string[],\n ): ExtractedXmlItem[] {\n let result: ExtractedXmlItem[] = [];\n const tagName = ele.tagName;\n if (ignoreTags.includes(tagName)) {\n return result;\n }\n switch (tagName) {\n case 'ac:structured-macro':\n result = result.concat(this.parseStructuredMacro(ele, $, pageId));\n break;\n case 'ac:adf-extension':\n result = result.concat(this.parseAdfExtension(ele, $));\n break;\n case 'ac:task-list':\n result = result.concat(this.parseTaskList(ele, $, pageId));\n break;\n case 'ac:image':\n result = result.concat(this.parseImage(ele, $, pageId));\n break;\n case 'table':\n result = result.concat(this.parseTable(ele, $));\n break;\n case 'a':\n result = result.concat(this.parseLink(ele, $, pageId));\n break;\n default:\n result = result.concat(this.parseNodeContents($(ele), $, pageId));\n break;\n }\n return result;\n }\n\n private parseStructuredMacro(\n ele: Element,\n $: cheerio.CheerioAPI,\n pageId: string,\n ): ExtractedXmlItem[] {\n const macroName = ele.attribs['ac:name'];\n const result: ExtractedXmlItem[] = [];\n switch (macroName) {\n case 'code':\n result.push(this.parseCodeMacro(ele, $));\n break;\n case 'info':\n result.push(this.parseInfoMacro(ele, $, pageId));\n break;\n case 'warning':\n result.push(this.parseWarningMacro(ele, $, pageId));\n break;\n case 'note':\n result.push(this.parseNoteMacro(ele, $, pageId));\n break;\n case 'tip':\n result.push(this.parseTipMacro(ele, $, pageId));\n break;\n case 'panel':\n result.push(this.parsePanelMacro(ele, $, pageId));\n break;\n case 'expand':\n result.push(this.parseExpandMacro(ele, $, pageId));\n break;\n case 'status':\n result.push(this.parseStatusMacro(ele, $, pageId));\n break;\n case 'view-file':\n result.push(this.parseViewFileMacro(ele, $, pageId));\n break;\n }\n return result;\n }\n\n private parseLink(ele: Element, $: cheerio.CheerioAPI, pageId: string): ExtractedXmlItem[] {\n const href = $(ele).attr('href');\n const text = this.parseNodeContents($(ele), $, pageId);\n return [{ type: 'link', content: `${text.map((t) => t.content).join('')} (${href})` }];\n }\n\n private parseTaskList(ele: Element, $: cheerio.CheerioAPI, pageId: string): ExtractedXmlItem[] {\n const result: ExtractedXmlItem[] = [];\n const tasks = $(ele).find('ac\\\\:task');\n tasks.each((_, task) => {\n const taskStatus = $(task).find('ac\\\\:task-status').text().trim();\n const taskBody = this.parseNodeContents($(task).find('ac\\\\:task-body'), $, pageId);\n result.push({\n type: 'task',\n content: `${taskBody.map((t) => t.content).join('')} [Status: ${taskStatus}]`,\n });\n });\n return result;\n }\n\n private parseImage(ele: Element, $: cheerio.CheerioAPI, pageId: string): ExtractedXmlItem[] {\n const attachment = $(ele).find('ri\\\\:attachment');\n const filename = attachment.attr('ri:filename')?.trim();\n if (!filename) {\n return [];\n }\n\n const imageUrl = this.baseUrl.includes('atlassian.net')\n ? `${this.baseUrl}/wiki/download/attachments/${pageId}/${encodeURIComponent(filename)}`\n : `${this.baseUrl}/download/attachments/${pageId}/${encodeURIComponent(filename)}`;\n\n return [{ type: 'image', content: imageUrl }];\n }\n\n private parseTable(ele: Element, $: cheerio.CheerioAPI): ExtractedXmlItem[] {\n const result: ExtractedXmlItem[] = [];\n const rows = $(ele).find('tr');\n const tableData: string[] = [];\n rows.each((_, row) => {\n const cells = $(row).find('th, td');\n const rowData: string[] = [];\n cells.each((_, cell) => {\n rowData.push($(cell).text().trim());\n });\n tableData.push(rowData.join(' | '));\n });\n result.push({ type: 'table', content: tableData.join('\\n') });\n return result;\n }\n\n private parseCodeMacro(ele: Element, $: cheerio.CheerioAPI): ExtractedXmlItem {\n const code = $(ele).find('ac\\\\:plain-text-body').text().trim();\n return { type: 'code', content: code };\n }\n\n private parseInfoMacro(ele: Element, $: cheerio.CheerioAPI, pageId: string): ExtractedXmlItem {\n const info = this.parseNodeContents($(ele), $, pageId);\n return { type: 'info', content: info.map((t) => t.content).join('') };\n }\n\n private parseWarningMacro(ele: Element, $: cheerio.CheerioAPI, pageId: string): ExtractedXmlItem {\n const warning = this.parseNodeContents($(ele), $, pageId);\n return { type: 'warning', content: warning.map((t) => t.content).join('') };\n }\n\n private parseNoteMacro(ele: Element, $: cheerio.CheerioAPI, pageId: string): ExtractedXmlItem {\n const note = this.parseNodeContents($(ele), $, pageId);\n return { type: 'note', content: note.map((t) => t.content).join('') };\n }\n\n private parseTipMacro(ele: Element, $: cheerio.CheerioAPI, pageId: string): ExtractedXmlItem {\n const tip = this.parseNodeContents($(ele), $, pageId);\n return { type: 'tip', content: tip.map((t) => t.content).join('') };\n }\n\n private parsePanelMacro(ele: Element, $: cheerio.CheerioAPI, pageId: string): ExtractedXmlItem {\n const panel = this.parseNodeContents($(ele), $, pageId, ['ac:parameter']);\n return { type: 'panel', content: panel.map((t) => t.content).join('') };\n }\n\n private parseExpandMacro(ele: Element, $: cheerio.CheerioAPI, pageId: string): ExtractedXmlItem {\n const expand = this.parseNodeContents($(ele), $, pageId);\n return { type: 'expand', content: expand.map((t) => t.content).join('') };\n }\n\n private parseStatusMacro(ele: Element, $: cheerio.CheerioAPI, pageId: string): ExtractedXmlItem {\n const status = this.parseNodeContents($(ele), $, pageId);\n return { type: 'status', content: status.map((t) => t.content).join('') };\n }\n\n private parseAdfExtension(ele: Element, $: cheerio.CheerioAPI): ExtractedXmlItem[] {\n const adfNode = $(ele).find('ac\\\\:adf-node');\n const content = adfNode.find('ac\\\\:adf-content').text().trim();\n return [{ type: 'adf-extension', content }];\n }\n\n private parseViewFileMacro(\n ele: Element,\n $: cheerio.CheerioAPI,\n pageId: string,\n ): ExtractedXmlItem {\n const attachment = $(ele).find('ac\\\\:parameter[ac\\\\:name=\"name\"] ri\\\\:attachment');\n const filename = attachment.attr('ri:filename')?.trim();\n\n if (!filename) {\n return { type: 'view-file', content: '' };\n }\n\n const fileUrl = this.baseUrl.includes('atlassian.net')\n ? `${this.baseUrl}/wiki/download/attachments/${pageId}/${encodeURIComponent(filename)}`\n : `${this.baseUrl}/download/attachments/${pageId}/${encodeURIComponent(filename)}`;\n\n return { type: 'view-file', content: fileUrl };\n }\n}\n","import { Element } from '@xmldom/xmldom';\nimport { ERRORMSG } from '../constant';\nimport { AnyParserMethod, ExtractingOptions } from '../types';\nimport { extractFiles, parseString } from '../util';\nimport { AnyExtractor } from '../extractors/any-extractor';\n\nexport class ExcelParser implements AnyParserMethod {\n mimes = ['application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'];\n\n private anyExtractor: AnyExtractor;\n constructor(anyExtractor: AnyExtractor) {\n this.anyExtractor = anyExtractor;\n }\n\n async apply(file: Buffer, extractingOptions: ExtractingOptions): Promise<string> {\n const patterns = {\n sheets: /xl\\/worksheets\\/sheet\\d+.xml/g,\n drawings: /xl\\/drawings\\/drawing\\d+.xml/g,\n charts: /xl\\/charts\\/chart\\d+.xml/g,\n sharedStrings: 'xl/sharedStrings.xml',\n images: /xl\\/media\\/image\\d+\\.(png|jpeg|jpg|webp)/g,\n };\n\n try {\n const files = await extractFiles(\n file,\n (path) =>\n [patterns.sheets, patterns.drawings, patterns.charts, patterns.images].some((regex) =>\n regex.test(path),\n ) || path === patterns.sharedStrings,\n );\n\n if (files.length === 0 || !files.some((file) => patterns.sheets.test(file.path))) {\n throw ERRORMSG.fileCorrupted('Missing or corrupted sheet files.');\n }\n\n const xmlContent = {\n sheets: files\n .filter((file) => patterns.sheets.test(file.path))\n .map((file) => file.content.toString()),\n drawings: files\n .filter((file) => patterns.drawings.test(file.path))\n .map((file) => file.content.toString()),\n charts: files\n .filter((file) => patterns.charts.test(file.path))\n .map((file) => file.content.toString()),\n sharedStrings: files\n .find((file) => file.path === patterns.sharedStrings)\n ?.content.toString(),\n images: files.filter((file) => patterns.images.test(file.path)),\n };\n\n const sharedStrings = this.parseSharedStrings(xmlContent.sharedStrings);\n\n const orderedText = files\n .map(async (file) => {\n if (patterns.sheets.test(file.path)) {\n return this.extractSheetText([file.content.toString()], sharedStrings);\n } else if (patterns.drawings.test(file.path)) {\n return this.extractDrawingText([file.content.toString()]);\n } else if (patterns.charts.test(file.path)) {\n return this.extractChartText([file.content.toString()]);\n } else if (patterns.images.test(file.path)) {\n return await this.extractImageText([file], extractingOptions);\n }\n return null;\n })\n .filter(Boolean);\n\n const resolvedText = await Promise.all(orderedText);\n return resolvedText.filter(Boolean).join('\\n');\n } catch (error) {\n console.error('AnyExtractor: Error parsing Excel file:', error);\n throw error;\n }\n }\n\n private parseSharedStrings(sharedStringsXml?: string): string[] {\n if (!sharedStringsXml) return [];\n const tNodes = parseString(sharedStringsXml).getElementsByTagName('t');\n return Array.from(tNodes).map((node) => node.childNodes[0]?.nodeValue ?? '');\n }\n\n private extractSheetText(sheetFiles: string[], sharedStrings: string[]): string {\n return sheetFiles\n .map((content) => {\n const cNodes = parseString(content).getElementsByTagName('c');\n return Array.from(cNodes)\n .filter((node) => this.isValidInlineString(node) || this.hasValidValueNode(node))\n .map((node) => this.getCellValue(node, sharedStrings))\n .join('\\n');\n })\n .join('\\n');\n }\n\n private extractDrawingText(drawingFiles: string[]): string {\n return drawingFiles\n .map((content) => {\n const pNodes = parseString(content).getElementsByTagName('a:p');\n return Array.from(pNodes)\n .map((node) => {\n const tNodes = node.getElementsByTagName('a:t');\n return Array.from(tNodes)\n .map((tNode) => tNode.childNodes[0]?.nodeValue ?? '')\n .join('');\n })\n .join('\\n');\n })\n .join('\\n');\n }\n\n private extractChartText(chartFiles: string[]): string {\n return chartFiles\n .map((content) => {\n const vNodes = parseString(content).getElementsByTagName('c:v');\n return Array.from(vNodes)\n .map((node) => node.childNodes[0]?.nodeValue ?? '')\n .join('\\n');\n })\n .join('\\n');\n }\n\n private async extractImageText(\n imageFiles: { path: string; content: Buffer }[],\n extractingOptions: ExtractingOptions,\n ): Promise<string> {\n const texts = await Promise.all(\n imageFiles.map(async (file) => {\n try {\n return await this.anyExtractor.parseFile(file.content, null, extractingOptions);\n } catch (e) {\n console.log(`AnyExtractor: Error extracting text from image ${file.path}:`, e);\n return '';\n }\n }),\n );\n return texts.filter(Boolean).join('\\n');\n }\n\n private isValidInlineString(cNode: Element): boolean {\n if (cNode.tagName.toLowerCase() !== 'c' || cNode.getAttribute('t') !== 'inlineStr')\n return false;\n const isNodes = cNode.getElementsByTagName('is');\n const tNodes = isNodes[0]?.getElementsByTagName('t');\n return tNodes?.[0]?.childNodes[0]?.nodeValue !== undefined;\n }\n\n private hasValidValueNode(cNode: Element): boolean {\n const vNodes = cNode.getElementsByTagName('v');\n return vNodes[0]?.childNodes[0]?.nodeValue !== undefined;\n }\n\n private getCellValue(cNode: Element, sharedStrings: string[]): string {\n if (this.isValidInlineString(cNode)) {\n return (\n cNode.getElementsByTagName('is')[0].getElementsByTagName('t')[0].childNodes[0].nodeValue ??\n ''\n );\n }\n\n if (this.hasValidValueNode(cNode)) {\n const isSharedString = cNode.getAttribute('t') === 's';\n const valueIndex = parseInt(\n cNode.getElementsByTagName('v')[0].childNodes[0].nodeValue ?? '',\n 10,\n );\n\n if (isSharedString) {\n if (valueIndex >= sharedStrings.length) {\n throw ERRORMSG.fileCorrupted('AnyExtractor: Invalid shared string index.');\n }\n return sharedStrings[valueIndex];\n }\n\n return valueIndex.toString();\n }\n\n return '';\n }\n}\n","import Tesseract from 'tesseract.js';\nimport { AnyParserMethod, ExtractingOptions, ExtractorConfig } from '../types';\nimport { fetch } from 'undici';\nimport { parse } from 'file-type-mime';\n\nexport class ImageParser implements AnyParserMethod {\n mimes = ['image/jpeg', 'image/png', 'image/webp'];\n\n public apply = async (\n file: Buffer,\n extractingOptions: ExtractingOptions,\n extractorConfig: ExtractorConfig,\n ): Promise<string> => {\n const { extractImages, imageExtractionMethod, language } = extractingOptions;\n if (!extractImages) {\n return '';\n }\n const mimeDetails = parse(\n file.buffer.slice(file.byteOffset, file.byteOffset + file.byteLength) as ArrayBuffer,\n );\n if (!mimeDetails) {\n throw new Error('AnyExtractor: Unable to parse MIME type');\n }\n const mimeType = mimeDetails.mime;\n if (!this.mimes.includes(mimeType)) {\n return '';\n }\n if (imageExtractionMethod === 'ocr') {\n return await this.performOCR(file, language);\n }\n\n const { llmProvider, visionModel, apikey } = extractorConfig.llm || {};\n if (!llmProvider || !visionModel || !apikey) {\n throw new Error(\n 'AnyExtractor: LLM provider, vision model and API key are required for image extraction',\n );\n }\n\n const base64Image = file.toString('base64');\n switch (llmProvider) {\n case 'openai':\n return this.handleOpenAI(base64Image, mimeType, visionModel, apikey);\n case 'google':\n return this.handleGoogle(base64Image, mimeType, visionModel, apikey);\n case 'anthropic':\n return this.handleAnthropic(base64Image, mimeType, visionModel, apikey);\n default:\n throw new Error(`ImageParser: Unsupported LLM provider '${llmProvider}'`);\n }\n };\n\n private performOCR = async (file: Buffer, language: string): Promise<string> => {\n const worker = await Tesseract.createWorker(language);\n const {\n data: { text },\n } = await worker.recognize(file);\n await worker.terminate();\n return text;\n };\n\n private handleOpenAI = async (\n base64Image: string,\n mimeType: string,\n visionModel: string,\n apikey: string,\n ): Promise<string> => {\n const response = await fetch('https://api.openai.com/v1/chat/completions', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${apikey}`,\n },\n body: JSON.stringify({\n model: visionModel,\n messages: [\n {\n role: 'user',\n content: [\n {\n type: 'text',\n text: 'Provide a concise summary of the image for semantic search. Exclude any introductions, labels, or formatting — just return the core content. Also include visible text and contextual details about layout, content type, or purpose.',\n },\n {\n type: 'image_url',\n image_url: {\n url: `data:${mimeType};base64,${base64Image}`,\n },\n },\n ],\n },\n ],\n }),\n });\n\n if (!response.ok) {\n throw new Error(`ImageParser: OpenAI API error ${response.status}`);\n }\n\n const data = (await response.json()) as {\n choices: { message: { content: string } }[];\n };\n return data.choices[0].message.content;\n };\n\n private handleGoogle = async (\n base64Image: string,\n mimeType: string,\n visionModel: string,\n apikey: string,\n ): Promise<string> => {\n const response = await fetch(\n `https://generativelanguage.googleapis.com/v1beta/models/${visionModel}:generateContent?key=${apikey}`,\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n contents: [\n {\n parts: [\n {\n text: 'Provide a concise summary of the image for semantic search. Exclude any introductions, labels, or formatting — just return the core content. Also include visible text and contextual details about layout, content type, or purpose.',\n },\n {\n inlineData: {\n mimeType: mimeType,\n data: base64Image,\n },\n },\n ],\n },\n ],\n }),\n },\n );\n\n if (!response.ok) {\n throw new Error(`Google Gemini error: ${response.statusText}`);\n }\n\n const data = (await response.json()) as {\n candidates: { content: { parts: { text: string }[] } }[];\n };\n return data.candidates[0].content.parts[0].text;\n };\n\n private handleAnthropic = async (\n base64Image: string,\n mimeType: string,\n visionModel: string,\n apikey: string,\n ): Promise<string> => {\n const response = await fetch('https://api.anthropic.com/v1/messages', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': apikey,\n 'anthropic-version': '2023-06-01',\n },\n body: JSON.stringify({\n model: visionModel,\n max_tokens: 300,\n messages: [\n {\n role: 'user',\n content: [\n {\n type: 'text',\n text: 'Provide a concise summary of the image for semantic search. Exclude any introductions, labels, or formatting — just return the core content. Also include visible text and contextual details about layout, content type, or purpose.',\n },\n {\n type: 'image',\n source: {\n type: 'base64',\n media_type: mimeType,\n data: base64Image,\n },\n },\n ],\n },\n ],\n }),\n });\n\n if (!response.ok) {\n throw new Error(`Anthropic Claude error: ${response.statusText}`);\n }\n\n const data = (await response.json()) as { content: { text: string }[] };\n return data.content[0].text;\n };\n}\n","import { AnyParserMethod } from '../types';\nimport { extractFiles, parseString } from '../util';\nimport { Element, Node } from '@xmldom/xmldom';\n\nexport class OpenOfficeParser implements AnyParserMethod {\n mimes = [\n 'application/vnd.oasis.opendocument.text',\n 'application/vnd.oasis.opendocument.spreadsheet',\n 'application/vnd.oasis.opendocument.presentation',\n 'application/vnd.oasis.opendocument.graphics',\n 'application/vnd.oasis.opendocument.formula',\n ];\n\n apply = async (file: Buffer): Promise<string> => {\n const MAIN_CONTENT_FILE = 'content.xml';\n const OBJECT_CONTENT_REGEX = /Object \\d+\\/content.xml/;\n\n try {\n const files = await extractFiles(\n file,\n (path) => path === MAIN_CONTENT_FILE || OBJECT_CONTENT_REGEX.test(path),\n );\n\n const contentFiles = files\n .filter((file) => file.path === MAIN_CONTENT_FILE || OBJECT_CONTENT_REGEX.test(file.path))\n .sort((a, b) => a.path.localeCompare(b.path));\n\n const notesText: string[] = [];\n const outputChunks: string[] = [];\n\n const ALLOWED_TEXT_TAGS = ['text:p', 'text:h'];\n const NOTES_TAG = 'presentation:notes';\n\n const extractAllTextsFromNode = (root: Element): string => {\n const textArray: string[] = [];\n traverseNode(root, textArray, true);\n return textArray.join('');\n };\n\n const traverseNode = (node: Node, textArray: string[], isFirstRecursion: boolean): void => {\n if (!node.childNodes || node.childNodes.length === 0) {\n if (\n node.parentNode &&\n (node.parentNode as Element).tagName.startsWith('text') &&\n node.nodeValue\n ) {\n const parent = node.parentNode as Element;\n if (isNotesNode(parent)) {\n notesText.push(node.nodeValue);\n if (ALLOWED_TEXT_TAGS.includes(parent.tagName) && !isFirstRecursion) {\n notesText.push('\\n');\n }\n } else {\n textArray.push(node.nodeValue);\n if (ALLOWED_TEXT_TAGS.includes(parent.tagName) && !isFirstRecursion) {\n textArray.push('\\n');\n }\n }\n }\n return;\n }\n\n for (let i = 0; i < node.childNodes.length; i++) {\n traverseNode(node.childNodes[i], textArray, false);\n }\n };\n\n const isNotesNode = (node: Element): boolean => {\n return node.tagName === NOTES_TAG\n ? true\n : node.parentNode\n ? isNotesNode(node.parentNode as Element)\n : false;\n };\n\n const isInvalidTextNode = (node: Element): boolean => {\n return ALLOWED_TEXT_TAGS.includes(node.tagName)\n ? true\n : node.parentNode\n ? isInvalidTextNode(node.parentNode as Element)\n : false;\n };\n\n for (const contentFile of contentFiles) {\n const xmlDoc = parseString(contentFile.content.toString());\n const textNodes = Array.from(xmlDoc.getElementsByTagName('*')).filter(\n (node) =>\n ALLOWED_TEXT_TAGS.includes(node.tagName) &&\n !isInvalidTextNode(node.parentNode as Element),\n );\n\n const textChunk = textNodes\n .map((node) => extractAllTextsFromNode(node))\n .filter((text) => text.trim() !== '')\n .join('\\n');\n\n if (textChunk) {\n outputChunks.push(textChunk);\n }\n }\n\n return [...outputChunks, ...notesText].join('\\n\\n');\n } catch (error) {\n console.error('AnyExtractor: Error parsing OpenOffice file:', error);\n throw error;\n }\n };\n}\n","import pdf from 'pdf-parse';\nimport { AnyParserMethod } from '../types';\n\nexport class PDFParser implements AnyParserMethod {\n mimes = ['application/pdf'];\n\n apply = async (file: Buffer): Promise<string> => {\n try {\n const data = await pdf(file);\n const textContent = data.text;\n return textContent;\n } catch (error) {\n console.error('AnyExtractor: Error parsing PDF file:', error);\n throw error;\n }\n };\n}\n","import { AnyExtractor } from '../extractors/any-extractor';\nimport { AnyParserMethod, ExtractingOptions } from '../types';\nimport { extractFiles, parseString } from '../util';\n\nexport class PowerPointParser implements AnyParserMethod {\n private anyExtractor: AnyExtractor;\n\n constructor(anyExtractor: AnyExtractor) {\n this.anyExtractor = anyExtractor;\n }\n\n mimes = ['application/vnd.openxmlformats-officedocument.presentationml.presentation'];\n\n async apply(file: Buffer, extractingOptions: ExtractingOptions): Promise<string> {\n const fileMatchRegex =\n /ppt\\/(notesSlides|slides)\\/(notesSlide|slide)\\d+\\.xml|ppt\\/media\\/image\\d+\\..+|ppt\\/slides\\/_rels\\/slide\\d+\\.xml.rels/i;\n const slideNumberRegex = /slide(\\d+)\\.xml/;\n const imageRegex = /^ppt\\/media\\/image\\d+\\..+$/i;\n\n try {\n const files = await extractFiles(file, (x) => fileMatchRegex.test(x));\n const imageBuffers: Record<string, Buffer> = {};\n const slideXmls: Record<number, string> = {};\n const relsFiles: Record<number, string> = {};\n\n for (const file of files) {\n if (imageRegex.test(file.path)) {\n imageBuffers[file.path] = file.content;\n } else if (/ppt\\/slides\\/slide\\d+\\.xml/.test(file.path)) {\n const match = file.path.match(slideNumberRegex);\n if (match) slideXmls[+match[1]] = file.content.toString();\n } else if (/ppt\\/slides\\/_rels\\/slide\\d+\\.xml.rels/.test(file.path)) {\n const match = file.path.match(slideNumberRegex);\n if (match) relsFiles[+match[1]] = file.content.toString();\n }\n }\n\n const results: string[] = [];\n\n const sortedSlideNumbers = Object.keys(slideXmls)\n .map(Number)\n .sort((a, b) => a - b);\n\n for (const slideNumber of sortedSlideNumbers) {\n const xmlContent = slideXmls[slideNumber];\n const slideText = this.extractTextFromXml(xmlContent);\n if (slideText) results.push(slideText);\n\n const imagePaths = this.extractImagePathsFromRels(relsFiles[slideNumber]);\n for (const imagePath of imagePaths) {\n const imageFullPath = `ppt/${imagePath.replace(/^(\\.\\.\\/)+/, '')}`;\n const imageBuffer = imageBuffers[imageFullPath];\n if (imageBuffer) {\n const imageDescription = await this.convertImageToText(imageBuffer, extractingOptions);\n if (imageDescription) {\n results.push(`[Image]: ${imageDescription}`);\n }\n }\n }\n }\n\n return results.join('\\n');\n } catch (error) {\n console.error('AnyExtractor: Error parsing PowerPoint file:', error);\n throw error;\n }\n }\n\n private extractTextFromXml(xml: string): string {\n const xmlParagraphNodesList = parseString(xml).getElementsByTagName('a:p');\n\n return Array.from(xmlParagraphNodesList)\n .filter((paragraphNode) => paragraphNode.getElementsByTagName('a:t').length > 0)\n .map((paragraphNode) => {\n const xmlTextNodeList = paragraphNode.getElementsByTagName('a:t');\n return Array.from(xmlTextNodeList)\n .map((textNode) => textNode.childNodes[0]?.nodeValue || '')\n .join('');\n })\n .join('\\n');\n }\n\n private extractImagePathsFromRels(relsXml?: string): string[] {\n if (!relsXml) return [];\n\n const rels = parseString(relsXml).getElementsByTagName('Relationship');\n return Array.from(rels)\n .filter((rel) => rel.getAttribute('Type')?.includes('/image') && rel.getAttribute('Target'))\n .map((rel) => rel.getAttribute('Target')!);\n }\n\n private async convertImageToText(\n imageBuffer: Buffer,\n extractingOptions: ExtractingOptions,\n ): Promise<string> {\n return this.anyExtractor.parseFile(imageBuffer, null, extractingOptions);\n }\n}\n","import { AnyParserMethod } from '../types';\n\nexport class SimpleParser implements AnyParserMethod {\n mimes = ['text/plain', 'application/json'];\n\n apply = async (file: Buffer): Promise<string> => {\n return file.toString('utf-8');\n };\n}\n","import { ERRORMSG } from '../constant';\nimport { AnyExtractor } from '../extractors/any-extractor';\nimport { AnyParserMethod, ExtractingOptions, ExtractedFile } from '../types';\nimport { extractFiles, parseString } from '../util';\n\nexport class WordParser implements AnyParserMethod {\n private anyExtractor: AnyExtractor;\n constructor(anyExtractor: AnyExtractor) {\n this.anyExtractor = anyExtractor;\n }\n\n mimes = ['application/vnd.openxmlformats-officedocument.wordprocessingml.document'];\n\n async apply(file: Buffer, extractingOptions: ExtractingOptions): Promise<string> {\n const mainRegex = /word\\/document[\\d+]?.xml/;\n const footnotesRegex = /word\\/footnotes[\\d+]?.xml/;\n const endnotesRegex = /word\\/endnotes[\\d+]?.xml/;\n const mediaRegex = /^word\\/media\\//;\n const relsRegex = /^word\\/_rels\\/document.xml.rels$/;\n\n try {\n const files = await extractFiles(\n file,\n (filePath) =>\n [mainRegex, footnotesRegex, endnotesRegex, relsRegex].some((r) => r.test(filePath)) ||\n mediaRegex.test(filePath),\n );\n\n const getFile = (regex: RegExp) => files.find((f) => regex.test(f.path));\n\n const mainDoc = getFile(mainRegex);\n const footnotesDoc = getFile(footnotesRegex);\n const endnotesDoc = getFile(endnotesRegex);\n const relsFile = getFile(relsRegex);\n\n if (!mainDoc || !relsFile) {\n throw ERRORMSG.fileCorrupted('Main content or relationships file is missing.');\n }\n\n const mediaFiles: Record<string, ExtractedFile> = {};\n for (const file of files) {\n if (mediaRegex.test(file.path)) {\n const fileName = file.path.split('/').pop()!;\n mediaFiles[fileName] = file;\n }\n }\n\n const embedMap = this.parseRelationships(relsFile.content.toString());\n\n const mainText = await this.extractTextAndImages(\n mainDoc.content.toString(),\n embedMap,\n mediaFiles,\n extractingOptions,\n );\n const footnotesText = footnotesDoc\n ? await this.extractTextAndImages(\n footnotesDoc.content.toString(),\n embedMap,\n mediaFiles,\n extractingOptions,\n )\n : '';\n const endnotesText = endnotesDoc\n ? await this.extractTextAndImages(\n endnotesDoc.content.toString(),\n embedMap,\n mediaFiles,\n extractingOptions,\n )\n : '';\n\n return [\n mainText,\n footnotesText ? '\\n--- Footnotes ---\\n' + footnotesText : '',\n endnotesText ? '\\n--- Endnotes ---\\n' + endnotesText : '',\n ].join('\\n');\n } catch (error) {\n console.error('AnyExtractor: Error parsing Word file:', error);\n throw error;\n }\n }\n\n private parseRelationships(xmlContent: string): Record<string, string> {\n const doc = parseString(xmlContent);\n const rels = doc.getElementsByTagName('Relationship');\n\n const map: Record<string, string> = {};\n for (const rel of Array.from(rels)) {\n const id = rel.getAttribute('Id');\n const target = rel.getAttribute('Target');\n if (id && target?.startsWith('media/')) {\n const filename = target.split('/').pop()!;\n map[id] = filename;\n }\n }\n return map;\n }\n\n private async extractTextAndImages(\n xmlContent: string,\n embedMap: Record<string, string>,\n mediaFiles: Record<string, ExtractedFile>,\n extractingOptions: ExtractingOptions,\n ): Promise<string> {\n const doc = parseString(xmlContent);\n const paragraphs = Array.from(doc.getElementsByTagName('w:p'));\n\n const parts: string[] = [];\n\n for (const paragraph of paragraphs) {\n let paragraphText = '';\n\n // Extract text nodes\n const texts = Array.from(paragraph.getElementsByTagName('w:t'));\n paragraphText += texts.map((t) => t.childNodes[0]?.nodeValue || '').join('');\n\n // Extract drawings/images\n const drawings = Array.from(paragraph.getElementsByTagName('w:drawing'));\n for (const drawing of drawings) {\n const blip = drawing.getElementsByTagName('a:blip')[0];\n const embedId = blip?.getAttribute('r:embed');\n\n if (embedId && embedMap[embedId]) {\n const imageFile = mediaFiles[embedMap[embedId]];\n if (imageFile) {\n const imageBuffer = imageFile.content;\n const imageDescription = await this.convertImageToText(imageBuffer, extractingOptions);\n paragraphText += `\\n[Image: ${imageDescription}]`;\n }\n }\n }\n\n if (paragraphText.trim()) {\n parts.push(paragraphText.trim());\n }\n }\n\n return parts.join('\\n');\n }\n\n private async convertImageToText(\n imageBuffer: Buffer,\n extractingOptions: ExtractingOptions,\n ): Promise<string> {\n return await this.anyExtractor.parseFile(imageBuffer, null, extractingOptions);\n }\n}\n","import { AnyExtractor } from './extractors/any-extractor';\nimport { ExtractorConfig } from './types';\nimport {\n ExcelParser,\n ImageParser,\n OpenOfficeParser,\n PDFParser,\n PowerPointParser,\n SimpleParser,\n WordParser,\n} from './file-parser';\n\n/**\n * Get an extractor with parsers for various file formats.\n *\n * @param {ExtractorConfig} [config] - Optional configuration for the extractor.\n * @returns {AnyExtractor} - The configured AnyExtractor instance.\n */\nexport const getAnyExtractor = (config?: ExtractorConfig): AnyExtractor => {\n const anyExtractor = new AnyExtractor(config);\n\n // List of parsers for handling various file types\n const parsers = [\n new ExcelParser(anyExtractor),\n new ImageParser(),\n new OpenOfficeParser(),\n new PDFParser(),\n new PowerPointParser(anyExtractor),\n new SimpleParser(),\n new WordParser(anyExtractor),\n ];\n\n parsers.forEach((parser) => anyExtractor.addParser(parser));\n\n return anyExtractor;\n};\n\nexport * from './types';\n"],"mappings":"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","names":["fetch","_","file","fetch","parse","file","file","file"]}
|