mirror of
https://github.com/yu-i-i/overleaf-cep.git
synced 2026-11-15 06:33:55 +01:00
[WEB + CLSI] Download as docx file feature (#32851)
* using CLSI logic for fetching the project contents and skip the .zip export * Use unique conversion directory for project-to-docx export to avoid corrupting the shared compile directory when a compile runs concurrently * Remove X-Accel-Buffering header — not needed as CLSI does not run behind nginx * moving log before sending the data * Return CLSI stream directly instead of buffering to disk on web Previously convertProjectToDocx wrote the CLSI response to a temp file on disk, then the controller read it back to stream to the client. Now the stream is returned directly and piped to the response, avoiding unnecessary disk I/O on the web server. * Use href redirect for docx export instead of fetching blob into memory * making functions and files more generic so they can be used in future for other documents exports as well * adding export-docx split test * adding unit tests * adding cypress E2E test * format:fix * renaming the route to download from convert * adding new icon for export docx button * format:fix * remove unused showExportDocumentErrorToast export and adding guard against invalid Content-Length header from CLSI * format:fix * refactor(clsi): move promisify(parse) into RequestParser * refactor: generic conversion endpoint with type as route param * refactor: use type→extension map for validated conversion types * refactor(clsi): remove --standalone flag and fix rejection test * fixing the href in cypress test * renaming function * adding type to Metrics.inc * fix: rename exportProjectDocument, add WithLock wrapper and metrics type label * format:fix * fix: hide docx export from anonymous users and add WithLock wrapper * format fix * remove redundant Content-Length validation from DocumentConversionManager * format:fix * removing trailing icon GitOrigin-RevId: e9764fefac2c4b625d23be9e942ea4a8b283c70d
This commit is contained in:
@@ -94,8 +94,77 @@ async function convertDocxToLaTeX(conversionId, conversionDir, inputPath) {
|
||||
return Path.join(conversionDir, outputName)
|
||||
}
|
||||
|
||||
async function convertLaTeXToDocumentInDirWithLock(
|
||||
conversionId,
|
||||
compileDir,
|
||||
rootDocPath,
|
||||
type,
|
||||
extension
|
||||
) {
|
||||
const lock = LockManager.acquire(compileDir)
|
||||
try {
|
||||
return await convertLaTeXToDocumentInDir(
|
||||
conversionId,
|
||||
compileDir,
|
||||
rootDocPath,
|
||||
type,
|
||||
extension
|
||||
)
|
||||
} finally {
|
||||
lock.release()
|
||||
}
|
||||
}
|
||||
|
||||
async function convertLaTeXToDocumentInDir(
|
||||
conversionId,
|
||||
compileDir,
|
||||
rootDocPath = 'main.tex',
|
||||
type,
|
||||
extension
|
||||
) {
|
||||
const outputName = crypto.randomUUID() + '.' + extension
|
||||
const timeoutMs = Settings.conversionTimeoutSeconds * 1000
|
||||
|
||||
logger.debug(
|
||||
{ compileDir, rootDocPath, type },
|
||||
'running pandoc latex-to-document in compile dir'
|
||||
)
|
||||
|
||||
const { exitCode, stdout, stderr } = await CommandRunner.promises.run(
|
||||
conversionId,
|
||||
[
|
||||
'pandoc',
|
||||
rootDocPath,
|
||||
'--output',
|
||||
outputName,
|
||||
'--from',
|
||||
'latex',
|
||||
'--to',
|
||||
type,
|
||||
'--resource-path=.',
|
||||
],
|
||||
compileDir,
|
||||
Settings.pandocImage,
|
||||
timeoutMs,
|
||||
{},
|
||||
'conversions'
|
||||
)
|
||||
|
||||
if (exitCode !== 0) {
|
||||
throw new OError('pandoc latex-to-document conversion failed', {
|
||||
type,
|
||||
exitCode,
|
||||
stdout,
|
||||
stderr,
|
||||
})
|
||||
}
|
||||
|
||||
return Path.join(compileDir, outputName)
|
||||
}
|
||||
|
||||
export default {
|
||||
promises: {
|
||||
convertDocxToLaTeXWithLock,
|
||||
convertLaTeXToDocumentInDirWithLock,
|
||||
},
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user