emphasis.js 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  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 asterisk = '*'
  9. var underscore = '_'
  10. var backslash = '\\'
  11. function emphasis(eat, value, silent) {
  12. var self = this
  13. var index = 0
  14. var character = value.charAt(index)
  15. var now
  16. var pedantic
  17. var marker
  18. var queue
  19. var subvalue
  20. var length
  21. var previous
  22. if (character !== asterisk && character !== underscore) {
  23. return
  24. }
  25. pedantic = self.options.pedantic
  26. subvalue = character
  27. marker = character
  28. length = value.length
  29. index++
  30. queue = ''
  31. character = ''
  32. if (pedantic && whitespace(value.charAt(index))) {
  33. return
  34. }
  35. while (index < length) {
  36. previous = character
  37. character = value.charAt(index)
  38. if (character === marker && (!pedantic || !whitespace(previous))) {
  39. character = value.charAt(++index)
  40. if (character !== marker) {
  41. if (!trim(queue) || previous === marker) {
  42. return
  43. }
  44. if (!pedantic && marker === underscore && word(character)) {
  45. queue += marker
  46. continue
  47. }
  48. /* istanbul ignore if - never used (yet) */
  49. if (silent) {
  50. return true
  51. }
  52. now = eat.now()
  53. now.column++
  54. now.offset++
  55. return eat(subvalue + queue + marker)({
  56. type: 'emphasis',
  57. children: self.tokenizeInline(queue, now)
  58. })
  59. }
  60. queue += marker
  61. }
  62. if (!pedantic && character === backslash) {
  63. queue += character
  64. character = value.charAt(++index)
  65. }
  66. queue += character
  67. index++
  68. }
  69. }