thematic-break.js 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. 'use strict';
  2. module.exports = thematicBreak;
  3. var C_NEWLINE = '\n';
  4. var C_TAB = '\t';
  5. var C_SPACE = ' ';
  6. var C_ASTERISK = '*';
  7. var C_UNDERSCORE = '_';
  8. var C_DASH = '-';
  9. var THEMATIC_BREAK_MARKER_COUNT = 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 !== C_TAB && character !== C_SPACE) {
  21. break;
  22. }
  23. subvalue += character;
  24. }
  25. if (
  26. character !== C_ASTERISK &&
  27. character !== C_DASH &&
  28. character !== C_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 === C_SPACE) {
  43. queue += character;
  44. } else if (
  45. markerCount >= THEMATIC_BREAK_MARKER_COUNT &&
  46. (!character || character === C_NEWLINE)
  47. ) {
  48. subvalue += queue;
  49. if (silent) {
  50. return true;
  51. }
  52. return eat(subvalue)({type: 'thematicBreak'});
  53. } else {
  54. return;
  55. }
  56. }
  57. }