Merge pull request #100 from sharelatex/bg-create-main-file-for-pstool

use TikzManager to create main file for pstool package
This commit is contained in:
Brian Gough 2018-10-15 11:05:23 +01:00 committed by GitHub
commit 0a50b37c57
3 changed files with 26 additions and 8 deletions

View file

@ -58,9 +58,9 @@ module.exports = CompileManager =
callback() callback()
createTikzFileIfRequired = (callback) -> createTikzFileIfRequired = (callback) ->
TikzManager.checkMainFile compileDir, request.rootResourcePath, resourceList, (error, usesTikzExternalize) -> TikzManager.checkMainFile compileDir, request.rootResourcePath, resourceList, (error, needsMainFile) ->
return callback(error) if error? return callback(error) if error?
if usesTikzExternalize if needsMainFile
TikzManager.injectOutputFile compileDir, request.rootResourcePath, callback TikzManager.injectOutputFile compileDir, request.rootResourcePath, callback
else else
callback() callback()

View file

@ -4,32 +4,34 @@ ResourceWriter = require "./ResourceWriter"
SafeReader = require "./SafeReader" SafeReader = require "./SafeReader"
logger = require "logger-sharelatex" logger = require "logger-sharelatex"
# for \tikzexternalize to work the main file needs to match the # 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 # jobname. Since we set the -jobname to output, we have to create a
# copy of the main file as 'output.tex'. # copy of the main file as 'output.tex'.
module.exports = TikzManager = module.exports = TikzManager =
checkMainFile: (compileDir, mainFile, resources, callback = (error, usesTikzExternalize) ->) -> checkMainFile: (compileDir, mainFile, resources, callback = (error, needsMainFile) ->) ->
# if there's already an output.tex file, we don't want to touch it # if there's already an output.tex file, we don't want to touch it
for resource in resources for resource in resources
if resource.path is "output.tex" if resource.path is "output.tex"
logger.log compileDir: compileDir, mainFile: mainFile, "output.tex already in resources" logger.log compileDir: compileDir, mainFile: mainFile, "output.tex already in resources"
return callback(null, false) return callback(null, false)
# if there's no output.tex, see if we are using tikz/pgf in the main file # if there's no output.tex, see if we are using tikz/pgf or pstool in the main file
ResourceWriter.checkPath compileDir, mainFile, (error, path) -> ResourceWriter.checkPath compileDir, mainFile, (error, path) ->
return callback(error) if error? return callback(error) if error?
SafeReader.readFile path, 65536, "utf8", (error, content) -> SafeReader.readFile path, 65536, "utf8", (error, content) ->
return callback(error) if error? return callback(error) if error?
usesTikzExternalize = content?.indexOf("\\tikzexternalize") >= 0 usesTikzExternalize = content?.indexOf("\\tikzexternalize") >= 0
logger.log compileDir: compileDir, mainFile: mainFile, usesTikzExternalize:usesTikzExternalize, "checked for tikzexternalize" usesPsTool = content?.indexOf("{pstool}") >= 0
callback null, usesTikzExternalize logger.log compileDir: compileDir, mainFile: mainFile, usesTikzExternalize:usesTikzExternalize, usesPsTool: usesPsTool, "checked for packages needing main file as output.tex"
needsMainFile = (usesTikzExternalize || usesPsTool)
callback null, needsMainFile
injectOutputFile: (compileDir, mainFile, callback = (error) ->) -> injectOutputFile: (compileDir, mainFile, callback = (error) ->) ->
ResourceWriter.checkPath compileDir, mainFile, (error, path) -> ResourceWriter.checkPath compileDir, mainFile, (error, path) ->
return callback(error) if error? return callback(error) if error?
fs.readFile path, "utf8", (error, content) -> fs.readFile path, "utf8", (error, content) ->
return callback(error) if error? return callback(error) if error?
logger.log compileDir: compileDir, mainFile: mainFile, "copied file to output.tex for tikz" logger.log compileDir: compileDir, mainFile: 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 # use wx flag to ensure that output file does not already exist
fs.writeFile Path.join(compileDir, "output.tex"), content, {flag:'wx'}, callback fs.writeFile Path.join(compileDir, "output.tex"), content, {flag:'wx'}, callback

View file

@ -65,6 +65,22 @@ describe 'TikzManager', ->
@callback.calledWithExactly(null, false) @callback.calledWithExactly(null, false)
.should.equal true .should.equal true
describe "and the main file contains \\usepackage{pstool}", ->
beforeEach ->
@SafeReader.readFile = sinon.stub()
.withArgs("#{@compileDir}/#{@mainFile}")
.callsArgWith(3, null, "hello \\usepackage[random-options]{pstool}")
@TikzManager.checkMainFile @compileDir, @mainFile, @resources, @callback
it "should look at the file on disk", ->
@SafeReader.readFile
.calledWith("#{@compileDir}/#{@mainFile}")
.should.equal true
it "should call the callback with true ", ->
@callback.calledWithExactly(null, true)
.should.equal true
describe "injectOutputFile", -> describe "injectOutputFile", ->
beforeEach -> beforeEach ->
@rootDir = "/mock" @rootDir = "/mock"