WikiController.coffee 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  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. WikiController._renderPage(pageData, contents, res)
  37. else
  38. WikiController._getPageContent page, (error, pageData) ->
  39. return next(error) if error?
  40. WikiController._renderPage(pageData, contents, res)
  41. _getPageContent: (page, callback = (error, data = { content: "", title: "" }) ->) ->
  42. request {
  43. url: "#{settings.apis.wiki.url}/learn-scripts/api.php"
  44. qs: {
  45. page: decodeURI(page)
  46. action: "parse"
  47. format: "json"
  48. }
  49. }, (err, response, data)->
  50. return callback(err) if err?
  51. try
  52. data = JSON.parse(data)
  53. catch err
  54. logger.err err:err, data:data, "error parsing data from wiki"
  55. result =
  56. content: data?.parse?.text?['*']
  57. title: data?.parse?.title
  58. callback null, result
  59. _renderPage: (page, contents, res)->
  60. if page.title == "Main Page"
  61. title = "Documentation"
  62. else
  63. title = page.title
  64. res.render "wiki/page", {
  65. page: page
  66. contents: contents
  67. title: title
  68. }