pdf.pug 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397
  1. div.full-size.pdf(ng-controller="PdfController")
  2. if showNewLogsUI
  3. preview-pane(
  4. compiler-state=`{
  5. isAutoCompileOn: autocompile_enabled,
  6. isClearingCache: pdf.clearingCache,
  7. isCompiling: pdf.compiling,
  8. isDraftModeOn: draft,
  9. isSyntaxCheckOn: stop_on_validation_error,
  10. logEntries: pdf.logEntries ? pdf.logEntries : {}
  11. }`
  12. on-clear-cache="clearCache"
  13. on-recompile="recompile"
  14. on-run-syntax-check-now="runSyntaxCheckNow"
  15. on-set-auto-compile="setAutoCompile"
  16. on-set-draft-mode="setDraftMode"
  17. on-set-syntax-check="setSyntaxCheck"
  18. on-toggle-logs="toggleLogs"
  19. output-files="pdf.outputFiles"
  20. pdf-download-url="pdf.downloadUrl"
  21. show-logs="shouldShowLogs"
  22. )
  23. else
  24. .toolbar.toolbar-pdf(ng-class="{ 'changes-to-autocompile': changesToAutoCompile && !autoCompileLintingError }")
  25. .btn-group.btn-recompile-group#recompile(
  26. dropdown,
  27. tooltip-html="'"+translate('recompile_pdf')+" <span class=\"keyboard-shortcut\">({{modifierKey}} + Enter)</span>'"
  28. tooltip-class="keyboard-tooltip"
  29. tooltip-popup-delay="500"
  30. tooltip-append-to-body="true"
  31. tooltip-placement="bottom"
  32. )
  33. a.btn.btn-recompile(
  34. href,
  35. ng-disabled="pdf.compiling",
  36. ng-click="recompile()"
  37. )
  38. i.fa.fa-refresh(
  39. ng-class="{'fa-spin': pdf.compiling }"
  40. )
  41. span.btn-recompile-label(ng-show="!pdf.compiling") #{translate("recompile")}
  42. span.btn-recompile-label(ng-show="pdf.compiling") #{translate("compiling")}…
  43. a.btn.btn-recompile.dropdown-toggle(
  44. href,
  45. ng-disabled="pdf.compiling",
  46. dropdown-toggle
  47. )
  48. span.caret
  49. ul.dropdown-menu.dropdown-menu-left
  50. li.dropdown-header #{translate("auto_compile")}
  51. li
  52. a(href, ng-click="autocompile_enabled = true")
  53. i.fa.fa-fw(ng-class="{'fa-check': autocompile_enabled}")
  54. | &nbsp;#{translate('on')}
  55. li
  56. a(href, ng-click="autocompile_enabled = false")
  57. i.fa.fa-fw(ng-class="{'fa-check': !autocompile_enabled}")
  58. | &nbsp;#{translate('off')}
  59. li.dropdown-header #{translate("compile_mode")}
  60. li
  61. a(href, ng-click="draft = false")
  62. i.fa.fa-fw(ng-class="{'fa-check': !draft}")
  63. | &nbsp;#{translate("normal")}
  64. li
  65. a(href, ng-click="draft = true")
  66. i.fa.fa-fw(ng-class="{'fa-check': draft}")
  67. | &nbsp;#{translate("fast")}&nbsp;
  68. span.subdued [draft]
  69. li.dropdown-header #{translate("compile_time_checks")}
  70. li
  71. a(href, ng-click="stop_on_validation_error = true")
  72. i.fa.fa-fw(ng-class="{'fa-check': stop_on_validation_error}")
  73. | &nbsp;#{translate("stop_on_validation_error")}
  74. li
  75. a(href, ng-click="stop_on_validation_error = false")
  76. i.fa.fa-fw(ng-class="{'fa-check': !stop_on_validation_error}")
  77. | &nbsp;#{translate("ignore_validation_errors")}
  78. li
  79. a(href, ng-click="recompile({check:true})")
  80. i.fa.fa-fw()
  81. | &nbsp;#{translate("run_syntax_check_now")}
  82. a(
  83. href
  84. ng-click="stop()"
  85. ng-show="pdf.compiling",
  86. tooltip=translate('stop_compile')
  87. tooltip-placement="bottom"
  88. )
  89. i.fa.fa-fw.fa-stop()
  90. a.log-btn(
  91. href
  92. ng-click="toggleLogs()"
  93. ng-class="{ 'active': shouldShowLogs == true }"
  94. tooltip=translate('logs_and_output_files')
  95. tooltip-placement="bottom"
  96. )
  97. i.fa.fa-fw.fa-file-text-o
  98. span.label(
  99. ng-show="pdf.logEntries.warnings.length + pdf.logEntries.errors.length > 0"
  100. ng-class="{\
  101. 'label-warning': pdf.logEntries.errors.length == 0,\
  102. 'label-danger': pdf.logEntries.errors.length > 0\
  103. }"
  104. ) {{ pdf.logEntries.errors.length + pdf.logEntries.warnings.length }}
  105. a(
  106. ng-href="{{pdf.downloadUrl || pdf.url}}"
  107. target="_blank"
  108. ng-if="pdf.url"
  109. tooltip=translate('download_pdf')
  110. tooltip-placement="bottom"
  111. )
  112. i.fa.fa-fw.fa-download
  113. .toolbar-right
  114. span.auto-compile-status.small(
  115. ng-show="changesToAutoCompile && !compiling && !autoCompileLintingError"
  116. ) #{translate('uncompiled_changes')}
  117. span.auto-compile-status.auto-compile-error.small(
  118. ng-show="autoCompileLintingError"
  119. tooltip-placement="bottom"
  120. tooltip=translate("code_check_failed_explanation")
  121. tooltip-append-to-body="true"
  122. )
  123. i.fa.fa-fw.fa-exclamation-triangle
  124. |
  125. | #{translate("code_check_failed")}
  126. a(
  127. href,
  128. ng-click="switchToFlatLayout('pdf')"
  129. ng-show="ui.pdfLayout == 'sideBySide'"
  130. tooltip=translate('full_screen')
  131. tooltip-placement="bottom"
  132. tooltip-append-to-body="true"
  133. )
  134. i.fa.fa-expand
  135. a(
  136. href,
  137. ng-click="switchToSideBySideLayout('editor')"
  138. ng-show="ui.pdfLayout == 'flat'"
  139. tooltip=translate('split_screen')
  140. tooltip-placement="bottom"
  141. tooltip-append-to-body="true"
  142. )
  143. i.fa.fa-compress
  144. // end of toolbar
  145. // logs view
  146. .pdf-logs(ng-show="shouldShowLogs")
  147. .alert.alert-success(ng-show="pdf.logEntries.all.length == 0 && !pdf.failure")
  148. | #{translate("no_errors_good_job")}
  149. .alert.alert-danger(ng-show="pdf.failure")
  150. strong #{translate("compile_error")}.
  151. span #{translate("generic_failed_compile_message")}.
  152. .alert.alert-danger(ng-show="pdf.failedCheck")
  153. strong #{translate("failed_compile_check")}.
  154. p
  155. p.text-center(ng-show="!check")
  156. a.text-info(
  157. href,
  158. ng-disabled="pdf.compiling",
  159. ng-click="recompile({try:true})"
  160. ) #{translate("failed_compile_check_try")}
  161. | &#32;#{translate("failed_compile_option_or")}&#32;
  162. a.text-info(
  163. href,
  164. ng-disabled="pdf.compiling",
  165. ng-click="recompile({force:true})"
  166. ) #{translate("failed_compile_check_ignore")}
  167. | .
  168. div(ng-repeat="entry in pdf.logEntries.all", ng-controller="PdfLogEntryController")
  169. .alert(
  170. ng-class="{\
  171. 'alert-danger': entry.level == 'error',\
  172. 'alert-warning': entry.level == 'warning',\
  173. 'alert-info': entry.level == 'typesetting'\
  174. }"
  175. ng-click="openInEditor(entry)"
  176. )
  177. span.line-no
  178. i.fa.fa-link(aria-hidden="true")
  179. | &nbsp;
  180. span(ng-show="entry.file") {{ entry.file }}
  181. span(ng-show="entry.line") , line {{ entry.line }}
  182. p.entry-message(ng-show="entry.message")
  183. | {{ entry.type }} {{ entry.message }}
  184. .card.card-hint(
  185. ng-if="entry.humanReadableHint"
  186. stop-propagation="click"
  187. )
  188. figure.card-hint-icon-container
  189. i.fa.fa-lightbulb-o(aria-hidden="true")
  190. p.card-hint-text(
  191. ng-show="entry.humanReadableHint",
  192. ng-bind-html="wikiEnabled ? entry.humanReadableHint : stripHTMLFromString(entry.humanReadableHint)")
  193. .card-hint-footer.clearfix
  194. .card-hint-ext-link(ng-if="wikiEnabled && entry.extraInfoURL")
  195. a(
  196. ng-href="{{ entry.extraInfoURL }}",
  197. ng-click="trackLogHintsLearnMore()"
  198. target="_blank"
  199. )
  200. i.fa.fa-external-link
  201. |&nbsp;#{translate("log_hint_extra_info")}
  202. p.entry-content(ng-show="entry.content") {{ entry.content.trim() }}
  203. div
  204. .files-dropdown-container
  205. a.btn.btn-default.btn-sm(
  206. href,
  207. tooltip=translate('clear_cached_files'),
  208. tooltip-placement="top",
  209. tooltip-append-to-body="true",
  210. ng-click="openClearCacheModal()"
  211. )
  212. i.fa.fa-trash-o
  213. | &nbsp;
  214. div.files-dropdown(
  215. ng-class="shouldDropUp ? 'dropup' : 'dropdown'"
  216. dropdown
  217. )
  218. a.btn.btn-default.btn-sm(
  219. href
  220. dropdown-toggle
  221. )
  222. | !{translate("other_logs_and_files")}
  223. span.caret
  224. ul.dropdown-menu.dropdown-menu-right
  225. li(ng-repeat="file in pdf.outputFiles")
  226. a(
  227. href="{{file.url}}"
  228. target="_blank"
  229. ) {{ file.name }}
  230. a.btn.btn-info.btn-sm(href, ng-click="toggleRawLog()")
  231. span(ng-show="!pdf.showRawLog") #{translate("view_raw_logs")}
  232. span(ng-show="pdf.showRawLog") #{translate("hide_raw_logs")}
  233. pre(ng-bind="pdf.rawLog", ng-show="pdf.showRawLog")
  234. // non-log views (pdf and errors)
  235. div(ng-show="!shouldShowLogs", ng-switch on="pdf.view")
  236. .pdf-uncompiled(ng-switch-when="uncompiled" ng-show="!pdf.compiling")
  237. | &nbsp;
  238. i.fa.fa-level-up.fa-flip-horizontal.fa-2x
  239. | &nbsp;&nbsp;#{translate('click_here_to_preview_pdf')}
  240. .pdf-viewer(ng-switch-when="pdf")
  241. div(
  242. pdfng
  243. ng-if="settings.pdfViewer == 'pdfjs'"
  244. pdf-src="pdf.url"
  245. key="{{ project_id }}"
  246. resize-on="layout:main:resize,layout:pdf:resize"
  247. highlights="pdf.highlights"
  248. position="pdf.position"
  249. dbl-click-callback="syncToCode"
  250. )
  251. iframe(
  252. ng-src="{{ pdf.url | trusted }}"
  253. ng-if="settings.pdfViewer == 'native'"
  254. )
  255. .pdf-validation-problems(ng-switch-when="validation-problems")
  256. .alert.alert-danger(ng-show="pdf.validation.duplicatePaths")
  257. strong #{translate("latex_error")}
  258. span #{translate("duplicate_paths_found")}
  259. .alert.alert-danger(ng-show="pdf.validation.sizeCheck")
  260. strong #{translate("project_too_large")}
  261. div #{translate("project_too_large_please_reduce")}
  262. div
  263. li(ng-repeat="entry in pdf.validation.sizeCheck.resources") {{ '/'+entry['path'] }} - {{entry['kbSize']}}kb
  264. .alert.alert-danger(ng-show="pdf.validation.conflictedPaths")
  265. div
  266. strong #{translate("conflicting_paths_found")}
  267. div !{translate("following_paths_conflict")}
  268. div
  269. li(ng-repeat="entry in pdf.validation.conflictedPaths") {{ '/'+entry['path'] }}
  270. .alert.alert-danger(ng-show="pdf.validation.mainFile")
  271. strong #{translate("main_file_not_found")}
  272. span #{translate("please_set_main_file")}
  273. .pdf-errors(ng-switch-when="errors")
  274. .alert.alert-danger(ng-show="pdf.error")
  275. strong #{translate("server_error")}
  276. span #{translate("somthing_went_wrong_compiling")}
  277. .alert.alert-danger(ng-show="pdf.renderingError")
  278. strong #{translate("pdf_rendering_error")}
  279. span #{translate("something_went_wrong_rendering_pdf")}
  280. .alert.alert-danger(ng-show="pdf.clsiMaintenance")
  281. strong #{translate("server_error")}
  282. span #{translate("clsi_maintenance")}
  283. .alert.alert-danger(ng-show="pdf.clsiUnavailable")
  284. strong #{translate("server_error")}
  285. span #{translate("clsi_unavailable")}
  286. .alert.alert-danger(ng-show="pdf.tooRecentlyCompiled")
  287. strong #{translate("server_error")}
  288. span #{translate("too_recently_compiled")}
  289. .alert.alert-danger(ng-show="pdf.compileTerminated")
  290. strong #{translate("terminated")}.
  291. span #{translate("compile_terminated_by_user")}
  292. .alert.alert-danger(ng-show="pdf.rateLimited")
  293. strong #{translate("pdf_compile_rate_limit_hit")}
  294. span #{translate("project_flagged_too_many_compiles")}
  295. .alert.alert-danger(ng-show="pdf.compileInProgress")
  296. strong #{translate("pdf_compile_in_progress_error")}.
  297. span #{translate("pdf_compile_try_again")}
  298. .alert.alert-danger(ng-show="pdf.timedout")
  299. p
  300. strong #{translate("timedout")}.
  301. span #{translate("proj_timed_out_reason")}
  302. p
  303. a.text-info(href="https://www.sharelatex.com/learn/Debugging_Compilation_timeout_errors", target="_blank")
  304. | #{translate("learn_how_to_make_documents_compile_quickly")}
  305. if settings.enableSubscriptions
  306. .alert.alert-success(ng-show="pdf.timedout && !hasPremiumCompile")
  307. p(ng-if="project.owner._id == user.id")
  308. strong #{translate("upgrade_for_longer_compiles")}
  309. p(ng-if="project.owner._id != user.id")
  310. strong #{translate("ask_proj_owner_to_upgrade_for_longer_compiles")}
  311. p #{translate("free_accounts_have_timeout_upgrade_to_increase")}
  312. p #{translate("plus_upgraded_accounts_receive")}:
  313. div
  314. ul.list-unstyled
  315. li
  316. i.fa.fa-check &nbsp;
  317. | #{translate("unlimited_projects")}
  318. li
  319. i.fa.fa-check &nbsp;
  320. | #{translate("collabs_per_proj", {collabcount:'Multiple'})}
  321. li
  322. i.fa.fa-check &nbsp;
  323. | #{translate("full_doc_history")}
  324. li
  325. i.fa.fa-check &nbsp;
  326. | #{translate("sync_to_dropbox")}
  327. li
  328. i.fa.fa-check &nbsp;
  329. | #{translate("sync_to_github")}
  330. li
  331. i.fa.fa-check &nbsp;
  332. |#{translate("compile_larger_projects")}
  333. p(ng-controller="FreeTrialModalController", ng-if="project.owner._id == user.id")
  334. a.btn.btn-success.row-spaced-small(
  335. href
  336. ng-class="buttonClass"
  337. ng-click="startFreeTrial('compile-timeout')"
  338. ) #{translate("start_free_trial")}
  339. .alert.alert-danger(ng-show="pdf.autoCompileDisabled")
  340. p
  341. strong #{translate("autocompile_disabled")}.
  342. span #{translate("autocompile_disabled_reason")}
  343. .alert.alert-danger(ng-show="pdf.projectTooLarge")
  344. strong #{translate("project_too_large")}
  345. span #{translate("project_too_large_please_reduce")}
  346. script(type='text/ng-template', id='clearCacheModalTemplate')
  347. .modal-header
  348. h3 #{translate("clear_cache")}?
  349. .modal-body
  350. p #{translate("clear_cache_explanation")}
  351. p #{translate("clear_cache_is_safe")}
  352. .alert.alert-danger(ng-if="state.error") #{translate("generic_something_went_wrong")}.
  353. .modal-footer
  354. button.btn.btn-default(
  355. ng-click="cancel()"
  356. ng-disabled="state.inflight"
  357. ) #{translate("cancel")}
  358. button.btn.btn-info(
  359. ng-click="clear()"
  360. ng-disabled="state.inflight"
  361. )
  362. span(ng-show="!state.inflight") #{translate("clear_cache")}
  363. span(ng-show="state.inflight") #{translate("clearing")}…