PHP and Javascript implementations of a simple markdown parser
Du kannst nicht mehr als 25 Themen auswählen Themen müssen mit entweder einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.

BrokenSyntaxTests.php 6.1KB

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