code-inline.js 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. 'use strict';
  2. var whitespace = require('is-whitespace-character');
  3. var locate = require('../locate/code-inline');
  4. module.exports = inlineCode;
  5. inlineCode.locator = locate;
  6. var C_TICK = '`';
  7. /* Tokenise inline code. */
  8. function inlineCode(eat, value, silent) {
  9. var length = value.length;
  10. var index = 0;
  11. var queue = '';
  12. var tickQueue = '';
  13. var contentQueue;
  14. var subqueue;
  15. var count;
  16. var openingCount;
  17. var subvalue;
  18. var character;
  19. var found;
  20. var next;
  21. while (index < length) {
  22. if (value.charAt(index) !== C_TICK) {
  23. break;
  24. }
  25. queue += C_TICK;
  26. index++;
  27. }
  28. if (!queue) {
  29. return;
  30. }
  31. subvalue = queue;
  32. openingCount = index;
  33. queue = '';
  34. next = value.charAt(index);
  35. count = 0;
  36. while (index < length) {
  37. character = next;
  38. next = value.charAt(index + 1);
  39. if (character === C_TICK) {
  40. count++;
  41. tickQueue += character;
  42. } else {
  43. count = 0;
  44. queue += character;
  45. }
  46. if (count && next !== C_TICK) {
  47. if (count === openingCount) {
  48. subvalue += queue + tickQueue;
  49. found = true;
  50. break;
  51. }
  52. queue += tickQueue;
  53. tickQueue = '';
  54. }
  55. index++;
  56. }
  57. if (!found) {
  58. if (openingCount % 2 !== 0) {
  59. return;
  60. }
  61. queue = '';
  62. }
  63. /* istanbul ignore if - never used (yet) */
  64. if (silent) {
  65. return true;
  66. }
  67. contentQueue = '';
  68. subqueue = '';
  69. length = queue.length;
  70. index = -1;
  71. while (++index < length) {
  72. character = queue.charAt(index);
  73. if (whitespace(character)) {
  74. subqueue += character;
  75. continue;
  76. }
  77. if (subqueue) {
  78. if (contentQueue) {
  79. contentQueue += subqueue;
  80. }
  81. subqueue = '';
  82. }
  83. contentQueue += character;
  84. }
  85. return eat(subvalue)({
  86. type: 'inlineCode',
  87. value: contentQueue
  88. });
  89. }