thematic-break.js 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. 'use strict'
  2. module.exports = thematicBreak
  3. var tab = '\t'
  4. var lineFeed = '\n'
  5. var space = ' '
  6. var asterisk = '*'
  7. var dash = '-'
  8. var underscore = '_'
  9. var maxCount = 3
  10. function thematicBreak(eat, value, silent) {
  11. var index = -1
  12. var length = value.length + 1
  13. var subvalue = ''
  14. var character
  15. var marker
  16. var markerCount
  17. var queue
  18. while (++index < length) {
  19. character = value.charAt(index)
  20. if (character !== tab && character !== space) {
  21. break
  22. }
  23. subvalue += character
  24. }
  25. if (
  26. character !== asterisk &&
  27. character !== dash &&
  28. character !== underscore
  29. ) {
  30. return
  31. }
  32. marker = character
  33. subvalue += character
  34. markerCount = 1
  35. queue = ''
  36. while (++index < length) {
  37. character = value.charAt(index)
  38. if (character === marker) {
  39. markerCount++
  40. subvalue += queue + marker
  41. queue = ''
  42. } else if (character === space) {
  43. queue += character
  44. } else if (
  45. markerCount >= maxCount &&
  46. (!character || character === lineFeed)
  47. ) {
  48. subvalue += queue
  49. if (silent) {
  50. return true
  51. }
  52. return eat(subvalue)({type: 'thematicBreak'})
  53. } else {
  54. return
  55. }
  56. }
  57. }