WikiController.coffee 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. request = require("request")
  2. settings = require("settings-sharelatex")
  3. logger = require("logger-sharelatex")
  4. ErrorController = require "../Errors/ErrorController"
  5. _ = require("underscore")
  6. AuthenticationController = require("../Authentication/AuthenticationController")
  7. async = require("async")
  8. other_lngs = ["es"]
  9. module.exports = WikiController =
  10. _checkIfLoginIsNeeded: (req, res, next)->
  11. if settings.apis.wiki.requireLogin
  12. AuthenticationController.requireLogin()(req, res, next)
  13. else
  14. next()
  15. getPage: (req, res, next) ->
  16. WikiController._checkIfLoginIsNeeded req, res, ->
  17. page = req.url.replace(/^\/learn/, "").replace(/^\//, "")
  18. if page == ""
  19. page = "Main_Page"
  20. logger.log page: page, "getting page from wiki"
  21. if _.include(other_lngs, req.lng)
  22. lngPage = "#{page}_#{req.lng}"
  23. else
  24. lngPage = page
  25. jobs =
  26. contents: (cb)->
  27. WikiController._getPageContent "Contents", cb
  28. pageData: (cb)->
  29. WikiController._getPageContent lngPage, cb
  30. async.parallel jobs, (error, results)->
  31. return next(error) if error?
  32. {pageData, contents} = results
  33. if pageData.content?.length > 280
  34. if _.include(other_lngs, req.lng)
  35. pageData.title = pageData.title.slice(0, pageData.title.length - (req.lng.length+1) )
  36. if pageData.title?.toLowerCase()?.indexOf("kb") == 0
  37. pageData.title = pageData.title.slice(3)
  38. if pageData.title?.toLowerCase()?.indexOf("errors") == 0
  39. pageData.title = pageData.title.slice(7)
  40. WikiController._renderPage(pageData, contents, res)
  41. else
  42. WikiController._getPageContent page, (error, pageData) ->
  43. return next(error) if error?
  44. WikiController._renderPage(pageData, contents, res)
  45. _getPageContent: (page, callback = (error, data = { content: "", title: "" }) ->) ->
  46. request {
  47. url: "#{settings.apis.wiki.url}/learn-scripts/api.php"
  48. qs: {
  49. page: decodeURI(page)
  50. action: "parse"
  51. format: "json"
  52. }
  53. }, (err, response, data)->
  54. return callback(err) if err?
  55. try
  56. data = JSON.parse(data)
  57. catch err
  58. logger.err err:err, data:data, "error parsing data from wiki"
  59. result =
  60. content: data?.parse?.text?['*']
  61. title: data?.parse?.title
  62. callback null, result
  63. _renderPage: (page, contents, res)->
  64. if page.title == "Main Page"
  65. title = "Documentation"
  66. else
  67. title = page.title
  68. res.render "wiki/page", {
  69. page: page
  70. contents: contents
  71. title: title
  72. }