mirror of
https://github.com/overleaf/overleaf.git
synced 2024-12-29 14:14:04 +00:00
234 lines
6.8 KiB
CoffeeScript
Executable file
234 lines
6.8 KiB
CoffeeScript
Executable file
define [
|
|
"pdf/PDFjsView"
|
|
"pdf/NativePdfView"
|
|
"libs/backbone"
|
|
"libs/mustache"
|
|
"libs/bootstrap"
|
|
"libs/jquery.storage"
|
|
], (PdfjsView, NativePdfView) ->
|
|
LatexErrorView = Backbone.View.extend
|
|
constructor: (@ide, @error) ->
|
|
|
|
template: $('#compileLogEntryTemplate').html()
|
|
|
|
events:
|
|
"click": "onClick"
|
|
|
|
render: () ->
|
|
if @error.level == "error"
|
|
@error.type = "error"
|
|
@error.title = "Error in #{@error.file}"
|
|
else if @error.level == "warning"
|
|
@error.type = "warning"
|
|
@error.title = "Warning in #{@error.file}"
|
|
else
|
|
@error.type = "info"
|
|
@error.title = "Typesetting problem in #{@error.file}"
|
|
if @error.line?
|
|
@error.title += " (line #{@error.line})"
|
|
@setElement($(Mustache.to_html(@template, @error)))
|
|
|
|
onClick: (event) ->
|
|
@ide.fileTreeManager.openDocByPath(@error.file, @error.line)
|
|
|
|
PdfView = Backbone.View.extend
|
|
templates:
|
|
pdfPanel: $("#pdfPanelTemplate").html()
|
|
compileSuccess: $('#compileSuccessTemplate').html()
|
|
compileFailed: $('#compileFailedTemplate').html()
|
|
compileError: $('#compileErrorTemplate').html()
|
|
compileTimeout: $('#compileTimeoutTemplate').html()
|
|
outputFileLink: $('#outputFileLinkTemplate').html()
|
|
|
|
events:
|
|
"click #recompilePdf": -> @recompilePdf()
|
|
"click #showLog": -> @showLog()
|
|
"click #showRawLog": -> @showRawLog()
|
|
"click #showPdf": -> @showPdf()
|
|
"click #downloadPdf": -> @options.manager.downloadPdf()
|
|
"click #flatViewButton": () ->
|
|
$.localStorage("layout.pdf", "flat")
|
|
@options.manager.switchToFlatView(showPdf: true)
|
|
"click #splitViewButton": ->
|
|
$.localStorage("layout.pdf", "split")
|
|
@options.manager.switchToSplitView()
|
|
"click .delete-cached-files > a": -> @options.manager.deleteCachedFiles()
|
|
|
|
initialize: (@options) ->
|
|
@ide = @options.ide
|
|
@ide.layoutManager.on "resize", => @resize()
|
|
@ide.editor.on "resize", => @resize()
|
|
if @ide.userSettings.pdfViewer == "native"
|
|
PdfView = NativePdfView
|
|
@pdfjs = false
|
|
else
|
|
PdfView = PdfjsView
|
|
@pdfjs = true
|
|
@pdfView = new PdfView(manager: @)
|
|
@pdfView.on "dblclick", (e) => @trigger "dblclick", e
|
|
|
|
render: () ->
|
|
@setElement(@templates.pdfPanel)
|
|
@$("#pdfAreaContent").append @pdfView.render().$el
|
|
@showBeforeCompile()
|
|
return this
|
|
|
|
resize: () ->
|
|
toolbarHeight = @$("#pdfToolBar").outerHeight()
|
|
areaHeight = @$el.outerHeight()
|
|
@$("#pdfAreaContent").height(areaHeight - toolbarHeight)
|
|
@pdfView.onResize?()
|
|
|
|
updateLog: (options) ->
|
|
{pdfExists, logExists, compileErrors, rawLog, timedOut, systemError} = options
|
|
|
|
if @errorViews?
|
|
for errorView in @errorViews
|
|
errorView.remove()
|
|
@errorViews = []
|
|
|
|
errorLogs = @$("#logArea").find('ul')
|
|
errorLogs.empty()
|
|
|
|
logButtonHtml = "Logs"
|
|
|
|
if compileErrors?
|
|
for error in compileErrors.errors.concat(compileErrors.warnings).concat(compileErrors.typesetting)
|
|
errorView = new LatexErrorView(@options.manager.ide, error)
|
|
errorView.render()
|
|
@errorViews.push(errorView)
|
|
# TODO: The event handlers introduced by LatexError are never freed
|
|
errorLogs.append(errorView.el)
|
|
|
|
if compileErrors.errors.length > 0
|
|
logButtonHtml += " <span class='label label-important'>#{compileErrors.errors.length}</span>"
|
|
|
|
if compileErrors.warnings.length > 0
|
|
logButtonHtml += " <span class='label label-warning'>#{compileErrors.warnings.length}</span>"
|
|
|
|
if compileErrors.typesetting.length > 0
|
|
logButtonHtml += " <span class='label label-info'>#{compileErrors.typesetting.length}</span>"
|
|
|
|
@$("#showLog").html(logButtonHtml)
|
|
|
|
if timedOut
|
|
errorLogs.prepend($(@templates.compileTimeout))
|
|
else if systemError
|
|
errorLogs.prepend($(@templates.compileError))
|
|
else if !pdfExists
|
|
errorLogs.prepend($(@templates.compileFailed))
|
|
else if pdfExists && compileErrors.all.length == 0
|
|
errorLogs.prepend($(@templates.compileSuccess))
|
|
|
|
errorLogs.find(".js-clear-cache").on "click", () =>
|
|
@options.manager.deleteCachedFiles()
|
|
|
|
@$("#rawLogArea").find("pre").text(rawLog)
|
|
|
|
setPdf: (pdfUrl) ->
|
|
@pdfUrl = pdfUrl
|
|
@pdfView.setPdf pdfUrl
|
|
@$("#downloadPdf").removeAttr("disabled")
|
|
@$("#downloadLinksButton").removeAttr("disabled")
|
|
|
|
unsetPdf: () ->
|
|
delete @pdfUrl
|
|
@pdfView.unsetPdf()
|
|
@$("#downloadPdf").attr("disabled", "disabled")
|
|
@$("#downloadLinksButton").attr("disabled", "disabled")
|
|
return @
|
|
|
|
hasPdf: () -> !!@pdfUrl
|
|
|
|
IGNORE_FILES: ["output.fls", "output.fdb_latexmk"]
|
|
showOutputFileDownloadLinks: (outputFiles) ->
|
|
@$("#downloadLinks").empty()
|
|
for file in outputFiles
|
|
if @IGNORE_FILES.indexOf(file.path) == -1
|
|
if file.path.match(/^output\./)
|
|
name = "#{file.path.replace(/^output\./, "")} file"
|
|
else
|
|
name = file.path
|
|
link = $ Mustache.to_html(@templates.outputFileLink, {
|
|
project_id: @ide.project_id
|
|
name: name
|
|
path: file.path
|
|
})
|
|
@$("#downloadLinks").append(link)
|
|
|
|
afterSwitchView: ()->
|
|
if !@pdfjs
|
|
@pdfView.unsetPdf()
|
|
@pdfView.hide()
|
|
@$(".not-compiled-yet-message").show()
|
|
|
|
showBeforeCompile: () ->
|
|
@pdfView.hide()
|
|
@$("#showPdfGroup").hide()
|
|
@$("#showLog").attr("disabled", "disabled")
|
|
@$("#downloadPdf").attr("disabled", "disabled")
|
|
@$("#downloadLinksButton").attr("disabled", "disabled")
|
|
@$(".compiling-message").hide()
|
|
@$(".not-compiled-yet-message").show()
|
|
|
|
showPdf: () ->
|
|
@$("#logArea").hide()
|
|
@$("#rawLogArea").hide()
|
|
@pdfView.show()
|
|
@$("#showPdfGroup").hide()
|
|
@$("#showLogGroup").show()
|
|
|
|
showLog: () ->
|
|
@$("#rawLogArea").hide()
|
|
@pdfView.hide()
|
|
@$("#logArea").show()
|
|
@$("#showPdfGroup").show()
|
|
@$("#showLogGroup").hide()
|
|
|
|
showRawLog: () ->
|
|
@pdfView.hide()
|
|
@$("#logArea").hide()
|
|
@$("#rawLogArea").show()
|
|
@$("#showPdfGroup").show()
|
|
@$("#showLogGroup").hide()
|
|
|
|
onCompiling: () ->
|
|
@$(".not-compiled-yet-message").hide()
|
|
@$(".compiling-message").show()
|
|
@$("#recompilePdf").attr("disabled", "disabled")
|
|
|
|
doneCompiling: () ->
|
|
@$(".compiling-message").hide()
|
|
@$("#recompilePdf").removeAttr("disabled")
|
|
@$("#showLog").removeAttr("disabled")
|
|
|
|
recompilePdf: () ->
|
|
@options.manager.trigger "compile:pdf"
|
|
rootDocOverride_id = null
|
|
for line in @ide.editor.getLines()
|
|
match = line.match /(.*)\\documentclass/
|
|
if match and !match[1].match /%/
|
|
rootDocOverride_id = @ide.editor.getCurrentDocId()
|
|
@options.manager.refreshPdf {rootDocOverride_id}
|
|
|
|
toggleFlatViewButton: () -> @$("#flatViewButton").button("toggle")
|
|
toggleSplitViewButton: () -> @$("#splitViewButton").button("toggle")
|
|
|
|
downloadPdf: () ->
|
|
@options.manager.downloadPdf()
|
|
|
|
delegateEvents: () ->
|
|
Backbone.View::delegateEvents.apply(this, arguments)
|
|
@pdfView.delegateEvents()
|
|
|
|
undelegateEvents: () ->
|
|
Backbone.View::undelegateEvents.apply(this, arguments)
|
|
@pdfView.undelegateEvents()
|
|
|
|
highlightInPdf: (args...) ->
|
|
@pdfView.highlightInPdf?(args...)
|
|
|
|
getPdfPosition: () ->
|
|
@pdfView.getPdfPosition?()
|
|
|
|
|