| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129 |
- /* eslint-disable
- no-unused-vars,
- */
- // TODO: This file was created by bulk-decaffeinate.
- // Fix any style issues and re-enable lint.
- /*
- * decaffeinate suggestions:
- * DS101: Remove unnecessary use of Array.from
- * DS102: Remove unnecessary code created because of implicit returns
- * DS207: Consider shorter variations of null checks
- * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
- */
- import fs from 'node:fs'
- import Path from 'node:path'
- import { promisify } from 'node:util'
- import ResourceWriter from './ResourceWriter.js'
- import SafeReader from './SafeReader.js'
- import logger from '@overleaf/logger'
- let TikzManager
- // for \tikzexternalize or pstool to work the main file needs to match the
- // jobname. Since we set the -jobname to output, we have to create a
- // copy of the main file as 'output.tex'.
- export default TikzManager = {
- OUTPUT_TEX: 'output.tex',
- /**
- * @param {string} content
- * @return {boolean}
- */
- usesTikzExternalize(content) {
- return content.includes('\\tikzexternalize') || content.includes('{pstool}')
- },
- /**
- * @param {string} compileDir
- * @param {import('overleaf-editor-core').Snapshot} snapshot
- * @param {string} content
- * @return {Promise<void>}
- */
- async writeOutputFileIfNeeded(compileDir, snapshot, content) {
- if (snapshot.getFile(TikzManager.OUTPUT_TEX)) return
- if (!TikzManager.usesTikzExternalize(content)) return
- await fs.promises.writeFile(
- Path.join(compileDir, TikzManager.OUTPUT_TEX),
- content,
- 'utf-8'
- )
- },
- checkMainFile(compileDir, mainFile, resources, callback) {
- // if there's already an output.tex file, we don't want to touch it
- if (callback == null) {
- callback = function () {}
- }
- for (const resource of Array.from(resources)) {
- if (resource.path === TikzManager.OUTPUT_TEX) {
- logger.debug(
- { compileDir, mainFile },
- 'output.tex already in resources'
- )
- return callback(null, false)
- }
- }
- // if there's no output.tex, see if we are using tikz/pgf or pstool in the main file
- return ResourceWriter.checkPath(
- compileDir,
- mainFile,
- function (error, path) {
- if (error != null) {
- return callback(error)
- }
- return SafeReader.readFile(
- path,
- 65536,
- 'utf8',
- function (error, content) {
- if (error != null) {
- return callback(error)
- }
- const needsMainFile = TikzManager.usesTikzExternalize(content)
- logger.debug(
- { compileDir, mainFile, needsMainFile },
- 'checked for packages needing main file as output.tex'
- )
- return callback(null, needsMainFile)
- }
- )
- }
- )
- },
- injectOutputFile(compileDir, mainFile, callback) {
- if (callback == null) {
- callback = function () {}
- }
- return ResourceWriter.checkPath(
- compileDir,
- mainFile,
- function (error, path) {
- if (error != null) {
- return callback(error)
- }
- return fs.readFile(path, 'utf8', function (error, content) {
- if (error != null) {
- return callback(error)
- }
- logger.debug(
- { compileDir, mainFile },
- 'copied file to output.tex as project uses packages which require it'
- )
- // use wx flag to ensure that output file does not already exist
- return fs.writeFile(
- Path.join(compileDir, TikzManager.OUTPUT_TEX),
- content,
- { flag: 'wx' },
- callback
- )
- })
- }
- )
- },
- }
- TikzManager.promises = {
- checkMainFile: promisify(TikzManager.checkMainFile),
- injectOutputFile: promisify(TikzManager.injectOutputFile),
- }
|