LabelsHandler.coffee 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. ProjectEntityHandler = require "../Project/ProjectEntityHandler"
  2. DocumentUpdaterHandler = require('../DocumentUpdater/DocumentUpdaterHandler')
  3. module.exports = LabelsHandler =
  4. labelCaptureRegex: () ->
  5. /\\label\{([^\}\n\\]{0,80})\}/g
  6. getAllLabelsForProject: (projectId, callback=(err, projectLabels)->) ->
  7. ProjectEntityHandler.getAllDocs projectId, (err, docs) ->
  8. if err?
  9. return callback(err)
  10. LabelsHandler.extractLabelsFromProjectDocs docs, (err, projectLabels) ->
  11. if err?
  12. return callback(err)
  13. callback(null, projectLabels)
  14. getLabelsForDoc: (projectId, docId, callback=(err, docLabels)->) ->
  15. # Flush doc first, because this action is often performed while
  16. # a document is being edited by the client. By contrast,
  17. # `getAllLabelsForProject` is called only when a project/editor is loaded
  18. DocumentUpdaterHandler.flushDocToMongo projectId, docId, (err) ->
  19. if err?
  20. return callback(err)
  21. ProjectEntityHandler.getDoc projectId, docId, (err, lines) ->
  22. if err?
  23. return callback(err)
  24. LabelsHandler.extractLabelsFromDoc lines, (err, docLabels) ->
  25. if err?
  26. return callback(err)
  27. callback(null, docLabels)
  28. extractLabelsFromDoc: (lines, callback=(err, docLabels)->) ->
  29. docLabels = []
  30. for line in lines
  31. re = LabelsHandler.labelCaptureRegex()
  32. while (labelMatch = re.exec(line))
  33. if labelMatch[1]
  34. docLabels.push(labelMatch[1])
  35. callback(null, docLabels)
  36. extractLabelsFromProjectDocs: (docs, callback=(err, projectLabels)->) ->
  37. projectLabels = {} # docId => List[Label]
  38. for _docPath, doc of docs
  39. docLabels = []
  40. for line in doc.lines
  41. re = LabelsHandler.labelCaptureRegex()
  42. while (labelMatch = re.exec(line))
  43. if labelMatch[1]
  44. docLabels.push(labelMatch[1])
  45. projectLabels[doc._id] = docLabels
  46. callback(null, projectLabels)