heading-atx.js 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. 'use strict'
  2. module.exports = atxHeading
  3. var lineFeed = '\n'
  4. var tab = '\t'
  5. var space = ' '
  6. var numberSign = '#'
  7. var maxFenceCount = 6
  8. function atxHeading(eat, value, silent) {
  9. var self = this
  10. var pedantic = self.options.pedantic
  11. var length = value.length + 1
  12. var index = -1
  13. var now = eat.now()
  14. var subvalue = ''
  15. var content = ''
  16. var character
  17. var queue
  18. var depth
  19. // Eat initial spacing.
  20. while (++index < length) {
  21. character = value.charAt(index)
  22. if (character !== space && character !== tab) {
  23. index--
  24. break
  25. }
  26. subvalue += character
  27. }
  28. // Eat hashes.
  29. depth = 0
  30. while (++index <= length) {
  31. character = value.charAt(index)
  32. if (character !== numberSign) {
  33. index--
  34. break
  35. }
  36. subvalue += character
  37. depth++
  38. }
  39. if (depth > maxFenceCount) {
  40. return
  41. }
  42. if (!depth || (!pedantic && value.charAt(index + 1) === numberSign)) {
  43. return
  44. }
  45. length = value.length + 1
  46. // Eat intermediate white-space.
  47. queue = ''
  48. while (++index < length) {
  49. character = value.charAt(index)
  50. if (character !== space && character !== tab) {
  51. index--
  52. break
  53. }
  54. queue += character
  55. }
  56. // Exit when not in pedantic mode without spacing.
  57. if (!pedantic && queue.length === 0 && character && character !== lineFeed) {
  58. return
  59. }
  60. if (silent) {
  61. return true
  62. }
  63. // Eat content.
  64. subvalue += queue
  65. queue = ''
  66. content = ''
  67. while (++index < length) {
  68. character = value.charAt(index)
  69. if (!character || character === lineFeed) {
  70. break
  71. }
  72. if (character !== space && character !== tab && character !== numberSign) {
  73. content += queue + character
  74. queue = ''
  75. continue
  76. }
  77. while (character === space || character === tab) {
  78. queue += character
  79. character = value.charAt(++index)
  80. }
  81. // `#` without a queue is part of the content.
  82. if (!pedantic && content && !queue && character === numberSign) {
  83. content += character
  84. continue
  85. }
  86. while (character === numberSign) {
  87. queue += character
  88. character = value.charAt(++index)
  89. }
  90. while (character === space || character === tab) {
  91. queue += character
  92. character = value.charAt(++index)
  93. }
  94. index--
  95. }
  96. now.column += subvalue.length
  97. now.offset += subvalue.length
  98. subvalue += content + queue
  99. return eat(subvalue)({
  100. type: 'heading',
  101. depth: depth,
  102. children: self.tokenizeInline(content, now)
  103. })
  104. }