MetaHandler.coffee 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. ProjectEntityHandler = require "../Project/ProjectEntityHandler"
  2. DocumentUpdaterHandler = require('../DocumentUpdater/DocumentUpdaterHandler')
  3. module.exports = MetaHandler =
  4. labelCaptureRegex: () ->
  5. /\\label\{([^\}\n\\]{0,80})\}/g
  6. packageCaptureRegex: () ->
  7. /^\\usepackage(?:\[((?:.|\n)*?)])?\s*?{((?:.|\n)*?)}/gm
  8. getAllMetaForProject: (projectId, callback=(err, projectMeta)->) ->
  9. DocumentUpdaterHandler.flushProjectToMongo projectId, (err) ->
  10. if err?
  11. return callback err
  12. ProjectEntityHandler.getAllDocs projectId, (err, docs) ->
  13. if err?
  14. return callback err
  15. projectMeta = MetaHandler.extractMetaFromProjectDocs docs
  16. callback null, projectMeta
  17. getMetaForDoc: (projectId, docId, callback=(err, docMeta)->) ->
  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. docMeta = MetaHandler.extractMetaFromDoc lines
  25. callback null, docMeta
  26. extractMetaFromDoc: (lines) ->
  27. docMeta = {labels: [], packages: []}
  28. label_re = MetaHandler.labelCaptureRegex()
  29. package_re = MetaHandler.packageCaptureRegex()
  30. for line in lines
  31. while labelMatch = label_re.exec line
  32. if labelMatch[1]
  33. docMeta.labels.push labelMatch[1]
  34. while packageMatch = package_re.exec line
  35. if packageMatch[2]
  36. for pkg in packageMatch[2].split ','
  37. if pkg.trim()
  38. docMeta.packages.push pkg.trim()
  39. return docMeta
  40. extractMetaFromProjectDocs: (projectDocs) ->
  41. projectMeta = {}
  42. for _path, doc of projectDocs
  43. projectMeta[doc._id] = MetaHandler.extractMetaFromDoc doc.lines
  44. return projectMeta