markdown-writer.tests.js 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304
  1. var assert = require("assert");
  2. var test = require("../test")(module);
  3. var mdWriter = require("../../lib/writers/markdown-writer");
  4. test('special markdown characters are escaped', function() {
  5. var writer = mdWriter.writer();
  6. writer.text("\\*");
  7. return assert.equal(writer.asString(), "\\\\\\*");
  8. });
  9. test('unrecognised elements are treated as normal text', function() {
  10. var writer = mdWriter.writer();
  11. writer.open("blah");
  12. writer.text("Hello");
  13. writer.close("blah");
  14. return assert.equal(writer.asString(), "Hello");
  15. });
  16. test('paragraphs are terminated with double new line', function() {
  17. var writer = mdWriter.writer();
  18. writer.open("p");
  19. writer.text("Hello");
  20. writer.close("p");
  21. return assert.equal(writer.asString(), "Hello\n\n");
  22. });
  23. test('h1 elements are converted to heading with leading hash', function() {
  24. var writer = mdWriter.writer();
  25. writer.open("h1");
  26. writer.text("Hello");
  27. writer.close("h1");
  28. return assert.equal(writer.asString(), "# Hello\n\n");
  29. });
  30. test('h6 elements are converted to heading with six leading hashes', function() {
  31. var writer = mdWriter.writer();
  32. writer.open("h6");
  33. writer.text("Hello");
  34. writer.close("h6");
  35. return assert.equal(writer.asString(), "###### Hello\n\n");
  36. });
  37. test('br is written as two spaces followed by new line', function() {
  38. var writer = mdWriter.writer();
  39. writer.text("Hello World");
  40. writer.selfClosing("br");
  41. return assert.equal(writer.asString(), "Hello World \n");
  42. });
  43. test('strong text is surrounded by two underscores', function() {
  44. var writer = mdWriter.writer();
  45. writer.text("Hello ");
  46. writer.open("strong");
  47. writer.text("World");
  48. writer.close("strong");
  49. return assert.equal(writer.asString(), "Hello __World__");
  50. });
  51. test('emphasised text is surrounded by one asterix', function() {
  52. var writer = mdWriter.writer();
  53. writer.text("Hello ");
  54. writer.open("em");
  55. writer.text("World");
  56. writer.close("em");
  57. return assert.equal(writer.asString(), "Hello *World*");
  58. });
  59. test('anchor tags are written as hyperlinks', function() {
  60. var writer = mdWriter.writer();
  61. writer.open("a", {"href": "http://example.com"});
  62. writer.text("Hello");
  63. writer.close("a");
  64. return assert.equal(writer.asString(), "[Hello](http://example.com)");
  65. });
  66. test('anchor tags without href attribute are treated as ordinary text', function() {
  67. var writer = mdWriter.writer();
  68. writer.open("a");
  69. writer.text("Hello");
  70. writer.close("a");
  71. return assert.equal(writer.asString(), "Hello");
  72. });
  73. test('elements with IDs have anchor tags with IDs appended to start of markdown element', function() {
  74. var writer = mdWriter.writer();
  75. writer.open("h1", {id: "start"});
  76. writer.text("Hello");
  77. writer.close("h1");
  78. return assert.equal(writer.asString(), '# <a id="start"></a>Hello\n\n');
  79. });
  80. test('links have anchors before opening square bracket', function() {
  81. var writer = mdWriter.writer();
  82. writer.open("a", {href: "http://example.com", id: "start"});
  83. writer.text("Hello");
  84. writer.close("a");
  85. return assert.equal(writer.asString(), '<a id="start"></a>[Hello](http://example.com)');
  86. });
  87. test('can generate images', function() {
  88. var writer = mdWriter.writer();
  89. writer.selfClosing("img", {"src": "http://example.com/image.jpg", "alt": "Alt Text"});
  90. return assert.equal(writer.asString(), "![Alt Text](http://example.com/image.jpg)");
  91. });
  92. test('can generate images with missing alt attribute', function() {
  93. var writer = mdWriter.writer();
  94. writer.selfClosing("img", {"src": "http://example.com/image.jpg"});
  95. return assert.equal(writer.asString(), "![](http://example.com/image.jpg)");
  96. });
  97. test('can generate images with missing src attribute', function() {
  98. var writer = mdWriter.writer();
  99. writer.selfClosing("img", {"alt": "Alt Text"});
  100. return assert.equal(writer.asString(), "![Alt Text]()");
  101. });
  102. test("doesn't display empty images", function() {
  103. var writer = mdWriter.writer();
  104. writer.selfClosing("img");
  105. return assert.equal(writer.asString(), "");
  106. });
  107. test('list item outside of list is treated as unordered list', function() {
  108. var writer = mdWriter.writer();
  109. writer.open("li");
  110. writer.text("Hello");
  111. writer.close("li");
  112. return assert.equal(writer.asString(), "- Hello\n");
  113. });
  114. test('can generate an ordered list', function() {
  115. var writer = mdWriter.writer();
  116. writer.open("ol");
  117. writer.open("li");
  118. writer.text("Hello");
  119. writer.close("li");
  120. writer.open("li");
  121. writer.text("World");
  122. writer.close("li");
  123. writer.close("ol");
  124. return assert.equal(writer.asString(), "1. Hello\n2. World\n\n");
  125. });
  126. test('can generate an unordered list', function() {
  127. var writer = mdWriter.writer();
  128. writer.open("ul");
  129. writer.open("li");
  130. writer.text("Hello");
  131. writer.close("li");
  132. writer.open("li");
  133. writer.text("World");
  134. writer.close("li");
  135. writer.close("ul");
  136. return assert.equal(writer.asString(), "- Hello\n- World\n\n");
  137. });
  138. test('can generate a nested ordered list with correct numbering', function() {
  139. var writer = mdWriter.writer();
  140. writer.open("ol");
  141. writer.open("li");
  142. writer.text("Outer One");
  143. writer.open("ol");
  144. writer.open("li");
  145. writer.text("Nested One");
  146. writer.close("li");
  147. writer.open("li");
  148. writer.text("Nested Two");
  149. writer.close("li");
  150. writer.close("ol");
  151. writer.close("li");
  152. writer.open("li");
  153. writer.text("Outer Two");
  154. writer.close("li");
  155. writer.close("ol");
  156. return assert.equal(writer.asString(), "1. Outer One\n\t1. Nested One\n\t2. Nested Two\n2. Outer Two\n\n");
  157. });
  158. test('can generate a multi-level nested ordered list', function() {
  159. var writer = mdWriter.writer();
  160. writer.open("ol");
  161. writer.open("li");
  162. writer.text("Outer One");
  163. writer.open("ol");
  164. writer.open("li");
  165. writer.text("Nested One");
  166. writer.open("ol");
  167. writer.open("li");
  168. writer.text("Inner One");
  169. writer.close("li");
  170. writer.close("ol");
  171. writer.close("li");
  172. writer.close("ol");
  173. writer.close("li");
  174. writer.close("ol");
  175. return assert.equal(writer.asString(), "1. Outer One\n\t1. Nested One\n\t\t1. Inner One\n\n");
  176. });
  177. test('new ordered list resets numbering', function() {
  178. var writer = mdWriter.writer();
  179. writer.open("ol");
  180. writer.open("li");
  181. writer.text("First");
  182. writer.close("li");
  183. writer.close("ol");
  184. writer.open("p");
  185. writer.text("Hello");
  186. writer.close("p");
  187. writer.open("ol");
  188. writer.open("li");
  189. writer.text("Second");
  190. writer.close("li");
  191. writer.close("ol");
  192. return assert.equal(writer.asString(), "1. First\n\nHello\n\n1. Second\n\n");
  193. });
  194. test('can generate a nested unordered list', function() {
  195. var writer = mdWriter.writer();
  196. writer.open("ul");
  197. writer.open("li");
  198. writer.text("Outer One");
  199. writer.open("ul");
  200. writer.open("li");
  201. writer.text("Nested One");
  202. writer.close("li");
  203. writer.open("li");
  204. writer.text("Nested Two");
  205. writer.close("li");
  206. writer.close("ul");
  207. writer.close("li");
  208. writer.open("li");
  209. writer.text("Outer Two");
  210. writer.close("li");
  211. writer.close("ul");
  212. return assert.equal(writer.asString(), "- Outer One\n\t- Nested One\n\t- Nested Two\n- Outer Two\n\n");
  213. });
  214. test('can nest inline elements', function() {
  215. var writer = mdWriter.writer();
  216. writer.open("p");
  217. writer.text("Lorem ");
  218. writer.open("strong");
  219. writer.text("ipsum ");
  220. writer.open("em");
  221. writer.text("dolor");
  222. writer.close("em");
  223. writer.text(" sit");
  224. writer.close("strong");
  225. writer.text(" amet");
  226. writer.close("p");
  227. return assert.equal(writer.asString(), "Lorem __ipsum *dolor* sit__ amet\n\n");
  228. });
  229. test('can emphasise list text', function() {
  230. var writer = mdWriter.writer();
  231. writer.open("ol");
  232. writer.open("li");
  233. writer.text("Hello ");
  234. writer.open("strong");
  235. writer.text("Strong");
  236. writer.close("strong");
  237. writer.text(" World");
  238. writer.close("li");
  239. writer.open("li");
  240. writer.text("Hello ");
  241. writer.open("em");
  242. writer.text("Emphasis");
  243. writer.close("em");
  244. writer.text(" World");
  245. writer.close("li");
  246. writer.close("ol");
  247. return assert.equal(writer.asString(), "1. Hello __Strong__ World\n2. Hello *Emphasis* World\n\n");
  248. });
  249. test('generates correct spacing between paragraphs and lists', function() {
  250. var writer = mdWriter.writer();
  251. writer.open("p");
  252. writer.text("Hello World");
  253. writer.close("p");
  254. writer.open("ul");
  255. writer.open("li");
  256. writer.text("First Item");
  257. writer.close("li");
  258. writer.open("li");
  259. writer.text("Second Item");
  260. writer.close("li");
  261. writer.close("ul");
  262. writer.open("p");
  263. writer.text("Hello World");
  264. writer.close("p");
  265. return assert.equal(writer.asString(), "Hello World\n\n- First Item\n- Second Item\n\nHello World\n\n");
  266. });