PHP and Javascript implementations of a simple markdown parser
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. class BrokenSyntaxTests extends BaseTest {
  2. #parser;
  3. setUp() {
  4. this.#parser = Markdown.completeParser;
  5. }
  6. /**
  7. * @param {string} markdown
  8. */
  9. #iterateCharacters(markdown) {
  10. for (var i = 1; i < markdown.length; i++) {
  11. const portion = markdown.substring(0, i);
  12. this.#parser.toHTML(portion);
  13. }
  14. }
  15. test_brokenSyntax() {
  16. // Just try a bunch of broken syntax and make sure no exceptions are
  17. // thrown or infinite loops triggered. Don't care about what's rendered
  18. // as most of these are incomplete or invalid syntax.
  19. this.#iterateCharacters("# ");
  20. this.#iterateCharacters("## ");
  21. this.#iterateCharacters("Underlined\n-");
  22. this.#iterateCharacters("* ");
  23. this.#iterateCharacters(" * A");
  24. this.#iterateCharacters("- A");
  25. this.#iterateCharacters(" - A");
  26. this.#iterateCharacters("+ A");
  27. this.#iterateCharacters(" + A");
  28. this.#iterateCharacters("1. A");
  29. this.#iterateCharacters(" 1. A");
  30. this.#iterateCharacters("1. A\n 1. B\n 2. C\n2. D");
  31. this.#iterateCharacters("> A");
  32. this.#iterateCharacters("> \nA");
  33. this.#iterateCharacters("> \n>");
  34. this.#iterateCharacters(">>");
  35. this.#iterateCharacters("> > A");
  36. this.#iterateCharacters("> \n> A");
  37. this.#iterateCharacters("> > \n> A");
  38. this.#iterateCharacters("```\ncode\n```");
  39. this.#iterateCharacters("```java\ncode\n```");
  40. this.#iterateCharacters(" code\n code\n\n");
  41. this.#iterateCharacters("------");
  42. this.#iterateCharacters(" - - - --*");
  43. this.#iterateCharacters("Header|Header\n--|--\nCell|Cell");
  44. this.#iterateCharacters("Header\n--|--\nCell");
  45. this.#iterateCharacters("|Header|\n|-|\n|Cell|");
  46. this.#iterateCharacters("|Header|\n|--|--|--|\n|Cell|");
  47. this.#iterateCharacters("|Header|Header|\n|--|\n|Cell|Cell|");
  48. this.#iterateCharacters("|Header|\n|:-|\n|Cell|");
  49. this.#iterateCharacters("|Header|\n|:-:|\n|Cell|");
  50. this.#iterateCharacters("|Header|\n|-:|\n|Cell|");
  51. this.#iterateCharacters("term\n: definition\nterm\n: definition");
  52. this.#iterateCharacters("term\n:definition\nterm\n:definition");
  53. this.#iterateCharacters("HTML\n\n*[HTML]: Hypertext");
  54. this.#iterateCharacters("HTML\n*[HTML]: Hypertext");
  55. this.#iterateCharacters("*[HTML]: Hypertext\nHTML");
  56. this.#iterateCharacters("---{.foo}\n");
  57. this.#iterateCharacters("---{#foo}\n");
  58. this.#iterateCharacters("---{.foo #foo lang=en}\n");
  59. this.#iterateCharacters("lorem *ipsum* dolor *sit* amet");
  60. this.#iterateCharacters("*lorem* ipsum *dolor* sit *amet*");
  61. this.#iterateCharacters("*lorem *ipsum *dolor*** sit");
  62. this.#iterateCharacters("***lorem* ipsum* dolor* sit");
  63. this.#iterateCharacters("lorem _ipsum_ dolor _sit_ amet");
  64. this.#iterateCharacters("_lorem_ ipsum _dolor_ sit _amet_");
  65. this.#iterateCharacters("_lorem _ipsum _dolor___ sit");
  66. this.#iterateCharacters("___lorem_ ipsum_ dolor_ sit");
  67. this.#iterateCharacters("lorem **ipsum** dolor **sit** amet");
  68. this.#iterateCharacters("**lorem** ipsum **dolor** sit **amet**");
  69. this.#iterateCharacters("**lorem **ipsum **dolor****** sit");
  70. this.#iterateCharacters("******lorem** ipsum** dolor** sit");
  71. this.#iterateCharacters("lorem __ipsum__ dolor __sit__ amet");
  72. this.#iterateCharacters("__lorem__ ipsum __dolor__ sit __amet__");
  73. this.#iterateCharacters("lorem __ipsum__ dolor __sit__ amet");
  74. this.#iterateCharacters("__lorem __ipsum __dolor______ sit");
  75. this.#iterateCharacters("______lorem__ ipsum__ dolor__ sit");
  76. this.#iterateCharacters("*_**`~~^==!__~*^!``**-+!**`==!~_^**``_");
  77. this.#iterateCharacters("[link[(index.html(");
  78. this.#iterateCharacters("[link[](index.html()");
  79. this.#iterateCharacters("[link]](index.html))");
  80. this.#iterateCharacters("[[link]((index.html)");
  81. this.#iterateCharacters("]link])index.html)");
  82. this.#iterateCharacters("[ link ] ( index.html )");
  83. this.#iterateCharacters("(user@example.com)");
  84. this.#iterateCharacters("(https://user@example.com)");
  85. this.#iterateCharacters("(index.html \"title\")");
  86. this.#iterateCharacters("(index.html \"title)");
  87. this.#iterateCharacters("(index.html title\")");
  88. this.#iterateCharacters("(index.html title)");
  89. this.#iterateCharacters("![alt][image.jpg]");
  90. this.#iterateCharacters("![alt[](image.jpg()");
  91. this.#iterateCharacters("! [alt](image.jpg)");
  92. this.#iterateCharacters("!(image.jpg)");
  93. this.#iterateCharacters("[][]]][][[][][][[][[]][][][][][[[]]]][]][][");
  94. this.#iterateCharacters("())())()()()(())(()((())))(()((()");
  95. this.#iterateCharacters("<https://example.com>");
  96. this.#iterateCharacters("<<https://example.com>");
  97. this.#iterateCharacters("<https://example.com>>");
  98. this.#iterateCharacters("[link][ref]\n\n[ref]: page.html");
  99. this.#iterateCharacters("[link][ref]\n[ref]: page.html");
  100. this.#iterateCharacters("[link][ref]\n\n[ref]:page.html");
  101. this.#iterateCharacters("[ref]: page.html\n\n[link][ref]");
  102. this.#iterateCharacters("[link][ref]\n\n[ref]: page.html \"title\"");
  103. this.#iterateCharacters("[link][ref]\n\n[ref]: page.html title");
  104. this.#iterateCharacters("Lorem[^1] ipsum[^abc] dolor[^-1]\n\n[^abc]: def\n[^1]: def\n[^-1]: def\n[^abc]: def");
  105. this.#iterateCharacters("Lorem[^1]\n\n[^2]: def");
  106. this.#iterateCharacters("[^1]] [[^2] [^3]] [[^4]] ]^5[");
  107. this.#iterateCharacters("[^1]: Def\n\nLorem[^1]");
  108. this.#iterateCharacters("[^1]: Def\n\nLorem[^2]");
  109. this.#iterateCharacters("Lorem <foo> ipsum");
  110. this.#iterateCharacters("Lorem <span> ipsum");
  111. this.#iterateCharacters("Lorem <span class=\"foo\" id=\"foo\" lang=\"en\"> ipsum");
  112. this.#iterateCharacters("Lorem </span> ipsum");
  113. this.#iterateCharacters("Lorem </span foo=\"bar\">");
  114. this.#iterateCharacters("Lorem <span foo='bar' baz=ipsum dolor> sit");
  115. this.#iterateCharacters("\\*\\\\*\\\\\\*\\\\\\\\*\\*");
  116. }
  117. }