MetadataHandler.coffee 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. ProjectEntityHandler = require "../Project/ProjectEntityHandler"
  2. DocumentUpdaterHandler = require '../DocumentUpdater/DocumentUpdaterHandler'
  3. module.exports = MetadataHandler =
  4. labelCaptureRegex: () ->
  5. /\\label\{([^\}\n\\]{0,80})\}/g
  6. packageCaptureRegex: () ->
  7. /\\usepackage(?:\[((?:.|\n)*?)])?\s*?{((?:.|\n)*?)}/gm
  8. getMetadataForProject: (projectId, callback=(err, projectMetadata)->) ->
  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. projectMetadata = MetadataHandler.extractMetadataFromProjectDocs docs
  16. callback(null, projectMetadata)
  17. getMetadataForDoc: (projectId, docId, callback=(err, docMetadata)->) ->
  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. docMetadata = MetadataHandler.extractMetadataFromDoc lines
  25. callback(null, docMetadata)
  26. extractMetadataFromProjectDocs: (projectDocs) ->
  27. projectMetadata = {}
  28. for _path, doc of projectDocs
  29. projectMetadata[doc._id] = MetadataHandler.extractMetadataFromDoc doc.lines
  30. return projectMetadata
  31. extractMetadataFromDoc: (lines) ->
  32. docMetadata = {labels: [] packages: []}
  33. label_re = MetadataHandler.labelCaptureRegex()
  34. package_re = MetadataHandler.packageCaptureRegex()
  35. for line in lines # FIXME: usepackage can run over multiple lines
  36. while labelMatch = label_re.exec line
  37. if labelMatch[1]
  38. docMetadata.labels.push labelMatch[1]
  39. while packageMatch = package_re.exec line
  40. if packageMatch[2]
  41. docMetadata.packages.push packageMatch[2]
  42. return docMetadata