state.js 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. 'use strict'
  2. var directiveParser = require('./directive-parser.js')
  3. module.exports = {
  4. stack: [],
  5. pop: function (current) {
  6. var index = this.stack.indexOf(current)
  7. if (index !== -1) {
  8. this.stack.splice(index, 1)
  9. }
  10. if (!current.preserve) {
  11. current.source.remove()
  12. }
  13. },
  14. parse: function (node, lazyResult, callback) {
  15. var current
  16. var metadata = directiveParser(node)
  17. if (metadata) {
  18. if (!metadata.begin && metadata.end) {
  19. this.walk(function (item) {
  20. if (metadata.name === item.metadata.name) {
  21. this.pop(item)
  22. current = {'metadata': metadata, 'directive': item.directive, 'source': node, 'preserve': item.preserve}
  23. return false
  24. }
  25. }.bind(this))
  26. } else {
  27. current = {'metadata': metadata, 'directive': null, 'source': node, 'preserve': null}
  28. }
  29. if (current === undefined) {
  30. lazyResult.warn('found end "' + metadata.name + '" without a matching begin.', {node: node})
  31. } else if (callback(current)) {
  32. this.stack.push(current)
  33. } else if (!current.preserve) {
  34. current.source.remove()
  35. }
  36. }
  37. },
  38. walk: function (callback) {
  39. var len = this.stack.length
  40. while (--len > -1) {
  41. if (!callback(this.stack[len])) {
  42. break
  43. }
  44. }
  45. }
  46. }