TikzManager.js 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. /* eslint-disable
  2. no-unused-vars,
  3. */
  4. // TODO: This file was created by bulk-decaffeinate.
  5. // Fix any style issues and re-enable lint.
  6. /*
  7. * decaffeinate suggestions:
  8. * DS101: Remove unnecessary use of Array.from
  9. * DS102: Remove unnecessary code created because of implicit returns
  10. * DS207: Consider shorter variations of null checks
  11. * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
  12. */
  13. let TikzManager
  14. const fs = require('node:fs')
  15. const Path = require('node:path')
  16. const { promisify } = require('node:util')
  17. const ResourceWriter = require('./ResourceWriter')
  18. const SafeReader = require('./SafeReader')
  19. const logger = require('@overleaf/logger')
  20. // for \tikzexternalize or pstool to work the main file needs to match the
  21. // jobname. Since we set the -jobname to output, we have to create a
  22. // copy of the main file as 'output.tex'.
  23. module.exports = TikzManager = {
  24. checkMainFile(compileDir, mainFile, resources, callback) {
  25. // if there's already an output.tex file, we don't want to touch it
  26. if (callback == null) {
  27. callback = function () {}
  28. }
  29. for (const resource of Array.from(resources)) {
  30. if (resource.path === 'output.tex') {
  31. logger.debug(
  32. { compileDir, mainFile },
  33. 'output.tex already in resources'
  34. )
  35. return callback(null, false)
  36. }
  37. }
  38. // if there's no output.tex, see if we are using tikz/pgf or pstool in the main file
  39. return ResourceWriter.checkPath(
  40. compileDir,
  41. mainFile,
  42. function (error, path) {
  43. if (error != null) {
  44. return callback(error)
  45. }
  46. return SafeReader.readFile(
  47. path,
  48. 65536,
  49. 'utf8',
  50. function (error, content) {
  51. if (error != null) {
  52. return callback(error)
  53. }
  54. const usesTikzExternalize =
  55. (content != null
  56. ? content.indexOf('\\tikzexternalize')
  57. : undefined) >= 0
  58. const usesPsTool =
  59. (content != null ? content.indexOf('{pstool}') : undefined) >= 0
  60. logger.debug(
  61. { compileDir, mainFile, usesTikzExternalize, usesPsTool },
  62. 'checked for packages needing main file as output.tex'
  63. )
  64. const needsMainFile = usesTikzExternalize || usesPsTool
  65. return callback(null, needsMainFile)
  66. }
  67. )
  68. }
  69. )
  70. },
  71. injectOutputFile(compileDir, mainFile, callback) {
  72. if (callback == null) {
  73. callback = function () {}
  74. }
  75. return ResourceWriter.checkPath(
  76. compileDir,
  77. mainFile,
  78. function (error, path) {
  79. if (error != null) {
  80. return callback(error)
  81. }
  82. return fs.readFile(path, 'utf8', function (error, content) {
  83. if (error != null) {
  84. return callback(error)
  85. }
  86. logger.debug(
  87. { compileDir, mainFile },
  88. 'copied file to output.tex as project uses packages which require it'
  89. )
  90. // use wx flag to ensure that output file does not already exist
  91. return fs.writeFile(
  92. Path.join(compileDir, 'output.tex'),
  93. content,
  94. { flag: 'wx' },
  95. callback
  96. )
  97. })
  98. }
  99. )
  100. },
  101. }
  102. module.exports.promises = {
  103. checkMainFile: promisify(TikzManager.checkMainFile),
  104. injectOutputFile: promisify(TikzManager.injectOutputFile),
  105. }