PHP and Javascript implementations of a simple markdown parser
Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

InlineTests.php 8.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250
  1. <?php
  2. declare(strict_types=1);
  3. use PHPUnit\Framework\TestCase;
  4. require_once __DIR__ . '/../php/markdown.php';
  5. final class InlineTests extends TestCase {
  6. /** @type {Markdown} */
  7. private ?Markdown $parser = null;
  8. protected function setUp(): void {
  9. parent::setUp();
  10. $this->parser = Markdown::completeParser();
  11. }
  12. private function md(string $markdown): string {
  13. return $this->normalizeWhitespace($this->parser->toHTML($markdown));
  14. }
  15. private function normalizeWhitespace(string $str): string {
  16. $str = mb_eregi_replace('\\s+', ' ', $str);
  17. return trim($str);
  18. }
  19. public function test_simpleText() {
  20. $markdown = 'Lorem ipsum';
  21. $expected = 'Lorem ipsum';
  22. $actual = $this->md($markdown);
  23. $this->assertSame($expected, $actual);
  24. }
  25. public function test_strong() {
  26. $markdown = 'Lorem **ipsum** dolor **sit**';
  27. $expected = 'Lorem <strong>ipsum</strong> dolor <strong>sit</strong>';
  28. $actual = $this->md($markdown);
  29. $this->assertSame($expected, $actual);
  30. }
  31. public function test_emphasis() {
  32. $markdown = 'Lorem _ipsum_ dolor _sit_';
  33. $expected = 'Lorem <em>ipsum</em> dolor <em>sit</em>';
  34. $actual = $this->md($markdown);
  35. $this->assertSame($expected, $actual);
  36. }
  37. public function test_strongEmphasis_cleanNesting1() {
  38. $markdown = 'Lorem **ipsum *dolor* sit** amet';
  39. $expected = 'Lorem <strong>ipsum <em>dolor</em> sit</strong> amet';
  40. $actual = $this->md($markdown);
  41. $this->assertSame($expected, $actual);
  42. }
  43. public function test_strongEmphasis_cleanNesting2() {
  44. $markdown = 'Lorem *ipsum **dolor** sit* amet';
  45. $expected = 'Lorem <em>ipsum <strong>dolor</strong> sit</em> amet';
  46. $actual = $this->md($markdown);
  47. $this->assertSame($expected, $actual);
  48. }
  49. public function test_strongEmphasis_tightNesting() {
  50. $markdown = 'Lorem ***ipsum*** dolor';
  51. $expected = 'Lorem <strong><em>ipsum</em></strong> dolor';
  52. $actual = $this->md($markdown);
  53. $this->assertSame($expected, $actual);
  54. }
  55. public function test_strongEmphasis_lopsidedNesting1() {
  56. $markdown = 'Lorem ***ipsum* dolor** sit';
  57. $expected = 'Lorem <strong><em>ipsum</em> dolor</strong> sit';
  58. $actual = $this->md($markdown);
  59. $this->assertSame($expected, $actual);
  60. }
  61. public function test_strongEmphasis_lopsidedNesting2() {
  62. $markdown = 'Lorem ***ipsum** dolor* sit';
  63. $expected = 'Lorem <em><strong>ipsum</strong> dolor</em> sit';
  64. $actual = $this->md($markdown);
  65. $this->assertSame($expected, $actual);
  66. }
  67. public function test_strongEmphasis_lopsidedNesting3() {
  68. $markdown = 'Lorem **ipsum *dolor*** sit';
  69. $expected = 'Lorem <strong>ipsum <em>dolor</em></strong> sit';
  70. $actual = $this->md($markdown);
  71. $this->assertSame($expected, $actual);
  72. }
  73. public function test_strongEmphasis_lopsidedNesting4() {
  74. $markdown = 'Lorem *ipsum **dolor*** sit';
  75. $expected = 'Lorem <em>ipsum <strong>dolor</strong></em> sit';
  76. $actual = $this->md($markdown);
  77. $this->assertSame($expected, $actual);
  78. }
  79. public function test_inlineCode() {
  80. $markdown = 'Lorem `ipsum` dolor';
  81. $expected = 'Lorem <code>ipsum</code> dolor';
  82. $actual = $this->md($markdown);
  83. $this->assertSame($expected, $actual);
  84. }
  85. public function test_inlineCode_withInnerBacktick() {
  86. $markdown = 'Lorem ``ip`su`m`` dolor';
  87. $expected = 'Lorem <code>ip`su`m</code> dolor';
  88. $actual = $this->md($markdown);
  89. $this->assertSame($expected, $actual);
  90. }
  91. public function test_strikethrough_double() {
  92. $markdown = 'Lorem ~~ipsum~~ dolor';
  93. $expected = 'Lorem <s>ipsum</s> dolor';
  94. $actual = $this->md($markdown);
  95. $this->assertSame($expected, $actual);
  96. }
  97. public function test_subscript() {
  98. $markdown = 'H~2~O';
  99. $expected = 'H<sub>2</sub>O';
  100. $actual = $this->md($markdown);
  101. $this->assertSame($expected, $actual);
  102. }
  103. public function test_superscript() {
  104. $markdown = 'E=mc^2^';
  105. $expected = 'E=mc<sup>2</sup>';
  106. $actual = $this->md($markdown);
  107. $this->assertSame($expected, $actual);
  108. }
  109. public function test_highlight() {
  110. $markdown = 'Lorem ==ipsum== dolor';
  111. $expected = 'Lorem <mark>ipsum</mark> dolor';
  112. $actual = $this->md($markdown);
  113. $this->assertSame($expected, $actual);
  114. }
  115. public function test_underline() {
  116. $markdown = 'Lorem __ipsum__ dolor';
  117. $expected = 'Lorem <u>ipsum</u> dolor';
  118. $actual = $this->md($markdown);
  119. $this->assertSame($expected, $actual);
  120. }
  121. public function test_link_fullyQualified() {
  122. $markdown = 'Lorem [ipsum](https://example.com/path/page.html) dolor';
  123. $expected = 'Lorem <a href="https://example.com/path/page.html">ipsum</a> dolor';
  124. $actual = $this->md($markdown);
  125. $this->assertSame($expected, $actual);
  126. }
  127. public function test_link_relative() {
  128. $markdown = 'Lorem [ipsum](page.html) dolor';
  129. $expected = 'Lorem <a href="page.html">ipsum</a> dolor';
  130. $actual = $this->md($markdown);
  131. $this->assertSame($expected, $actual);
  132. }
  133. public function test_link_title() {
  134. $markdown = 'Lorem [ipsum](page.html "link title") dolor';
  135. $expected = 'Lorem <a href="page.html" title="link title">ipsum</a> dolor';
  136. $actual = $this->md($markdown);
  137. $this->assertSame($expected, $actual);
  138. }
  139. public function test_link_literal() {
  140. $markdown = 'Lorem <https://example.com> dolor';
  141. $expected = 'Lorem <a href="https://example.com">https://example.com</a> dolor';
  142. $actual = $this->md($markdown);
  143. $this->assertSame($expected, $actual);
  144. }
  145. public function test_link_ref() {
  146. $markdown = "Lorem [ipsum][ref] dolor\n\n[ref]: https://example.com";
  147. $expected = '<p>Lorem <a href="https://example.com">ipsum</a> dolor</p>';
  148. $actual = $this->md($markdown);
  149. $this->assertSame($expected, $actual);
  150. }
  151. public function test_link_email() {
  152. $markdown = 'Lorem [ipsum](user@example.com) dolor';
  153. $expected = 'Lorem <a href="mailto:&#117;&#115;&#101;&#114;&#64;&#101;&#120;&#97;&#109;&#112;&#108;&#101;&#46;&#99;&#111;&#109;">ipsum</a> dolor';
  154. $actual = $this->md($markdown);
  155. $this->assertSame($expected, $actual);
  156. }
  157. public function test_link_email_withTitle() {
  158. $markdown = 'Lorem [ipsum](user@example.com "title") dolor';
  159. $expected = 'Lorem <a href="mailto:&#117;&#115;&#101;&#114;&#64;&#101;&#120;&#97;&#109;&#112;&#108;&#101;&#46;&#99;&#111;&#109;" title="title">ipsum</a> dolor';
  160. $actual = $this->md($markdown);
  161. $this->assertSame($expected, $actual);
  162. }
  163. public function test_link_literalEmail() {
  164. $markdown = 'Lorem <user@example.com> dolor';
  165. $expected = 'Lorem <a href="mailto:&#117;&#115;&#101;&#114;&#64;&#101;&#120;&#97;&#109;&#112;&#108;&#101;&#46;&#99;&#111;&#109;">&#117;&#115;&#101;&#114;&#64;&#101;&#120;&#97;&#109;&#112;&#108;&#101;&#46;&#99;&#111;&#109;</a> dolor';
  166. $actual = $this->md($markdown);
  167. $this->assertSame($expected, $actual);
  168. }
  169. public function test_link_image() {
  170. $markdown = 'Lorem [![alt](image.jpg)](page.html) ipsum';
  171. $expected = 'Lorem <a href="page.html"><img src="image.jpg" alt="alt"></a> ipsum';
  172. $actual = $this->md($markdown);
  173. $this->assertSame($expected, $actual);
  174. }
  175. public function test_link_image_complex() {
  176. $markdown = 'Lorem [![alt] (image.jpg "image title")] (page.html "link title") ipsum';
  177. $expected = 'Lorem <a href="page.html" title="link title"><img src="image.jpg" alt="alt" title="image title"></a> ipsum';
  178. $actual = $this->md($markdown);
  179. $this->assertSame($expected, $actual);
  180. }
  181. public function test_image() {
  182. $markdown = 'Lorem ![alt text](image.jpg) dolor';
  183. $expected = 'Lorem <img src="image.jpg" alt="alt text"> dolor';
  184. $actual = $this->md($markdown);
  185. $this->assertSame($expected, $actual);
  186. }
  187. public function test_image_noAlt() {
  188. $markdown = 'Lorem ![](image.jpg) dolor';
  189. $expected = 'Lorem <img src="image.jpg"> dolor';
  190. $actual = $this->md($markdown);
  191. $this->assertSame($expected, $actual);
  192. }
  193. public function test_image_withTitle() {
  194. $markdown = 'Lorem ![alt text](image.jpg "image title") dolor';
  195. $expected = 'Lorem <img src="image.jpg" alt="alt text" title="image title"> dolor';
  196. $actual = $this->md($markdown);
  197. $this->assertSame($expected, $actual);
  198. }
  199. public function test_image_ref() {
  200. $markdown = "Lorem ![alt text][ref] dolor\n\n" .
  201. '[ref]: image.jpg "image title"';
  202. $expected = '<p>Lorem <img src="image.jpg" alt="alt text" title="image title"> dolor</p>';
  203. $actual = $this->md($markdown);
  204. $this->assertSame($expected, $actual);
  205. }
  206. public function test_htmlTags() {
  207. $markdown = 'Lorem <strong title=\'with " quote\' id="with \' apostrophe" lang=unquoted translate forbidden="true">ipsum</strong> dolor';
  208. $expected = 'Lorem <strong title="with &quot; quote" id="with \' apostrophe" lang="unquoted" translate>ipsum</strong> dolor';
  209. $actual = $this->md($markdown);
  210. $this->assertSame($expected, $actual);
  211. }
  212. }