blockquote.js 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. 'use strict'
  2. var trim = require('trim')
  3. var interrupt = require('../util/interrupt')
  4. module.exports = blockquote
  5. var lineFeed = '\n'
  6. var tab = '\t'
  7. var space = ' '
  8. var greaterThan = '>'
  9. function blockquote(eat, value, silent) {
  10. var self = this
  11. var offsets = self.offset
  12. var tokenizers = self.blockTokenizers
  13. var interruptors = self.interruptBlockquote
  14. var now = eat.now()
  15. var currentLine = now.line
  16. var length = value.length
  17. var values = []
  18. var contents = []
  19. var indents = []
  20. var add
  21. var index = 0
  22. var character
  23. var rest
  24. var nextIndex
  25. var content
  26. var line
  27. var startIndex
  28. var prefixed
  29. var exit
  30. while (index < length) {
  31. character = value.charAt(index)
  32. if (character !== space && character !== tab) {
  33. break
  34. }
  35. index++
  36. }
  37. if (value.charAt(index) !== greaterThan) {
  38. return
  39. }
  40. if (silent) {
  41. return true
  42. }
  43. index = 0
  44. while (index < length) {
  45. nextIndex = value.indexOf(lineFeed, index)
  46. startIndex = index
  47. prefixed = false
  48. if (nextIndex === -1) {
  49. nextIndex = length
  50. }
  51. while (index < length) {
  52. character = value.charAt(index)
  53. if (character !== space && character !== tab) {
  54. break
  55. }
  56. index++
  57. }
  58. if (value.charAt(index) === greaterThan) {
  59. index++
  60. prefixed = true
  61. if (value.charAt(index) === space) {
  62. index++
  63. }
  64. } else {
  65. index = startIndex
  66. }
  67. content = value.slice(index, nextIndex)
  68. if (!prefixed && !trim(content)) {
  69. index = startIndex
  70. break
  71. }
  72. if (!prefixed) {
  73. rest = value.slice(index)
  74. // Check if the following code contains a possible block.
  75. if (interrupt(interruptors, tokenizers, self, [eat, rest, true])) {
  76. break
  77. }
  78. }
  79. line = startIndex === index ? content : value.slice(startIndex, nextIndex)
  80. indents.push(index - startIndex)
  81. values.push(line)
  82. contents.push(content)
  83. index = nextIndex + 1
  84. }
  85. index = -1
  86. length = indents.length
  87. add = eat(values.join(lineFeed))
  88. while (++index < length) {
  89. offsets[currentLine] = (offsets[currentLine] || 0) + indents[index]
  90. currentLine++
  91. }
  92. exit = self.enterBlock()
  93. contents = self.tokenizeBlock(contents.join(lineFeed), now)
  94. exit()
  95. return add({type: 'blockquote', children: contents})
  96. }