Markdown.spec.js 4.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. const { MarkdownParser } = require('../../gramjs/extensions/Markdown')
  2. const types = require('../../gramjs/tl/types')
  3. describe('MarkdownParser', () => {
  4. test('it should construct a new MarkdownParser', () => {
  5. const parser = new MarkdownParser('Hello world')
  6. expect(parser.text).toEqual('')
  7. expect(parser.entities).toEqual([])
  8. })
  9. describe('.parse', () => {
  10. test('it should parse bold entities', () => {
  11. const parser = new MarkdownParser('Hello **world**')
  12. const [text, entities] = parser.parse()
  13. expect(text).toEqual('Hello world')
  14. expect(entities.length).toEqual(1)
  15. expect(entities[0]).toBeInstanceOf(types.MessageEntityBold)
  16. })
  17. test('it should parse italic entities', () => {
  18. const parser = new MarkdownParser('Hello __world__')
  19. const [text, entities] = parser.parse()
  20. expect(text).toEqual('Hello world')
  21. expect(entities.length).toEqual(1)
  22. expect(entities[0]).toBeInstanceOf(types.MessageEntityItalic)
  23. })
  24. test('it should parse code entities', () => {
  25. const parser = new MarkdownParser('Hello `world`')
  26. const [text, entities] = parser.parse()
  27. expect(text).toEqual('Hello world')
  28. expect(entities.length).toEqual(1)
  29. expect(entities[0]).toBeInstanceOf(types.MessageEntityCode)
  30. })
  31. test('it should parse pre entities', () => {
  32. const parser = new MarkdownParser('Hello ```world```')
  33. const [text, entities] = parser.parse()
  34. expect(text).toEqual('Hello world')
  35. expect(entities.length).toEqual(1)
  36. expect(entities[0]).toBeInstanceOf(types.MessageEntityPre)
  37. })
  38. test('it should parse strike entities', () => {
  39. const parser = new MarkdownParser('Hello ~~world~~')
  40. const [text, entities] = parser.parse()
  41. expect(text).toEqual('Hello world')
  42. expect(entities.length).toEqual(1)
  43. expect(entities[0]).toBeInstanceOf(types.MessageEntityStrike)
  44. })
  45. test('it should parse link entities', () => {
  46. const parser = new MarkdownParser('Hello [world](https://hello.world)')
  47. const [text, entities] = parser.parse()
  48. expect(text).toEqual('Hello world')
  49. expect(entities.length).toEqual(1)
  50. expect(entities[0]).toBeInstanceOf(types.MessageEntityTextUrl)
  51. expect(entities[0].url).toEqual('https://hello.world')
  52. })
  53. test('it should not parse nested entities', () => {
  54. const parser = new MarkdownParser('Hello **__world__**')
  55. const [text, entities] = parser.parse()
  56. expect(text).toEqual('Hello __world__')
  57. expect(entities.length).toEqual(1)
  58. expect(entities[0]).toBeInstanceOf(types.MessageEntityBold)
  59. })
  60. test('it should parse multiple entities', () => {
  61. const parser = new MarkdownParser('__Hello__ **world**')
  62. const [text, entities] = parser.parse()
  63. expect(text).toEqual('Hello world')
  64. expect(entities.length).toEqual(2)
  65. expect(entities[0]).toBeInstanceOf(types.MessageEntityItalic)
  66. expect(entities[1]).toBeInstanceOf(types.MessageEntityBold)
  67. })
  68. })
  69. describe('.unparse', () => {
  70. test('it should create a markdown string from raw text and entities', () => {
  71. const unparsed = '**hello** __hello__ ~~hello~~ `hello` ```hello``` [hello](https://hello.world)'
  72. const strippedText = 'hello hello hello hello hello hello'
  73. const rawEntities = [
  74. new types.MessageEntityBold({ offset: 0, length: 5 }),
  75. new types.MessageEntityItalic({ offset: 6, length: 5 }),
  76. new types.MessageEntityStrike({ offset: 12, length: 5 }),
  77. new types.MessageEntityCode({ offset: 18, length: 5 }),
  78. new types.MessageEntityPre({ offset: 24, length: 5 }),
  79. new types.MessageEntityTextUrl({ offset: 30, length: 5, url: 'https://hello.world' }),
  80. ]
  81. const text = MarkdownParser.unparse(strippedText, rawEntities)
  82. expect(text).toEqual(unparsed)
  83. })
  84. })
  85. })