the url attribute will now give the preferred location for accessing the output file, without the url having to be constructed by the web client
89 lines
2.8 KiB
CoffeeScript
89 lines
2.8 KiB
CoffeeScript
RequestParser = require "./RequestParser"
|
|
CompileManager = require "./CompileManager"
|
|
Settings = require "settings-sharelatex"
|
|
Metrics = require "./Metrics"
|
|
ProjectPersistenceManager = require "./ProjectPersistenceManager"
|
|
logger = require "logger-sharelatex"
|
|
|
|
module.exports = CompileController =
|
|
compile: (req, res, next = (error) ->) ->
|
|
timer = new Metrics.Timer("compile-request")
|
|
RequestParser.parse req.body, (error, request) ->
|
|
return next(error) if error?
|
|
request.project_id = req.params.project_id
|
|
ProjectPersistenceManager.markProjectAsJustAccessed request.project_id, (error) ->
|
|
return next(error) if error?
|
|
CompileManager.doCompile request, (error, outputFiles = []) ->
|
|
if error?
|
|
logger.error err: error, project_id: request.project_id, "error running compile"
|
|
if error.timedout
|
|
status = "timedout"
|
|
else
|
|
status = "error"
|
|
code = 500
|
|
else
|
|
status = "failure"
|
|
for file in outputFiles
|
|
if file.path?.match(/output\.pdf$/)
|
|
status = "success"
|
|
|
|
timer.done()
|
|
res.status(code or 200).send {
|
|
compile:
|
|
status: status
|
|
error: error?.message or error
|
|
outputFiles: outputFiles.map (file) ->
|
|
url:
|
|
"#{Settings.apis.clsi.url}/project/#{request.project_id}" +
|
|
(if file.build? then "/build/#{file.build}" else "") +
|
|
"/output/#{file.path}"
|
|
path: file.path
|
|
type: file.type
|
|
build: file.build
|
|
}
|
|
|
|
clearCache: (req, res, next = (error) ->) ->
|
|
ProjectPersistenceManager.clearProject req.params.project_id, (error) ->
|
|
return next(error) if error?
|
|
res.sendStatus(204) # No content
|
|
|
|
syncFromCode: (req, res, next = (error) ->) ->
|
|
file = req.query.file
|
|
line = parseInt(req.query.line, 10)
|
|
column = parseInt(req.query.column, 10)
|
|
project_id = req.params.project_id
|
|
|
|
CompileManager.syncFromCode project_id, file, line, column, (error, pdfPositions) ->
|
|
return next(error) if error?
|
|
res.send JSON.stringify {
|
|
pdf: pdfPositions
|
|
}
|
|
|
|
syncFromPdf: (req, res, next = (error) ->) ->
|
|
page = parseInt(req.query.page, 10)
|
|
h = parseFloat(req.query.h)
|
|
v = parseFloat(req.query.v)
|
|
project_id = req.params.project_id
|
|
|
|
CompileManager.syncFromPdf project_id, page, h, v, (error, codePositions) ->
|
|
return next(error) if error?
|
|
res.send JSON.stringify {
|
|
code: codePositions
|
|
}
|
|
|
|
wordcount: (req, res, next = (error) ->) ->
|
|
file = req.query.file || "main.tex"
|
|
project_id = req.params.project_id
|
|
image = req.query.image
|
|
logger.log {image, file, project_id}, "word count request"
|
|
|
|
CompileManager.wordcount project_id, file, image, (error, result) ->
|
|
return next(error) if error?
|
|
res.send JSON.stringify {
|
|
texcount: result
|
|
}
|
|
|
|
status: (req, res, next = (error)-> )->
|
|
res.send("OK")
|
|
|