MetaHandler.coffee 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. ProjectEntityHandler = require "../Project/ProjectEntityHandler"
  2. DocumentUpdaterHandler = require '../DocumentUpdater/DocumentUpdaterHandler'
  3. packageMapping = require "./packageMapping"
  4. module.exports = MetaHandler =
  5. labelRegex: () ->
  6. /\\label{(.{0,80}?)}/g
  7. usepackageRegex: () ->
  8. /^\\usepackage(?:\[.{0,80}?])?{(.{0,80}?)}/g
  9. ReqPackageRegex: () ->
  10. /^\\RequirePackage(?:\[.{0,80}?])?{(.{0,80}?)}/g
  11. getAllMetaForProject: (projectId, callback=(err, projectMeta)->) ->
  12. DocumentUpdaterHandler.flushProjectToMongo projectId, (err) ->
  13. if err?
  14. return callback err
  15. ProjectEntityHandler.getAllDocs projectId, (err, docs) ->
  16. if err?
  17. return callback err
  18. projectMeta = MetaHandler.extractMetaFromProjectDocs docs
  19. callback null, projectMeta
  20. getMetaForDoc: (projectId, docId, callback=(err, docMeta)->) ->
  21. DocumentUpdaterHandler.flushDocToMongo projectId, docId, (err) ->
  22. if err?
  23. return callback err
  24. ProjectEntityHandler.getDoc projectId, docId, (err, lines) ->
  25. if err?
  26. return callback err
  27. docMeta = MetaHandler.extractMetaFromDoc lines
  28. callback null, docMeta
  29. extractMetaFromDoc: (lines) ->
  30. docMeta = {labels: [], packages: {}}
  31. packages = []
  32. label_re = MetaHandler.labelRegex()
  33. package_re = MetaHandler.usepackageRegex()
  34. req_package_re = MetaHandler.ReqPackageRegex()
  35. for line in lines
  36. while labelMatch = label_re.exec line
  37. if label = labelMatch[1]
  38. docMeta.labels.push label
  39. while packageMatch = package_re.exec line
  40. if messy = packageMatch[1]
  41. for pkg in messy.split ','
  42. if clean = pkg.trim()
  43. packages.push clean
  44. while packageMatch = req_package_re.exec line
  45. if messy = packageMatch[1]
  46. for pkg in messy.split ','
  47. if clean = pkg.trim()
  48. packages.push clean
  49. for pkg in packages
  50. if packageMapping[pkg]?
  51. docMeta.packages[pkg] = packageMapping[pkg]
  52. return docMeta
  53. extractMetaFromProjectDocs: (projectDocs) ->
  54. projectMeta = {}
  55. for _path, doc of projectDocs
  56. projectMeta[doc._id] = MetaHandler.extractMetaFromDoc doc.lines
  57. return projectMeta