heading-setext.js 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. 'use strict'
  2. module.exports = setextHeading
  3. var lineFeed = '\n'
  4. var tab = '\t'
  5. var space = ' '
  6. var equalsTo = '='
  7. var dash = '-'
  8. var maxIndent = 3
  9. var equalsToDepth = 1
  10. var dashDepth = 2
  11. function setextHeading(eat, value, silent) {
  12. var self = this
  13. var now = eat.now()
  14. var length = value.length
  15. var index = -1
  16. var subvalue = ''
  17. var content
  18. var queue
  19. var character
  20. var marker
  21. var depth
  22. // Eat initial indentation.
  23. while (++index < length) {
  24. character = value.charAt(index)
  25. if (character !== space || index >= maxIndent) {
  26. index--
  27. break
  28. }
  29. subvalue += character
  30. }
  31. // Eat content.
  32. content = ''
  33. queue = ''
  34. while (++index < length) {
  35. character = value.charAt(index)
  36. if (character === lineFeed) {
  37. index--
  38. break
  39. }
  40. if (character === space || character === tab) {
  41. queue += character
  42. } else {
  43. content += queue + character
  44. queue = ''
  45. }
  46. }
  47. now.column += subvalue.length
  48. now.offset += subvalue.length
  49. subvalue += content + queue
  50. // Ensure the content is followed by a newline and a valid marker.
  51. character = value.charAt(++index)
  52. marker = value.charAt(++index)
  53. if (character !== lineFeed || (marker !== equalsTo && marker !== dash)) {
  54. return
  55. }
  56. subvalue += character
  57. // Eat Setext-line.
  58. queue = marker
  59. depth = marker === equalsTo ? equalsToDepth : dashDepth
  60. while (++index < length) {
  61. character = value.charAt(index)
  62. if (character !== marker) {
  63. if (character !== lineFeed) {
  64. return
  65. }
  66. index--
  67. break
  68. }
  69. queue += character
  70. }
  71. if (silent) {
  72. return true
  73. }
  74. return eat(subvalue + queue)({
  75. type: 'heading',
  76. depth: depth,
  77. children: self.tokenizeInline(content, now)
  78. })
  79. }