PageRenderTime 60ms CodeModel.GetById 24ms RepoModel.GetById 1ms app.codeStats 0ms

/trunk/TEPs/thirdparty/TracWysiwygPlugin/0.11/tests/testcase.js

https://bitbucket.org/ZoomQuiet/trachinese
JavaScript | 1455 lines | 1406 code | 49 blank | 0 comment | 20 complexity | a88a353ae84b6dff03950b51a0bc1046 MD5 | raw file
Possible License(s): GPL-3.0, GPL-2.0

Large files files are truncated, but you can click here to view the full file

  1. addEvent(window, "load", function() {
  2. TracWysiwyg.tracPaths = { base: "./", htdocs: "./" };
  3. var instance = new TracWysiwyg(document.getElementById("textarea"));
  4. var contentDocument = instance.contentDocument;
  5. var d = document;
  6. var wysiwygHtml = d.getElementById("wysiwyg-html");
  7. var showWysiwygHtml = d.getElementById("show-wysiwyg-html");
  8. setTimeout(function() {
  9. if (showWysiwygHtml.checked) {
  10. var body = contentDocument.body;
  11. var browserIE = body.attachEvent ? true : false;
  12. var elements = body.getElementsByTagName("br");
  13. var count = 0;
  14. var html = body.innerHTML.replace(/<[Bb][Rr] *[^>\/]*/g, function(value) {
  15. var element = elements[count++];
  16. var attributes = element.attributes;
  17. var length = attributes.length;
  18. if (length == 0)
  19. return value;
  20. var texts = [ value ];
  21. for (var i = 0; i < length; i++) {
  22. var attr = attributes[i];
  23. if (!browserIE || !!element[attr.name]) {
  24. texts.push(' ', attr.name, '="', attr.value, '"');
  25. }
  26. }
  27. return texts.join("");
  28. });
  29. if (wysiwygHtml.value != html) {
  30. wysiwygHtml.value = html;
  31. }
  32. }
  33. setTimeout(arguments.callee, 500);
  34. }, 500);
  35. function generate(dom, wikitext, withoutDomToWikitext, withoutWikitextToFragment) {
  36. dom = dom.cloneNode(true);
  37. var anonymous = dom.ownerDocument.createElement("div");
  38. anonymous.appendChild(dom);
  39. if (!withoutWikitextToFragment) {
  40. var fragment = instance.wikitextToFragment(wikitext, contentDocument);
  41. var generated = contentDocument.createElement("div");
  42. generated.appendChild(fragment);
  43. var generatedHtml = generated.innerHTML;
  44. if (!generated.addEventListener || window.opera) {
  45. generatedHtml = generatedHtml.replace(/\n\r/g, "\uffff").replace(/\uffff\n?/g, "\n");
  46. }
  47. this.assertEqual(anonymous.innerHTML, generatedHtml, "wikitextToFragment");
  48. }
  49. if (!withoutDomToWikitext) {
  50. this.assertEqual(wikitext, instance.domToWikitext(anonymous), "domToWikitext");
  51. }
  52. }
  53. function generateFragment(dom, wikitext) {
  54. generate.call(this, dom, wikitext, true);
  55. }
  56. function generateWikitext(dom, wikitext) {
  57. generate.call(this, dom, wikitext, false, true);
  58. }
  59. function run() {
  60. var unit = new TracWysiwyg.TestUnit();
  61. var fragment = unit.fragment;
  62. var element = unit.element;
  63. var a = function(link, label) {
  64. var attrs = {
  65. href: "./search?q=" + encodeURIComponent(link),
  66. title: link, "tracwysiwyg-link": link, onclick: "return false;" };
  67. return element("a", attrs, label);
  68. };
  69. unit.add("treeWalk", function() {
  70. var list;
  71. function iterator(node) {
  72. var value;
  73. if (node) {
  74. switch (node.nodeType) {
  75. case 1: value = node.tagName.toLowerCase(); break;
  76. case 3: value = "#text"; break;
  77. }
  78. }
  79. else {
  80. value = "(null)";
  81. }
  82. list.push(value);
  83. }
  84. function doTreeWalk(expected, dom) {
  85. list = [];
  86. instance.treeWalk(dom, iterator);
  87. this.assertEqual(expected, list.join(" "));
  88. list = [];
  89. instance._treeWalkEmulation(dom, iterator);
  90. this.assertEqual(expected, list.join(" "));
  91. }
  92. doTreeWalk.call(this, "p #text (null)", element("div", element("p", "paragraph")));
  93. doTreeWalk.call(this, "#text (null)", element("div", element("p", "paragraph")).firstChild);
  94. doTreeWalk.call(this, "(null)", element("div", element("p")).firstChild);
  95. var dom = element("div");
  96. dom.innerHTML = [
  97. '<h2 id="Tables">Tables</h2>',
  98. '<p>',
  99. 'Simple tables can be created like this:',
  100. '</p>',
  101. '<pre class="wiki">||Cell 1||Cell 2||Cell 3||',
  102. '||Cell 4||Cell 5||Cell 6||',
  103. '</pre><p>',
  104. 'Display:',
  105. '</p>',
  106. '<table class="wiki">',
  107. '<tbody><tr><td>Cell 1</td><td>Cell 2</td><td>Cell 3',
  108. '</td></tr><tr><td>Cell 4</td><td>Cell 5</td><td>Cell 6',
  109. '</td></tr></tbody></table>',
  110. '<p>',
  111. 'Note that more complex tables can be created using',
  112. '<a class="wiki" href="/practice/wiki/WikiRestructuredText#BiggerReSTExample">reStructuredText</a>.',
  113. '</p>' ].join("");
  114. var expected = [
  115. 'h2', '#text', 'p', '#text', 'pre', '#text', 'p', '#text',
  116. 'table', 'tbody',
  117. 'tr', 'td', '#text', 'td', '#text', 'td', '#text',
  118. 'tr', 'td', '#text', 'td', '#text', 'td', '#text',
  119. 'p', '#text', 'a', '#text', '#text',
  120. '(null)'].join(" ");
  121. doTreeWalk.call(this, expected, dom);
  122. });
  123. unit.add("isLastChildInBlockNode", function() {
  124. var dom = fragment(
  125. element("p", element("br")),
  126. element("p", "foobar", element("br"), "foobar"),
  127. element("p", element("b", "foobar", element("br"))),
  128. element("p", element("b", "foobar"), element("br")),
  129. element("br"));
  130. var count = 0;
  131. function assert(expected, node) {
  132. this.assertEqual(expected, instance.isLastChildInBlockNode(node), "#" + (count++));
  133. }
  134. assert.call(this, true, dom.childNodes[0].childNodes[0]);
  135. assert.call(this, false, dom.childNodes[1].childNodes[0]);
  136. assert.call(this, false, dom.childNodes[1].childNodes[1]);
  137. assert.call(this, true, dom.childNodes[1].childNodes[2]);
  138. assert.call(this, false, dom.childNodes[2].childNodes[0].childNodes[0]);
  139. assert.call(this, true, dom.childNodes[2].childNodes[0].childNodes[1]);
  140. assert.call(this, false, dom.childNodes[3].childNodes[0].childNodes[0]);
  141. assert.call(this, true, dom.childNodes[3].childNodes[1]);
  142. assert.call(this, true, dom.childNodes[4]);
  143. });
  144. unit.add("code block", function() {
  145. var dom = fragment(
  146. element("p", element("tt", "abc")),
  147. element("pre", { "class": "wiki" }, "{{{code-block"));
  148. var wikitext = [
  149. "`abc`",
  150. "",
  151. "{{{",
  152. "{{{code-block",
  153. "}}}" ].join("\n");
  154. generate.call(this, dom, wikitext);
  155. });
  156. unit.add("code block nest", function() {
  157. var dom = fragment(
  158. element("pre", { "class": "wiki" }, "#!python\n= level 1\n{{{\n= level 2\n}}}\n= level 1"));
  159. var wikitext = [
  160. "{{{",
  161. "#!python",
  162. "= level 1",
  163. "{{{",
  164. "= level 2",
  165. "}}}",
  166. "= level 1",
  167. "}}}" ].join("\n");
  168. generate.call(this, dom, wikitext);
  169. });
  170. unit.add("paragraph", function() {
  171. var dom = fragment(
  172. element("p", "Paragraph continued..."),
  173. element("p", "Second paragraph continued..."));
  174. generateFragment.call(this, dom, [
  175. "Paragraph",
  176. "continued...",
  177. "",
  178. "Second paragraph",
  179. "continued...",
  180. "" ].join("\n"));
  181. generate.call(this, dom, [
  182. "Paragraph continued...",
  183. "",
  184. "Second paragraph continued..." ].join("\n"));
  185. });
  186. unit.add("hr", function() {
  187. var dom = fragment(
  188. element("p", "Paragraph"),
  189. element("hr"),
  190. element("ul",
  191. element("li", "item 1"),
  192. element("ol", element("li", "item 1.1"))),
  193. element("hr"));
  194. generateFragment.call(this, dom, [
  195. "Paragraph",
  196. "----",
  197. " * item 1",
  198. " 1. item 1.1",
  199. "----" ].join("\n"));
  200. generate.call(this, dom, [
  201. "Paragraph",
  202. "",
  203. "----",
  204. " * item 1",
  205. " 1. item 1.1",
  206. "",
  207. "----" ].join("\n"));
  208. });
  209. unit.add("bold italic", function() {
  210. var dom = element("p", element("b", element("i", "bold italic")));
  211. var wikitext = "'''''bold italic'''''";
  212. generate.call(this, dom, wikitext);
  213. });
  214. unit.add("bold", function() {
  215. var wikitext = [
  216. "The quick '''brown''' fox.",
  217. "",
  218. "The quick '''brown''' fox." ].join("\n");
  219. generateWikitext.call(this,
  220. fragment(
  221. element("p", "The quick ", element("b", "brown"), " fox."),
  222. element("p", "The quick ", element("strong", "brown"), " fox.")),
  223. wikitext);
  224. generateFragment.call(this,
  225. fragment(
  226. element("p", "The quick ", element("b", "brown"), " fox."),
  227. element("p", "The quick ", element("b", "brown"), " fox.")),
  228. wikitext);
  229. });
  230. unit.add("italic", function() {
  231. var wikitext = [
  232. "The quick ''brown'' fox.",
  233. "",
  234. "The quick ''brown'' fox." ].join("\n");
  235. generateWikitext.call(this,
  236. fragment(
  237. element("p", "The quick ", element("i", "brown"), " fox."),
  238. element("p", "The quick ", element("em", "brown"), " fox.")),
  239. wikitext);
  240. generateFragment.call(this,
  241. fragment(
  242. element("p", "The quick ", element("i", "brown"), " fox."),
  243. element("p", "The quick ", element("i", "brown"), " fox.")),
  244. wikitext);
  245. });
  246. unit.add("underline", function() {
  247. var dom = element("p", element("u", "underline"));
  248. var wikitext = "__underline__";
  249. generate.call(this, dom, wikitext);
  250. });
  251. unit.add("strike-through", function() {
  252. var dom = element("p", element("del", "strike-through"));
  253. var wikitext = "~~strike-through~~";
  254. generate.call(this, dom, wikitext);
  255. });
  256. unit.add("superscript", function() {
  257. var dom = element("p", element("sup", "superscript"));
  258. var wikitext = "^superscript^";
  259. generate.call(this, dom, wikitext);
  260. });
  261. unit.add("subscript", function() {
  262. var dom = element("p", element("sub", "subscript"));
  263. var wikitext = ",,subscript,,";
  264. generate.call(this, dom, wikitext);
  265. });
  266. unit.add("monospace", function() {
  267. var dom = element("p", element("tt", "monospace"),
  268. ", ", element("tt", "mono`s`pace"),
  269. ", ", element("tt", "mono{{{s}}}pace"));
  270. var wikitext = "`monospace`, {{{mono`s`pace}}}, `mono{{{s}}}pace`";
  271. generate.call(this, dom, wikitext);
  272. });
  273. unit.add("italic -> bold", function() {
  274. var dom = element("p",
  275. "normal",
  276. element("i", "italic"),
  277. element("b", "bold"),
  278. "normal");
  279. var wikitext = "normal''italic'''''bold'''normal";
  280. generate.call(this, dom, wikitext);
  281. });
  282. unit.add("bold -> italic", function() {
  283. var dom = element("p",
  284. "normal",
  285. element("b", "bold"),
  286. element("i", "italic"),
  287. "normal");
  288. var wikitext = "normal'''bold'''''italic''normal";
  289. generate.call(this, dom, wikitext);
  290. });
  291. unit.add("[ italic [ xyz ] bold ]", function() {
  292. var dom = element("p",
  293. "normal",
  294. element("i", "italic", element("b", "xyz")),
  295. element("b", "bold"),
  296. "normal");
  297. var wikitext = "normal''italic'''xyz''bold'''normal";
  298. generate.call(this, dom, wikitext);
  299. });
  300. unit.add("overlapped markups", function() {
  301. var dom = element("p",
  302. "normal",
  303. element("b", "bold",
  304. element("i", "italic",
  305. element("u", "underline",
  306. element("del", "strike-through",
  307. element("sup", "superscript",
  308. element("sub", "subscript"))))),
  309. element("u", element("del", element("sup", element("sub", "i")))),
  310. element("del", element("sup", element("sub", "u"))),
  311. element("sup", element("sub", "strike")),
  312. element("sub", "sup"),
  313. "sub"),
  314. ".");
  315. var wikitext = "normal'''bold''italic__underline~~strike-through^superscript,,subscript''i__u~~strike^sup,,sub'''.";
  316. generateFragment.call(this, dom, wikitext);
  317. });
  318. unit.add("! bold italic", function() {
  319. var dom = element("p", element("b", element("i", "bold''''' italic")), ".");
  320. var wikitext = "'''''bold!''''' italic'''''.";
  321. generate.call(this, dom, wikitext);
  322. });
  323. unit.add("! bold", function() {
  324. var dom = element("p", element("b", "bold''' bold"), ".");
  325. var wikitext = "'''bold!''' bold'''.";
  326. generate.call(this, dom, wikitext);
  327. });
  328. unit.add("! italic", function() {
  329. var dom = element("p", element("i", "italic'' italic"), ".");
  330. var wikitext = "''italic!'' italic''.";
  331. generate.call(this, dom, wikitext);
  332. });
  333. unit.add("! underline", function() {
  334. var dom = element("p", element("u", "underline__ underline"), ".");
  335. var wikitext = "__underline!__ underline__.";
  336. generate.call(this, dom, wikitext);
  337. });
  338. unit.add("! strike-through", function() {
  339. var dom = element("p", element("del", "strike~~through"), ".");
  340. var wikitext = "~~strike!~~through~~.";
  341. generate.call(this, dom, wikitext);
  342. });
  343. unit.add("! superscript", function() {
  344. var dom = element("p", element("sup", "superscript^ superscript"), ".");
  345. var wikitext = "^superscript!^ superscript^.";
  346. generate.call(this, dom, wikitext);
  347. });
  348. unit.add("! subscript", function() {
  349. var dom = element("p", element("sub", "subscript,, subscript"), ".");
  350. var wikitext = ",,subscript!,, subscript,,.";
  351. generate.call(this, dom, wikitext);
  352. });
  353. unit.add("! monospace", function() {
  354. var dom = element("p", "{{{monospace}}} or `monospace`");
  355. var wikitext = "!{{{monospace}}} or !`monospace`";
  356. generate.call(this, dom, wikitext);
  357. });
  358. unit.add("#ticket", function() {
  359. var dom = element("p",
  360. element("a", "#1234", {
  361. href: "./search?q=ticket%3A1234", title: "ticket:1234",
  362. "tracwysiwyg-link": "ticket:1234", onclick: "return false;" }),
  363. " #2345 &#3456");
  364. var wikitext = "#1234 !#2345 &#3456";
  365. generate.call(this, dom, wikitext);
  366. });
  367. unit.add("{report}", function() {
  368. var dom = element("p",
  369. "{987}",
  370. element("a", "{123}", {
  371. href: "./search?q=report%3A123", title: "report:123",
  372. "tracwysiwyg-link": "report:123", onclick: "return false;" }));
  373. var wikitext = "!{987}{123}";
  374. generate.call(this, dom, wikitext);
  375. });
  376. unit.add("[changeset]", function() {
  377. var dom = element("p",
  378. element("a", "[123]", {
  379. href: "./search?q=changeset%3A123", title: "changeset:123",
  380. "tracwysiwyg-link": "changeset:123", onclick: "return false;" }),
  381. ", ",
  382. element("a", "r234", {
  383. href: "./search?q=changeset%3A234", title: "changeset:234",
  384. "tracwysiwyg-link": "changeset:234", onclick: "return false;" }),
  385. ", ",
  386. element("a", "[345/trunk]", {
  387. href: "./search?q=changeset%3A345%2Ftrunk", title: "changeset:345/trunk",
  388. "tracwysiwyg-link": "changeset:345/trunk", onclick: "return false;" }),
  389. ", [123], r234, [345/trunk], ar123");
  390. generate.call(this, dom, "[123], r234, [345/trunk], ![123], !r234, ![345/trunk], ar123");
  391. });
  392. unit.add("[log]", function() {
  393. var dom = element("p",
  394. "log - ",
  395. element("a", "r1:3", {
  396. href: "./search?q=log%3A%401%3A3", title: "log:@1:3",
  397. "tracwysiwyg-link": "log:@1:3", onclick: "return false;" }),
  398. ", r1:3, ",
  399. element("a", "[1:3]", {
  400. href: "./search?q=log%3A%401%3A3", title: "log:@1:3",
  401. "tracwysiwyg-link": "log:@1:3", onclick: "return false;" }),
  402. ", [1:3], ",
  403. element("a", "log:@1:3", {
  404. href: "./search?q=log%3A%401%3A3", title: "log:@1:3",
  405. "tracwysiwyg-link": "log:@1:3", onclick: "return false;" }),
  406. ", log:@1:3, ",
  407. element("a", "log:trunk@1:3", {
  408. href: "./search?q=log%3Atrunk%401%3A3", title: "log:trunk@1:3",
  409. "tracwysiwyg-link": "log:trunk@1:3", onclick: "return false;" }),
  410. ", log:trunk@1:3");
  411. generate.call(this, dom, "log - r1:3, !r1:3, [1:3], ![1:3], log:@1:3, !log:@1:3, log:trunk@1:3, !log:trunk@1:3");
  412. });
  413. unit.add("wiki:TracLinks", function() {
  414. var dom = element("p",
  415. element("a", "link:WikiName", {
  416. href: "./search?q=link%3AWikiName", title: "link:WikiName",
  417. "tracwysiwyg-link": "link:WikiName", onclick: "return false;" }),
  418. " ",
  419. element("a", 'link:"Foo Bar"', {
  420. href: "./search?q=link%3A%22Foo%20Bar%22", title: 'link:"Foo Bar"',
  421. "tracwysiwyg-link": 'link:"Foo Bar"', onclick: "return false;" }),
  422. " ",
  423. element("a", 'link:"Foo Bar#baz"', {
  424. href: "./search?q=link%3A%22Foo%20Bar%23baz%22", title: 'link:"Foo Bar#baz"',
  425. "tracwysiwyg-link": 'link:"Foo Bar#baz"', onclick: "return false;" }),
  426. " ",
  427. element("a", "link:'Foo Bar'", {
  428. href: "./search?q=" + encodeURIComponent("link:'Foo Bar'"),
  429. title: "link:'Foo Bar'", "tracwysiwyg-link": "link:'Foo Bar'",
  430. onclick: "return false;" }),
  431. " ",
  432. element("a", "link:'Foo Bar#baz'", {
  433. href: "./search?q=" + encodeURIComponent("link:'Foo Bar#baz'"),
  434. title: "link:'Foo Bar#baz'", "tracwysiwyg-link": "link:'Foo Bar#baz'",
  435. onclick: "return false;" }),
  436. " ",
  437. element("a", "svn+ssh://example.com/trunk", {
  438. href: "./search?q=" + encodeURIComponent("svn+ssh://example.com/trunk"),
  439. title: "svn+ssh://example.com/trunk", "tracwysiwyg-link": "svn+ssh://example.com/trunk",
  440. onclick: "return false;" }),
  441. " ",
  442. element("a", "repository", {
  443. href: "./search?q=" + encodeURIComponent("svn+ssh://example.com/trunk"),
  444. title: "svn+ssh://example.com/trunk", "tracwysiwyg-link": "svn+ssh://example.com/trunk",
  445. onclick: "return false;" }),
  446. " ",
  447. element("a", "rfc-2396.compatible://link", {
  448. href: "./search?q=" + encodeURIComponent("rfc-2396.compatible://link"),
  449. title: "rfc-2396.compatible://link", "tracwysiwyg-link": "rfc-2396.compatible://link",
  450. onclick: "return false;" }),
  451. " ",
  452. element("a", "RFC 2396", {
  453. href: "./search?q=" + encodeURIComponent("rfc-2396.compatible://link"),
  454. title: "rfc-2396.compatible://link", "tracwysiwyg-link": "rfc-2396.compatible://link",
  455. onclick: "return false;" }),
  456. " ",
  457. element("a", "foo:bar", {
  458. href: "./search?q=" + encodeURIComponent("foo:bar"),
  459. title: "foo:bar", "tracwysiwyg-link": "foo:bar",
  460. onclick: "return false;" }),
  461. " begin",
  462. element("a", "foo:bar", {
  463. href: "./search?q=" + encodeURIComponent("foo:bar"),
  464. title: "foo:bar", "tracwysiwyg-link": "foo:bar",
  465. onclick: "return false;" }),
  466. " ",
  467. element("a", "foo:bar", {
  468. href: "./search?q=" + encodeURIComponent("foo:bar"),
  469. title: "foo:bar", "tracwysiwyg-link": "foo:bar",
  470. onclick: "return false;" }),
  471. "end begin",
  472. element("a", "WikiStart", {
  473. href: "./search?q=" + encodeURIComponent("wiki:WikiStart"),
  474. title: "wiki:WikiStart", "tracwysiwyg-link": "wiki:WikiStart",
  475. onclick: "return false;" }),
  476. "end link:'Foo Bar#baz'");
  477. generateFragment.call(this, dom, [
  478. "link:WikiName",
  479. 'link:"Foo Bar" link:"Foo Bar#baz"',
  480. "link:'Foo Bar' link:'Foo Bar#baz'",
  481. "svn+ssh://example.com/trunk [svn+ssh://example.com/trunk repository]",
  482. "rfc-2396.compatible://link [rfc-2396.compatible://link RFC 2396]",
  483. "foo:bar begin[foo:bar foo:bar] [foo:bar foo:bar]end begin[wiki:WikiStart]end",
  484. "!link:'Foo Bar#baz'" ].join(" "));
  485. generate.call(this, dom, [
  486. "link:WikiName",
  487. 'link:"Foo Bar" link:"Foo Bar#baz"',
  488. "link:'Foo Bar' link:'Foo Bar#baz'",
  489. "svn+ssh://example.com/trunk [svn+ssh://example.com/trunk repository]",
  490. "rfc-2396.compatible://link [rfc-2396.compatible://link RFC 2396]",
  491. "foo:bar begin[foo:bar foo:bar] [foo:bar foo:bar]end begin[wiki:WikiStart]end",
  492. "!link:'Foo Bar#baz'" ].join(" "));
  493. });
  494. unit.add("[wiki:TracLinks label]", function() {
  495. var dom = element("p",
  496. element("a", "WikiName", {
  497. href: "./search?q=link%3AWikiName", title: "link:WikiName",
  498. "tracwysiwyg-link": "link:WikiName", onclick: "return false;" }),
  499. " ",
  500. element("a", "wiki name", {
  501. href: "./search?q=link%3AWikiName", title: "link:WikiName",
  502. "tracwysiwyg-link": "link:WikiName", onclick: "return false;" }),
  503. " ",
  504. element("a", "wiki]name", {
  505. href: "./search?q=wiki%3AWikiName", title: "wiki:WikiName",
  506. "tracwysiwyg-link": "wiki:WikiName", onclick: "return false;" }),
  507. " ",
  508. element("a", "wiki name", {
  509. href: "./search?q=wiki%3AWikiName", title: "wiki:WikiName",
  510. "tracwysiwyg-link": "wiki:WikiName", onclick: "return false;" }),
  511. " ",
  512. element("a", "Foo Bar", {
  513. href: "./search?q=link%3A%22Foo%20Bar%22", title: 'link:"Foo Bar"',
  514. "tracwysiwyg-link": 'link:"Foo Bar"', onclick: "return false;" }),
  515. " ",
  516. element("a", "Foo Bar#baz", {
  517. href: "./search?q=link%3A%22Foo%20Bar%23baz%22", title: 'link:"Foo Bar#baz"',
  518. "tracwysiwyg-link": 'link:"Foo Bar#baz"', onclick: "return false;" }),
  519. " ",
  520. element("a", "bar foo", {
  521. href: "./search?q=link%3A%22Foo%20Bar%22", title: 'link:"Foo Bar"',
  522. "tracwysiwyg-link": 'link:"Foo Bar"', onclick: "return false;" }),
  523. " ",
  524. element("a", 'foo "foobar" bar', {
  525. href: "./search?q=link%3A%22Foo%20Bar%23baz%22", title: 'link:"Foo Bar#baz"',
  526. "tracwysiwyg-link": 'link:"Foo Bar#baz"', onclick: "return false;" }),
  527. " ",
  528. element("a", "Foo Bar", {
  529. href: "./search?q=" + encodeURIComponent("link:'Foo Bar'"),
  530. title: "link:'Foo Bar'", "tracwysiwyg-link": "link:'Foo Bar'",
  531. onclick: "return false;" }),
  532. " ",
  533. element("a", "Foo Bar#baz", {
  534. href: "./search?q=" + encodeURIComponent("link:'Foo Bar#baz'"),
  535. title: "link:'Foo Bar#baz'", "tracwysiwyg-link": "link:'Foo Bar#baz'",
  536. onclick: "return false;" }),
  537. " ",
  538. element("a", "foo bar", {
  539. href: "./search?q=" + encodeURIComponent("link:'Foo Bar'"),
  540. title: "link:'Foo Bar'", "tracwysiwyg-link": "link:'Foo Bar'",
  541. onclick: "return false;" }),
  542. " ",
  543. element("a", "foo 'foobar' bar", {
  544. href: "./search?q=" + encodeURIComponent("link:'Foo Bar#baz'"),
  545. title: "link:'Foo Bar#baz'",
  546. "tracwysiwyg-link": "link:'Foo Bar#baz'",
  547. onclick: "return false;" }),
  548. " [link:'Foo Bar#baz'] [link:'Foo Bar#baz' label]");
  549. generateFragment.call(this, dom, [
  550. "[link:WikiName]",
  551. "[link:WikiName 'wiki name']",
  552. '[wiki:WikiName "wiki]name"]',
  553. "[WikiName 'wiki name']",
  554. '[link:"Foo Bar"] [link:"Foo Bar#baz"]',
  555. '[link:"Foo Bar" "bar foo"] [link:"Foo Bar#baz" foo "foobar" bar]',
  556. "[link:'Foo Bar'] [link:'Foo Bar#baz']",
  557. "[link:'Foo Bar' 'foo bar'] [link:'Foo Bar#baz' foo 'foobar' bar]",
  558. "![link:'Foo Bar#baz'] ![link:'Foo Bar#baz' label]" ].join(" "));
  559. generate.call(this, dom, [
  560. "[link:WikiName]",
  561. "[link:WikiName wiki name]",
  562. '[wiki:WikiName "wiki]name"]',
  563. "[wiki:WikiName wiki name]",
  564. '[link:"Foo Bar" Foo Bar] [link:"Foo Bar#baz" Foo Bar#baz]',
  565. '[link:"Foo Bar" bar foo] [link:"Foo Bar#baz" foo "foobar" bar]',
  566. "[link:'Foo Bar' Foo Bar] [link:'Foo Bar#baz' Foo Bar#baz]",
  567. "[link:'Foo Bar' foo bar] [link:'Foo Bar#baz' foo 'foobar' bar]",
  568. "![link:'Foo Bar#baz'] ![link:'Foo Bar#baz' label]" ].join(" "));
  569. });
  570. unit.add("[/relative label]", function() {
  571. var dom = element("p",
  572. element("a", "Trac", {
  573. href: "../trac", title: "../trac", "tracwysiwyg-link": "../trac",
  574. onclick: "return false;" }),
  575. " ",
  576. element("a", "here", {
  577. href: "/newticket?component=tracwysiwygplugin",
  578. title: "/newticket?component=tracwysiwygplugin",
  579. "tracwysiwyg-link": "/newticket?component=tracwysiwygplugin",
  580. onclick: "return false;" }),
  581. " ",
  582. element("a", "host", {
  583. href: "//hostname", title: "//hostname", "tracwysiwyg-link": "//hostname",
  584. onclick: "return false;" }),
  585. " ",
  586. element("a", "images", {
  587. href: "//hostname/images", title: "//hostname/images",
  588. "tracwysiwyg-link": "//hostname/images", onclick: "return false;" }),
  589. " ",
  590. element("a", "anchor", {
  591. href: "#anchor", title: "#anchor", "tracwysiwyg-link": "#anchor",
  592. onclick: "return false;" }));
  593. var wikitext = [
  594. "[../trac Trac]",
  595. "[/newticket?component=tracwysiwygplugin here]",
  596. "[//hostname host]",
  597. "[//hostname/images images]",
  598. "[#anchor anchor]" ].join(" ");
  599. generate.call(this, dom, wikitext);
  600. });
  601. unit.add("[[macro]]", function() {
  602. var dom = element("p",
  603. "Line break ", element("br"), " another line", element("br"),
  604. "last line [[bR]] ![[Br]] [[Macro]] ![[Macro]]");
  605. generateFragment.call(this, dom, "Line break [[BR]] another line[[br]]last line ![[bR]] !![[Br]] [[Macro]] ![[Macro]]");
  606. generate.call(this, dom, "Line break [[BR]] another line[[BR]]last line ![[bR]] !![[Br]] [[Macro]] ![[Macro]]");
  607. });
  608. unit.add("WikiPageName", function() {
  609. var dom = fragment(
  610. element("p",
  611. a("wiki:CamelCase", "CamelCase"),
  612. " CamelCase FooBarA FOo FoobarA OneÅngström Oneångström setTextColor"),
  613. element("p",
  614. a("wiki:WikiStart", "WikiStart"),
  615. " Wiki",
  616. a("wiki:Start", "Start"),
  617. " ",
  618. a("wiki:Wiki", "Wiki"),
  619. "Start Wiki",
  620. a("wiki:Start", "Start"),
  621. "Wiki"));
  622. generate.call(this, dom, [
  623. "CamelCase !CamelCase FooBarA FOo FoobarA OneÅngström Oneångström setTextColor",
  624. "",
  625. "WikiStart Wiki[wiki:Start] [wiki:Wiki]Start Wiki[wiki:Start]Wiki" ].join("\n"));
  626. });
  627. unit.add('["internal free link"]', function() {
  628. var dom = element("p",
  629. "link - ",
  630. element("a", "internal free link", {
  631. href: "./search?q=" + encodeURIComponent('wiki:"internal free link"'),
  632. title: 'wiki:"internal free link"', "tracwysiwyg-link": 'wiki:"internal free link"',
  633. onclick: "return false;" }),
  634. ' - ["free link"]');
  635. generate.call(this, dom, 'link - [wiki:"internal free link" internal free link] - !["free link"]');
  636. });
  637. unit.add("traclink + underline", function() {
  638. var dom = element("p",
  639. element("u", a("ticket:123", "#123")), " ",
  640. a("ticket:123", element("u", "#123")), " ",
  641. element("u", a("report:123", "{123}")), " ",
  642. a("report:123", element("u", "{123}")), " ",
  643. element("u", a("changeset:123", "[123]")), " ",
  644. a("changeset:123", element("u", "[123]")), " ",
  645. element("u", a("changeset:123", "r123")), " ",
  646. a("changeset:123", element("u", "r123")), " ",
  647. element("u", a("log:@123:234", "[123:234]")), " ",
  648. a("log:@123:234", element("u", "[123:234]")), " ",
  649. element("u", a("wiki:WikiStart", "wiki:WikiStart")), " ",
  650. a("wiki:WikiStart", element("u", "wiki:WikiStart")), " ",
  651. element("u", a("wiki:WikiStart", "WikiStart")), " ",
  652. a("wiki:WikiStart", element("u", "WikiStart")));
  653. generateWikitext.call(this, dom, [
  654. '__#123__',
  655. '__#123__',
  656. '__{123}__',
  657. '__{123}__',
  658. '__[123]__',
  659. '__[123]__',
  660. '__[changeset:123 r123]__',
  661. '__[changeset:123 r123]__',
  662. '__[123:234]__',
  663. '__[123:234]__',
  664. '__[wiki:WikiStart wiki:WikiStart]__',
  665. '__[wiki:WikiStart wiki:WikiStart]__',
  666. '__[wiki:WikiStart]__',
  667. '__[wiki:WikiStart]__' ].join(" "));
  668. });
  669. unit.add("token + br", function() {
  670. var dom = fragment(
  671. element("p", "head ", a("http://localhost/", "http://localhost/"), element("br"), "tail"),
  672. element("p", "head http://localhost/", element("br"), "tail"),
  673. element("p", "head ", element("tt", "teletype"), element("br"), "tail"),
  674. element("p", "head ", a("wiki:TracLinks", "TracLinks"), element("br"), "tail"),
  675. element("p",
  676. "head ", a("http://localhost/", "http://localhost/"), " ",
  677. a("wiki:TracLinks", "wiki:TracLinks"),
  678. element("br"),
  679. "tail"),
  680. element("p", "head http://localhost/ wiki:TracLinks", element("br"), "tail"));
  681. generateWikitext.call(this, dom, [
  682. "head http://localhost/ [[BR]]tail",
  683. "",
  684. "head !http://localhost/ [[BR]]tail",
  685. "",
  686. "head `teletype`[[BR]]tail",
  687. "",
  688. "head TracLinks[[BR]]tail",
  689. "",
  690. "head http://localhost/ wiki:TracLinks [[BR]]tail",
  691. "",
  692. "head !http://localhost/ !wiki:TracLinks [[BR]]tail" ].join("\n"));
  693. });
  694. if (window.getSelection) {
  695. unit.add("block + br", function() {
  696. function br() { return element("br"); }
  697. var wikitext = [
  698. "text, br",
  699. "",
  700. "text'', br[[BR]]''",
  701. "",
  702. "||1,1[[BR]]||||1,3||",
  703. "||||2,2[[BR]][[BR]]||",
  704. "",
  705. " * list, br[[BR]]",
  706. " * list, br",
  707. " * ",
  708. "",
  709. "text, br[[BR]]" ].join("\n")
  710. generateWikitext.call(this,
  711. fragment(
  712. element("p", "text, br", br()),
  713. element("p", "text", element("i", ", br", br()), br()),
  714. element("table", { "class": "wiki" },
  715. element("tbody",
  716. element("tr",
  717. element("td", "1,1", br(), br()),
  718. element("td", br()),
  719. element("td", "1,3", br())),
  720. element("tr",
  721. element("td", br()),
  722. element("td", "2,2", br(), br(), br())))),
  723. element("ul",
  724. element("li", "list, br", br(), br()),
  725. element("li", "list, br", br()),
  726. element("li")),
  727. element("p", "text, br", br(), br())),
  728. wikitext);
  729. generateFragment.call(this,
  730. fragment(
  731. element("p", "text, br"),
  732. element("p", "text", element("i", ", br", br()), br()),
  733. element("table", { "class": "wiki" },
  734. element("tbody",
  735. element("tr",
  736. element("td", "1,1", br(), br()),
  737. element("td", br()),
  738. element("td", "1,3")),
  739. element("tr",
  740. element("td", br()),
  741. element("td", "2,2", br(), br(), br())))),
  742. element("ul",
  743. element("li", "list, br", br(), br()),
  744. element("li", "list, br"),
  745. element("li", br())),
  746. element("p", "text, br", br(), br())),
  747. wikitext);
  748. });
  749. }
  750. else {
  751. unit.add("block + br", function() {
  752. function br() { return element("br"); }
  753. var wikitext = [
  754. "text, br",
  755. "",
  756. "text'', br[[BR]]''",
  757. "",
  758. "||1,1[[BR]]||||1,3||",
  759. "||||2,2[[BR]][[BR]]||",
  760. "",
  761. " * list, br[[BR]]",
  762. " * list, br",
  763. " * ",
  764. "",
  765. "text, br[[BR]]" ].join("\n")
  766. generate.call(this,
  767. fragment(
  768. element("p", "text, br"),
  769. element("p", "text", element("i", ", br", br())),
  770. element("table", { "class": "wiki" },
  771. element("tbody",
  772. element("tr",
  773. element("td", "1,1", br()),
  774. element("td"),
  775. element("td", "1,3")),
  776. element("tr",
  777. element("td"),
  778. element("td", "2,2", br(), br())))),
  779. element("ul",
  780. element("li", "list, br", br()),
  781. element("li", "list, br"),
  782. element("li")),
  783. element("p", "text, br", br())),
  784. wikitext);
  785. });
  786. }
  787. unit.add("citation", function() {
  788. var dom = fragment(
  789. element("blockquote", { "class": "citation" },
  790. element("p", "This is the quoted text continued"),
  791. element("blockquote", { "class": "citation" },
  792. element("p", "a nested quote"),
  793. element("blockquote", { "class": "citation" },
  794. element("p", "a nested-nested quote")))),
  795. element("p", "A comment on the above"),
  796. element("blockquote", { "class": "citation" },
  797. element("blockquote", { "class": "citation" },
  798. element("p", "start 2nd level")),
  799. element("p", "first level")));
  800. generateFragment.call(this, dom, [
  801. "> This is the quoted text",
  802. "> continued",
  803. "> > a nested quote",
  804. "> > > a nested-nested quote",
  805. "A comment on the above",
  806. "> > start 2nd level",
  807. ">first level" ].join("\n"));
  808. generate.call(this, dom, [
  809. "> This is the quoted text continued",
  810. "> > a nested quote",
  811. "> > > a nested-nested quote",
  812. "",
  813. "A comment on the above",
  814. "",
  815. "> > start 2nd level",
  816. "> first level" ].join("\n"));
  817. });
  818. unit.add("header", function() {
  819. var dom = fragment(
  820. element("h1", "Heading 1"),
  821. element("h2", { id: "anchor-2" }, "Heading 2"),
  822. element("h3", element("u", "Heading"), " ", element("i", "3")),
  823. element("h4", { id: "anchor-4" },
  824. "Heading 4 with ",
  825. element("a", "link", {
  826. href: "./search?q=" + encodeURIComponent('wiki:WikiStart'),
  827. title: 'wiki:WikiStart', "tracwysiwyg-link": 'wiki:WikiStart',
  828. onclick: "return false;" })),
  829. element("h5", "Heading 5"),
  830. element("h6", { id: "anchor-6" }, "Heading 6"));
  831. generate.call(this, dom, [
  832. "= Heading 1 =",
  833. "== Heading 2 == #anchor-2",
  834. "=== __Heading__ ''3'' ===",
  835. "==== Heading 4 with [wiki:WikiStart link] ==== #anchor-4",
  836. "===== Heading 5 =====",
  837. "====== Heading 6 ====== #anchor-6" ].join("\n"));
  838. });
  839. unit.add("list", function() {
  840. var dom = fragment(
  841. element("p", "Paragraph"),
  842. element("ul",
  843. element("li", "foo bar boo baz"),
  844. element("ul", element("li", "Subitem Subitem line 2")),
  845. element("li", "item 2 item 2 line 2")),
  846. element("p", "Paragraph"));
  847. generateFragment.call(this, dom, [
  848. "Paragraph",
  849. " * foo bar",
  850. " boo baz",
  851. " * Subitem",
  852. " Subitem line 2",
  853. " * item 2",
  854. " item 2 line 2",
  855. "Paragraph" ].join("\n"));
  856. generate.call(this, dom, [
  857. "Paragraph",
  858. "",
  859. " * foo bar boo baz",
  860. " * Subitem Subitem line 2",
  861. " * item 2 item 2 line 2",
  862. "",
  863. "Paragraph" ].join("\n"));
  864. });
  865. unit.add("list 2", function() {
  866. var dom = fragment(
  867. element("ul",
  868. element("li", "foo bar boo baz"),
  869. element("ul",
  870. element("li", "Subitem 1"),
  871. element("ul",
  872. element("li", "nested item 1"),
  873. element("li", "nested item 2 nested item 2 continued")),
  874. element("li", "Subitem 2 subitem 2 continued"),
  875. element("li", "Subitem 3 subitem 3 continued")),
  876. element("li", "item 2 item 2 line 2")),
  877. element("p", "Paragraph"));
  878. generateFragment.call(this, dom, [
  879. " * foo bar",
  880. " boo baz",
  881. " * Subitem 1",
  882. " - nested item 1",
  883. " - nested item 2",
  884. " nested item 2 continued",
  885. " * Subitem 2",
  886. " subitem 2 continued",
  887. " * Subitem 3",
  888. " subitem 3 continued",
  889. " * item 2",
  890. " item 2 line 2",
  891. "Paragraph" ].join("\n"));
  892. generate.call(this, dom, [
  893. " * foo bar boo baz",
  894. " * Subitem 1",
  895. " * nested item 1",
  896. " * nested item 2 nested item 2 continued",
  897. " * Subitem 2 subitem 2 continued",
  898. " * Subitem 3 subitem 3 continued",
  899. " * item 2 item 2 line 2",
  900. "",
  901. "Paragraph" ].join("\n"));
  902. });
  903. unit.add("ordered list", function() {
  904. var dom = fragment(
  905. element("p", "Paragraph"),
  906. element("ol",
  907. element("li", "item 1"),
  908. element("ol", { "class": "arabiczero" },
  909. element("li", "item 1.1"),
  910. element("li", "item 1.2"),
  911. element("ol", { "class": "loweralpha" },
  912. element("li", "item 1.2.a"),
  913. element("li", "item 1.2.b")),
  914. element("li", "item 1.3"),
  915. element("ol", { "class": "loweralpha" },
  916. element("li", "item 1.3.a"),
  917. element("li", "item 1.3.b")),
  918. element("li", "item 1.4"),
  919. element("ol", { "class": "upperalpha" },
  920. element("li", "item 1.4.A"),
  921. element("li", "item 1.4.B"),
  922. element("li", "item 1.4.C")),
  923. element("li", "item 1.5"),
  924. element("ol", { "class": "upperalpha" },
  925. element("li", "item 1.5.A")),
  926. element("li", "item 1.6"),
  927. element("ol", { "class": "lowerroman" },
  928. element("li", "item 1.6.i"),
  929. element("li", "item 1.6.ii")),
  930. element("li", "item 1.7"),
  931. element("ol", { "class": "upperroman" },
  932. element("li", "item 1.7.I"),
  933. element("li", "item 1.7.II")))),
  934. element("p", "Paragraph"));
  935. generateFragment.call(this, dom, [
  936. "Paragraph",
  937. " 1. item 1",
  938. " 0. item 1.1",
  939. " 2. item 1.2",
  940. " a. item 1.2.a",
  941. " z. item 1.2.b",
  942. " a. item 1.3",
  943. " b. item 1.3.a",
  944. " y. item 1.3.b",
  945. " Z. item 1.4",
  946. " A. item 1.4.A",
  947. " z. item 1.4.B",
  948. " z. item 1.4.C",
  949. " ii. item 1.5",
  950. " C. item 1.5.A",
  951. " XVI. item 1.6",
  952. " i. item 1.6.i",
  953. " x. item 1.6.ii",
  954. " 0. item 1.7",
  955. " I. item 1.7.I",
  956. " III. item 1.7.II",
  957. "Paragraph" ].join("\n"));
  958. generate.call(this, dom, [
  959. "Paragraph",
  960. "",
  961. " 1. item 1",
  962. " 0. item 1.1",
  963. " 0. item 1.2",
  964. " a. item 1.2.a",
  965. " a. item 1.2.b",
  966. " 0. item 1.3",
  967. " a. item 1.3.a",
  968. " a. item 1.3.b",
  969. " 0. item 1.4",
  970. " A. item 1.4.A",
  971. " A. item 1.4.B",
  972. " A. item 1.4.C",
  973. " 0. item 1.5",
  974. " A. item 1.5.A",
  975. " 0. item 1.6",
  976. " i. item 1.6.i",
  977. " i. item 1.6.ii",
  978. " 0. item 1.7",
  979. " I. item 1.7.I",
  980. " I. item 1.7.II",
  981. "",
  982. "Paragraph" ].join("\n"));
  983. });
  984. unit.add("list + ordered list", function() {
  985. var dom = fragment(
  986. element("ul",
  987. element("li", "Item 1"),
  988. element("ul", element("li", "Item 1.1")),
  989. element("li", "Item 2")),
  990. element("ol",
  991. element("li", "Item 1"),
  992. element("ol", { "class": "loweralpha" },
  993. element("li", "Item 1.a"),
  994. element("li", "Item 1.b"),
  995. element("ol", { "class": "lowerroman" },
  996. element("li", "Item 1.b.i"),
  997. element("li", "Item 1.b.ii"))),
  998. element("li", "Item 2")),
  999. element("p", "And numbered lists can also be given an explicit number:"),
  1000. element("ol", { start: 3 }, element("li", "Item 3")));
  1001. generateFragment.call(this, dom, [
  1002. " * Item 1",
  1003. " * Item 1.1",
  1004. " * Item 2",
  1005. " 1. Item 1",
  1006. " a. Item 1.a",
  1007. " a. Item 1.b",
  1008. " i. Item 1.b.i",
  1009. " i. Item 1.b.ii",
  1010. " 1. Item 2",
  1011. "And numbered lists can also be given an explicit number:",
  1012. " 3. Item 3" ].join("\n"));
  1013. generate.call(this, dom, [
  1014. " * Item 1",
  1015. " * Item 1.1",
  1016. " * Item 2",
  1017. "",
  1018. " 1. Item 1",
  1019. " a. Item 1.a",
  1020. " a. Item 1.b",
  1021. " i. Item 1.b.i",
  1022. " i. Item 1.b.ii",
  1023. " 1. Item 2",
  1024. "",
  1025. "And numbered lists can also be given an explicit number:",
  1026. "",
  1027. " 3. Item 3" ].join("\n"));
  1028. });
  1029. unit.add("list + code block", function() {
  1030. var dom = fragment(
  1031. element("p", "Paragraph"),
  1032. element("ul",
  1033. element("li",
  1034. "item 1",
  1035. element("pre", { "class": "wiki" }, "code")),
  1036. element("ul",
  1037. element("li",
  1038. "item 1.1",
  1039. element("pre", { "class": "wiki" }, "code"),
  1040. "cont.",
  1041. element("pre", { "class": "wiki" }, "code"))),
  1042. element("li",
  1043. "item 2",
  1044. element("pre", { "class": "wiki" }, "code"))),
  1045. element("ol", element("li", "item 1")));
  1046. generateFragment.call(this, dom, [
  1047. "Paragr…

Large files files are truncated, but you can click here to view the full file