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 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
- const $ = cheerio.load(xml, { xmlMode: true });
156
- const node = $("ac\\:layout").first();
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
- const $ = cheerio.load(xml, { xmlMode: true });
120
- const node = $("ac\\:layout").first();
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,
@@ -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"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "any-extractor",
3
- "version": "2.0.1",
3
+ "version": "2.0.2",
4
4
  "description": "A universal text extractor for files.",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",