HTML.spec.ts 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. import { HTMLParser } from "../../gramjs/extensions/html";
  2. import { Api as types } from "../../gramjs/tl/api";
  3. describe("HTMLParser", () => {
  4. describe(".parse", () => {
  5. test("it should parse bold entities", () => {
  6. const [text, entities] = HTMLParser.parse("Hello <strong>world</strong>");
  7. expect(text).toEqual("Hello world");
  8. expect(entities.length).toEqual(1);
  9. expect(entities[0]).toBeInstanceOf(types.MessageEntityBold);
  10. });
  11. test("it should parse italic entities", () => {
  12. const [text, entities] = HTMLParser.parse("Hello <em>world</em>");
  13. expect(text).toEqual("Hello world");
  14. expect(entities.length).toEqual(1);
  15. expect(entities[0]).toBeInstanceOf(types.MessageEntityItalic);
  16. });
  17. test("it should parse code entities", () => {
  18. const [text, entities] = HTMLParser.parse("Hello <code>world</code>");
  19. expect(text).toEqual("Hello world");
  20. expect(entities.length).toEqual(1);
  21. expect(entities[0]).toBeInstanceOf(types.MessageEntityCode);
  22. });
  23. test("it should parse pre entities", () => {
  24. const [text, entities] = HTMLParser.parse("Hello <pre>world</pre>");
  25. expect(text).toEqual("Hello world");
  26. expect(entities.length).toEqual(1);
  27. expect(entities[0]).toBeInstanceOf(types.MessageEntityPre);
  28. });
  29. test("it should parse strike entities", () => {
  30. const [text, entities] = HTMLParser.parse("Hello <del>world</del>");
  31. expect(text).toEqual("Hello world");
  32. expect(entities.length).toEqual(1);
  33. expect(entities[0]).toBeInstanceOf(types.MessageEntityStrike);
  34. });
  35. test("it should parse link entities", () => {
  36. const [text, entities] = HTMLParser.parse(
  37. 'Hello <a href="https://hello.world">world</a>'
  38. );
  39. expect(text).toEqual("Hello world");
  40. expect(entities.length).toEqual(1);
  41. expect(entities[0]).toBeInstanceOf(types.MessageEntityTextUrl);
  42. expect((entities[0] as types.MessageEntityTextUrl).url).toEqual(
  43. "https://hello.world"
  44. );
  45. });
  46. test("it should parse nested entities", () => {
  47. const [text, entities] = HTMLParser.parse(
  48. "Hello <strong><em>world</em></strong>"
  49. );
  50. expect(text).toEqual("Hello world");
  51. expect(entities.length).toEqual(2);
  52. expect(entities[0]).toBeInstanceOf(types.MessageEntityItalic);
  53. expect(entities[1]).toBeInstanceOf(types.MessageEntityBold);
  54. });
  55. test("it should parse multiple entities", () => {
  56. const [text, entities] = HTMLParser.parse(
  57. "<em>Hello</em> <strong>world</strong>"
  58. );
  59. expect(text).toEqual("Hello world");
  60. expect(entities.length).toEqual(2);
  61. expect(entities[0]).toBeInstanceOf(types.MessageEntityItalic);
  62. expect(entities[1]).toBeInstanceOf(types.MessageEntityBold);
  63. });
  64. });
  65. describe(".unparse", () => {
  66. test("it should create a markdown string from raw text and entities", () => {
  67. const unparsed =
  68. '<strong>hello</strong> <em>hello</em> <del>hello</del> <code>hello</code> <pre>hello</pre> <a href="https://hello.world">hello</a>';
  69. const strippedText = "hello hello hello hello hello hello";
  70. const rawEntities = [
  71. new types.MessageEntityBold({ offset: 0, length: 5 }),
  72. new types.MessageEntityItalic({ offset: 6, length: 5 }),
  73. new types.MessageEntityStrike({ offset: 12, length: 5 }),
  74. new types.MessageEntityCode({ offset: 18, length: 5 }),
  75. new types.MessageEntityPre({ offset: 24, length: 5, language: "" }),
  76. new types.MessageEntityTextUrl({
  77. offset: 30,
  78. length: 5,
  79. url: "https://hello.world",
  80. }),
  81. ];
  82. const text = HTMLParser.unparse(strippedText, rawEntities);
  83. expect(text).toEqual(unparsed);
  84. });
  85. test("it should unparse nested entities", () => {
  86. const unparsed = "<strong><em>Hello world</em></strong>";
  87. const strippedText = "Hello world";
  88. const rawEntities = [
  89. new types.MessageEntityBold({ offset: 0, length: 11 }),
  90. new types.MessageEntityItalic({ offset: 0, length: 11 }),
  91. ];
  92. const text = HTMLParser.unparse(strippedText, rawEntities);
  93. expect(text).toEqual(unparsed);
  94. });
  95. });
  96. });