emphasis.js 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. 'use strict';
  2. var trim = require('trim');
  3. var word = require('is-word-character');
  4. var whitespace = require('is-whitespace-character');
  5. var locate = require('../locate/emphasis');
  6. module.exports = emphasis;
  7. emphasis.locator = locate;
  8. var C_ASTERISK = '*';
  9. var C_UNDERSCORE = '_';
  10. function emphasis(eat, value, silent) {
  11. var self = this;
  12. var index = 0;
  13. var character = value.charAt(index);
  14. var now;
  15. var pedantic;
  16. var marker;
  17. var queue;
  18. var subvalue;
  19. var length;
  20. var prev;
  21. if (character !== C_ASTERISK && character !== C_UNDERSCORE) {
  22. return;
  23. }
  24. pedantic = self.options.pedantic;
  25. subvalue = character;
  26. marker = character;
  27. length = value.length;
  28. index++;
  29. queue = '';
  30. character = '';
  31. if (pedantic && whitespace(value.charAt(index))) {
  32. return;
  33. }
  34. while (index < length) {
  35. prev = character;
  36. character = value.charAt(index);
  37. if (character === marker && (!pedantic || !whitespace(prev))) {
  38. character = value.charAt(++index);
  39. if (character !== marker) {
  40. if (!trim(queue) || prev === marker) {
  41. return;
  42. }
  43. if (!pedantic && marker === C_UNDERSCORE && word(character)) {
  44. queue += marker;
  45. continue;
  46. }
  47. /* istanbul ignore if - never used (yet) */
  48. if (silent) {
  49. return true;
  50. }
  51. now = eat.now();
  52. now.column++;
  53. now.offset++;
  54. return eat(subvalue + queue + marker)({
  55. type: 'emphasis',
  56. children: self.tokenizeInline(queue, now)
  57. });
  58. }
  59. queue += marker;
  60. }
  61. if (!pedantic && character === '\\') {
  62. queue += character;
  63. character = value.charAt(++index);
  64. }
  65. queue += character;
  66. index++;
  67. }
  68. }