mirror of
https://github.com/overleaf/overleaf.git
synced 2024-11-07 20:31:06 -05:00
101 lines
3 KiB
CoffeeScript
101 lines
3 KiB
CoffeeScript
request = require "request"
|
|
fs = require "fs"
|
|
Settings = require "settings-sharelatex"
|
|
|
|
host = "localhost"
|
|
|
|
module.exports = Client =
|
|
host: Settings.apis.clsi.url
|
|
|
|
randomId: () ->
|
|
Math.random().toString(16).slice(2)
|
|
|
|
compile: (project_id, data, callback = (error, res, body) ->) ->
|
|
request.post {
|
|
url: "#{@host}/project/#{project_id}/compile"
|
|
json:
|
|
compile: data
|
|
}, callback
|
|
|
|
clearCache: (project_id, callback = (error, res, body) ->) ->
|
|
request.del "#{@host}/project/#{project_id}", callback
|
|
|
|
getOutputFile: (response, type) ->
|
|
for file in response.compile.outputFiles
|
|
if file.type == type and file.url.match("output.#{type}")
|
|
return file
|
|
return null
|
|
|
|
runServer: (port, directory) ->
|
|
express = require("express")
|
|
app = express()
|
|
app.use express.static(directory)
|
|
app.listen(port, host)
|
|
|
|
syncFromCode: (project_id, file, line, column, callback = (error, pdfPositions) ->) ->
|
|
request.get {
|
|
url: "#{@host}/project/#{project_id}/sync/code"
|
|
qs: {
|
|
file: file
|
|
line: line
|
|
column: column
|
|
}
|
|
}, (error, response, body) ->
|
|
return callback(error) if error?
|
|
callback null, JSON.parse(body)
|
|
|
|
syncFromPdf: (project_id, page, h, v, callback = (error, pdfPositions) ->) ->
|
|
request.get {
|
|
url: "#{@host}/project/#{project_id}/sync/pdf"
|
|
qs: {
|
|
page: page,
|
|
h: h, v: v
|
|
}
|
|
}, (error, response, body) ->
|
|
return callback(error) if error?
|
|
callback null, JSON.parse(body)
|
|
|
|
compileDirectory: (project_id, baseDirectory, directory, serverPort, callback = (error, res, body) ->) ->
|
|
resources = []
|
|
entities = fs.readdirSync("#{baseDirectory}/#{directory}")
|
|
rootResourcePath = "main.tex"
|
|
while (entities.length > 0)
|
|
entity = entities.pop()
|
|
stat = fs.statSync("#{baseDirectory}/#{directory}/#{entity}")
|
|
if stat.isDirectory()
|
|
entities = entities.concat fs.readdirSync("#{baseDirectory}/#{directory}/#{entity}").map (subEntity) ->
|
|
if subEntity == "main.tex"
|
|
rootResourcePath = "#{entity}/#{subEntity}"
|
|
return "#{entity}/#{subEntity}"
|
|
else if stat.isFile() and entity != "output.pdf"
|
|
extension = entity.split(".").pop()
|
|
if ["tex", "bib", "cls", "sty", "pdf_tex", "Rtex", "ist", "md", "Rmd"].indexOf(extension) > -1
|
|
resources.push
|
|
path: entity
|
|
content: fs.readFileSync("#{baseDirectory}/#{directory}/#{entity}").toString()
|
|
else if ["eps", "ttf", "png", "jpg", "pdf", "jpeg"].indexOf(extension) > -1
|
|
resources.push
|
|
path: entity
|
|
url: "http://#{host}:#{serverPort}/#{directory}/#{entity}"
|
|
modified: stat.mtime
|
|
|
|
fs.readFile "#{baseDirectory}/#{directory}/options.json", (error, body) =>
|
|
req =
|
|
resources: resources
|
|
rootResourcePath: rootResourcePath
|
|
|
|
if !error?
|
|
body = JSON.parse body
|
|
req.options = body
|
|
|
|
@compile project_id, req, callback
|
|
|
|
wordcount: (project_id, file, callback = (error, pdfPositions) ->) ->
|
|
request.get {
|
|
url: "#{@host}/project/#{project_id}/wordcount"
|
|
qs: {
|
|
file: file
|
|
}
|
|
}, (error, response, body) ->
|
|
return callback(error) if error?
|
|
callback null, JSON.parse(body)
|