HTML.spec.js 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. const { HTMLParser } = require("../../gramjs/extensions/HTML");
  2. const types = require("../../gramjs/tl/types");
  3. describe("HTMLParser", () => {
  4. test("it should construct a new HTMLParser", () => {
  5. const parser = new HTMLParser("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 HTMLParser("Hello <strong>world</strong>");
  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 HTMLParser("Hello <em>world</em>");
  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 HTMLParser("Hello <code>world</code>");
  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 HTMLParser("Hello <pre>world</pre>");
  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 HTMLParser("Hello <del>world</del>");
  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 HTMLParser(
  47. 'Hello <a href="https://hello.world">world</a>'
  48. );
  49. const [text, entities] = parser.parse();
  50. expect(text).toEqual("Hello world");
  51. expect(entities.length).toEqual(1);
  52. expect(entities[0]).toBeInstanceOf(types.MessageEntityTextUrl);
  53. expect(entities[0].url).toEqual("https://hello.world");
  54. });
  55. test("it should parse nested entities", () => {
  56. const parser = new HTMLParser("Hello <strong><em>world</em></strong>");
  57. const [text, entities] = parser.parse();
  58. expect(text).toEqual("Hello world");
  59. expect(entities.length).toEqual(2);
  60. expect(entities[0]).toBeInstanceOf(types.MessageEntityItalic);
  61. expect(entities[1]).toBeInstanceOf(types.MessageEntityBold);
  62. });
  63. test("it should parse multiple entities", () => {
  64. const parser = new HTMLParser("<em>Hello</em> <strong>world</strong>");
  65. const [text, entities] = parser.parse();
  66. expect(text).toEqual("Hello world");
  67. expect(entities.length).toEqual(2);
  68. expect(entities[0]).toBeInstanceOf(types.MessageEntityItalic);
  69. expect(entities[1]).toBeInstanceOf(types.MessageEntityBold);
  70. });
  71. });
  72. describe(".unparse", () => {
  73. test("it should create a markdown string from raw text and entities", () => {
  74. const unparsed =
  75. '<strong>hello</strong> <em>hello</em> <del>hello</del> <code>hello</code> <pre>hello</pre> <a href="https://hello.world">hello</a>';
  76. const strippedText = "hello hello hello hello hello hello";
  77. const rawEntities = [
  78. new types.MessageEntityBold({ offset: 0, length: 5 }),
  79. new types.MessageEntityItalic({ offset: 6, length: 5 }),
  80. new types.MessageEntityStrike({ offset: 12, length: 5 }),
  81. new types.MessageEntityCode({ offset: 18, length: 5 }),
  82. new types.MessageEntityPre({ offset: 24, length: 5 }),
  83. new types.MessageEntityTextUrl({
  84. offset: 30,
  85. length: 5,
  86. url: "https://hello.world",
  87. }),
  88. ];
  89. const text = HTMLParser.unparse(strippedText, rawEntities);
  90. expect(text).toEqual(unparsed);
  91. });
  92. test("it should unparse nested entities", () => {
  93. const unparsed = "<strong><em>Hello world</em></strong>";
  94. const strippedText = "Hello world";
  95. const rawEntities = [
  96. new types.MessageEntityBold({ offset: 0, length: 11 }),
  97. new types.MessageEntityItalic({ offset: 0, length: 11 }),
  98. ];
  99. const text = HTMLParser.unparse(strippedText, rawEntities);
  100. expect(text).toEqual(unparsed);
  101. });
  102. });
  103. });