source: tracwysiwygplugin/0.10/tests/testcase.js

Last change on this file was 13294, checked in by Jun Omae, 10 years ago

tracwysiwygplugin: use pasteHTML instead of execCommand('inserthtml') on Internet Explorer 10 (fixed #11173)

File size: 61.4 KB
Line 
1addEvent(window, "load", function() {
2    TracWysiwyg.tracPaths = { base: ".", stylesheets: [] };
3    var instance = new TracWysiwyg(document.getElementById("textarea"));
4    var contentDocument = instance.contentDocument;
5
6    var d = document;
7    var wysiwygHtml = d.getElementById("wysiwyg-html");
8    var showWysiwygHtml = d.getElementById("show-wysiwyg-html");
9    setTimeout(function() {
10        if (showWysiwygHtml.checked) {
11            var body = contentDocument.body;
12            var browserIE = body.attachEvent ? true : false;
13            var elements = body.getElementsByTagName("br");
14            var count = 0;
15            var html = body.innerHTML.replace(/<[Bb][Rr] *[^>\/]*/g, function(value) {
16                var element = elements[count++];
17                var attributes = element.attributes;
18                var length = attributes.length;
19                if (length == 0)
20                    return value;
21                var texts = [ value ];
22                for (var i = 0; i < length; i++) {
23                    var attr = attributes[i];
24                    if (!browserIE || !!element[attr.name]) {
25                        texts.push(' ', attr.name, '="', attr.value, '"');
26                    }
27                }
28                return texts.join("");
29            });
30            if (wysiwygHtml.value != html) {
31                wysiwygHtml.value = html;
32            }
33        }
34        setTimeout(arguments.callee, 500);
35    }, 500);
36
37    function generate(dom, wikitext, withoutDomToWikitext, withoutWikitextToFragment) {
38        dom = dom.cloneNode(true);
39        var anonymous = dom.ownerDocument.createElement("div");
40        anonymous.appendChild(dom);
41
42        if (!withoutWikitextToFragment) {
43            var fragment = instance.wikitextToFragment(wikitext, contentDocument);
44            var generated = contentDocument.createElement("div");
45            generated.appendChild(fragment);
46            var generatedHtml = generated.innerHTML;
47            if (!generated.addEventListener || window.opera) {
48                generatedHtml = generatedHtml.replace(/\n\r/g, "\uffff").replace(/\uffff\n?/g, "\n");
49            }
50            this.assertEqual(anonymous.innerHTML, generatedHtml, "wikitextToFragment");
51        }
52        if (!withoutDomToWikitext) {
53            this.assertEqual(wikitext, instance.domToWikitext(anonymous), "domToWikitext");
54        }
55    }
56
57    function generateFragment(dom, wikitext) {
58        generate.call(this, dom, wikitext, true);
59    }
60
61    function generateWikitext(dom, wikitext) {
62        generate.call(this, dom, wikitext, false, true);
63    }
64
65    function run() {
66        var unit = new TracWysiwyg.TestUnit();
67        var fragment = unit.fragment;
68        var element = unit.element;
69        var a = function(link, label) {
70            var attrs = {
71                href: "#data-tracwysiwyg-link=" + encodeURIComponent(link),
72                title: link, "data-tracwysiwyg-link": link, onclick: "return false;" };
73            return element("a", attrs, label || link);
74        };
75
76        unit.add("treeWalk", function() {
77            var list;
78            function iterator(node) {
79                var value;
80                if (node) {
81                    switch (node.nodeType) {
82                    case 1: value = node.tagName.toLowerCase(); break;
83                    case 3: value = "#text"; break;
84                    }
85                }
86                else {
87                    value = "(null)";
88                }
89                list.push(value);
90            }
91
92            function doTreeWalk(expected, dom) {
93                list = [];
94                instance.treeWalk(dom, iterator);
95                this.assertEqual(expected, list.join(" "));
96
97                list = [];
98                instance._treeWalkEmulation(dom, iterator);
99                this.assertEqual(expected, list.join(" "));
100            }
101
102            doTreeWalk.call(this, "p #text (null)", element("div", element("p", "paragraph")));
103            doTreeWalk.call(this, "#text (null)", element("div", element("p", "paragraph")).firstChild);
104            doTreeWalk.call(this, "(null)", element("div", element("p")).firstChild);
105
106            var dom = element("div");
107            dom.innerHTML = [
108                '<h2 id="Tables">Tables</h2>',
109                '<p>',
110                'Simple tables can be created like this:',
111                '</p>',
112                '<pre class="wiki">||Cell 1||Cell 2||Cell 3||',
113                '||Cell 4||Cell 5||Cell 6||',
114                '</pre><p>',
115                'Display:',
116                '</p>',
117                '<table class="wiki">',
118                '<tbody><tr><td>Cell 1</td><td>Cell 2</td><td>Cell 3',
119                '</td></tr><tr><td>Cell 4</td><td>Cell 5</td><td>Cell 6',
120                '</td></tr></tbody></table>',
121                '<p>',
122                'Note that more complex tables can be created using',
123                '<a class="wiki" href="/practice/wiki/WikiRestructuredText#BiggerReSTExample">reStructuredText</a>.',
124                '</p>' ].join("");
125            var expected = [
126                'h2', '#text', 'p', '#text', 'pre', '#text', 'p', '#text',
127                'table', 'tbody',
128                'tr', 'td', '#text', 'td', '#text', 'td', '#text',
129                'tr', 'td', '#text', 'td', '#text', 'td', '#text',
130                'p', '#text', 'a', '#text', '#text',
131                '(null)'].join(" ");
132            doTreeWalk.call(this, expected, dom);
133        });
134
135        unit.add("isLastChildInBlockNode", function() {
136            var dom = fragment(
137                element("p", element("br")),
138                element("p", "foobar", element("br"), "foobar"),
139                element("p", element("b", "foobar", element("br"))),
140                element("p", element("b", "foobar"), element("br")),
141                element("br"));
142            var count = 0;
143            function assert(expected, node) {
144                this.assertEqual(expected, instance.isLastChildInBlockNode(node), "#" + (count++));
145            }
146            assert.call(this, true,  dom.childNodes[0].childNodes[0]);
147            assert.call(this, false, dom.childNodes[1].childNodes[0]);
148            assert.call(this, false, dom.childNodes[1].childNodes[1]);
149            assert.call(this, true,  dom.childNodes[1].childNodes[2]);
150            assert.call(this, false, dom.childNodes[2].childNodes[0].childNodes[0]);
151            assert.call(this, true,  dom.childNodes[2].childNodes[0].childNodes[1]);
152            assert.call(this, false, dom.childNodes[3].childNodes[0].childNodes[0]);
153            assert.call(this, true,  dom.childNodes[3].childNodes[1]);
154            assert.call(this, true,  dom.childNodes[4]);
155        });
156
157        unit.add("code block", function() {
158            var dom = fragment(
159                element("p", element("tt", "abc")),
160                element("pre", { "class": "wiki" }, "{{{code-block"));
161            var wikitext = [
162                "`abc`",
163                "",
164                "{{{",
165                "{{{code-block",
166                "}}}" ].join("\n");
167            generate.call(this, dom, wikitext);
168        });
169        unit.add("code block nest", function() {
170            var dom = fragment(
171                element("pre", { "class": "wiki" }, "#!python\n= level 1\n{{{\n= level 2\n}}}\n= level 1"));
172            var wikitext = [
173                "{{{",
174                "#!python",
175                "= level 1",
176                "{{{",
177                "= level 2",
178                "}}}",
179                "= level 1",
180                "}}}" ].join("\n");
181            generate.call(this, dom, wikitext);
182        });
183
184        unit.add("paragraph", function() {
185            var dom = fragment(
186                element("p", "Paragraph continued..."),
187                element("p", "Second paragraph continued..."));
188            generateFragment.call(this, dom, [
189                "Paragraph",
190                "continued...",
191                "",
192                "Second paragraph",
193                "continued...",
194                "" ].join("\n"));
195            generate.call(this, dom, [
196                "Paragraph continued...",
197                "",
198                "Second paragraph continued..." ].join("\n"));
199        });
200
201        unit.add("hr", function() {
202            var dom = fragment(
203                element("p", "Paragraph"),
204                element("hr"),
205                element("ul",
206                    element("li", "item 1"),
207                    element("ol", element("li", "item 1.1"))),
208                element("hr"));
209            generateFragment.call(this, dom, [
210                "Paragraph",
211                "----",
212                " * item 1",
213                "   1. item 1.1",
214                "----" ].join("\n"));
215            generate.call(this, dom, [
216                "Paragraph",
217                "",
218                "----",
219                " * item 1",
220                "   1. item 1.1",
221                "",
222                "----" ].join("\n"));
223        });
224
225        unit.add("bold italic", function() {
226            var dom = element("p", element("b", element("i", "bold italic")));
227            var wikitext = "'''''bold italic'''''";
228            generate.call(this, dom, wikitext);
229        });
230        unit.add("bold", 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("b", "brown"), " fox."),
238                    element("p", "The quick ", element("strong", "brown"), " fox.")),
239                wikitext);
240            generateFragment.call(this,
241                fragment(
242                    element("p", "The quick ", element("b", "brown"), " fox."),
243                    element("p", "The quick ", element("b", "brown"), " fox.")),
244                wikitext);
245        });
246        unit.add("italic", function() {
247            var wikitext = [
248                "The quick ''brown'' fox.",
249                "",
250                "The quick ''brown'' fox." ].join("\n");
251            generateWikitext.call(this,
252                fragment(
253                    element("p", "The quick ", element("i", "brown"), " fox."),
254                    element("p", "The quick ", element("em", "brown"), " fox.")),
255                wikitext);
256            generateFragment.call(this,
257                fragment(
258                    element("p", "The quick ", element("i", "brown"), " fox."),
259                    element("p", "The quick ", element("i", "brown"), " fox.")),
260                wikitext);
261        });
262        unit.add("underline", function() {
263            var dom = element("p", element("u", "underline"));
264            var wikitext = "__underline__";
265            generate.call(this, dom, wikitext);
266        });
267        unit.add("strike-through", function() {
268            var dom = element("p", element("del", "strike-through"));
269            var wikitext = "~~strike-through~~";
270            generate.call(this, dom, wikitext);
271        });
272        unit.add("superscript", function() {
273            var dom = element("p", element("sup", "superscript"));
274            var wikitext = "^superscript^";
275            generate.call(this, dom, wikitext);
276        });
277        unit.add("subscript", function() {
278            var dom = element("p", element("sub", "subscript"));
279            var wikitext = ",,subscript,,";
280            generate.call(this, dom, wikitext);
281        });
282        unit.add("monospace", function() {
283            var dom = element("p", element("tt", "monospace"),
284                ", ", element("tt", "mono`s`pace"),
285                ", ", element("tt", "mono{{{s}}}pace"));
286            var wikitext = "`monospace`, {{{mono`s`pace}}}, `mono{{{s}}}pace`";
287            generate.call(this, dom, wikitext);
288        });
289        unit.add("italic -> bold", function() {
290            var dom = element("p",
291                "normal",
292                element("i", "italic"),
293                element("b", "bold"),
294                "normal");
295            var wikitext = "normal''italic'''''bold'''normal";
296            generate.call(this, dom, wikitext);
297        });
298        unit.add("bold -> italic", function() {
299            var dom = element("p",
300                "normal",
301                element("b", "bold"),
302                element("i", "italic"),
303                "normal");
304            var wikitext = "normal'''bold'''''italic''normal";
305            generate.call(this, dom, wikitext);
306        });
307        unit.add("[ italic [ xyz ] bold ]", function() {
308            var dom = element("p",
309                "normal",
310                element("i", "italic", element("b", "xyz")),
311                element("b", "bold"),
312                "normal");
313            var wikitext = "normal''italic'''xyz''bold'''normal";
314            generate.call(this, dom, wikitext);
315        });
316        unit.add("overlapped markups", function() {
317            var dom = element("p",
318                "normal",
319                element("b", "bold",
320                    element("i", "italic",
321                        element("u", "underline",
322                            element("del", "strike-through",
323                                element("sup", "superscript",
324                                    element("sub", "subscript"))))),
325                    element("u", element("del", element("sup", element("sub", "i")))),
326                    element("del", element("sup", element("sub", "u"))),
327                    element("sup", element("sub", "strike")),
328                    element("sub", "sup"),
329                    "sub"),
330                ".");
331            var wikitext = "normal'''bold''italic__underline~~strike-through^superscript,,subscript''i__u~~strike^sup,,sub'''.";
332            generateFragment.call(this, dom, wikitext);
333        });
334        unit.add("repeated markups", function() {
335            generateWikitext.call(this,
336                element("p", "ab", element("b", "cd"), element("b", "ef"), "gh"),
337                "ab'''cdef'''gh");
338            generateWikitext.call(this,
339                element("p", "ab", element("i", "cd"), element("i", "ef"), "gh"),
340                "ab''cdef''gh");
341            generateWikitext.call(this,
342                element("p", "ab", element("u", "cd"), element("u", "ef"), "gh"),
343                "ab__cdef__gh");
344            generateWikitext.call(this,
345                element("p", "ab", element("sup", "cd"), element("sup", "ef"), "gh"),
346                "ab^cdef^gh");
347            generateWikitext.call(this,
348                element("p", "ab", element("sub", "cd"), element("sub", "ef"), "gh"),
349                "ab,,cdef,,gh");
350            generateWikitext.call(this,
351                element("p", "ab", element("tt", "cd"), element("tt", "ef"), "gh"),
352                "ab`cd``ef`gh");
353            generateWikitext.call(this,
354                element("p", "ab",
355                             element("i", element("b", "cd")),
356                             element("b", element("i", "ef")),
357                             "gh"),
358                "ab'''''cdef'''''gh");
359        });
360        unit.add("markups without text", function() {
361            generateWikitext.call(this,
362                element("p", "abc", element("b", ""), "def"),
363                "abcdef");
364            generateWikitext.call(this,
365                element("p", "abc", element("i", ""), "def"),
366                "abcdef");
367            generateWikitext.call(this,
368                element("p", "abc", element("u", ""), "def"),
369                "abcdef");
370            generateWikitext.call(this,
371                element("p", "abc", element("sup", ""), "def"),
372                "abcdef");
373            generateWikitext.call(this,
374                element("p", "abc", element("sub", ""), "def"),
375                "abcdef");
376            generateWikitext.call(this,
377                element("p", "abc", element("tt", ""), "def"),
378                "abcdef");
379            generateWikitext.call(this,
380                element("p", "abc", element("b", element("i", "")), "def"),
381                "abcdef");
382            generateWikitext.call(this,
383                element("p", "abc", element("i", element("b", "")), "def"),
384                "abcdef");
385        });
386
387        unit.add("! bold italic", function() {
388            var dom = element("p", element("b", element("i", "bold''''' italic")), ".");
389            var wikitext = "'''''bold!''''' italic'''''.";
390            generate.call(this, dom, wikitext);
391        });
392        unit.add("! bold", function() {
393            var dom = element("p", element("b", "bold''' bold"), ".");
394            var wikitext = "'''bold!''' bold'''.";
395            generate.call(this, dom, wikitext);
396        });
397        unit.add("! italic", function() {
398            var dom = element("p", element("i", "italic'' italic"), ".");
399            var wikitext = "''italic!'' italic''.";
400            generate.call(this, dom, wikitext);
401        });
402        unit.add("! underline", function() {
403            var dom = element("p", element("u", "underline__ underline"), ".");
404            var wikitext = "__underline!__ underline__.";
405            generate.call(this, dom, wikitext);
406        });
407        unit.add("! strike-through", function() {
408            var dom = element("p", element("del", "strike~~through"), ".");
409            var wikitext = "~~strike!~~through~~.";
410            generate.call(this, dom, wikitext);
411        });
412        unit.add("! superscript", function() {
413            var dom = element("p", element("sup", "superscript^ superscript"), ".");
414            var wikitext = "^superscript!^ superscript^.";
415            generate.call(this, dom, wikitext);
416        });
417        unit.add("! subscript", function() {
418            var dom = element("p", element("sub", "subscript,, subscript"), ".");
419            var wikitext = ",,subscript!,, subscript,,.";
420            generate.call(this, dom, wikitext);
421        });
422        unit.add("! monospace", function() {
423            var dom = element("p", "{{{monospace}}} or `monospace`");
424            var wikitext = "!{{{monospace}}} or !`monospace`";
425            generate.call(this, dom, wikitext);
426        });
427
428        unit.add("#ticket", function() {
429            var dom = element("p",
430                a("ticket:1234", "#1234"),
431                " #2345 &#3456");
432            var wikitext = "#1234 !#2345 &#3456";
433            generate.call(this, dom, wikitext);
434        });
435
436        unit.add("{report}", function() {
437            var dom = element("p",
438                "{987}",
439                a("report:123", "{123}"));
440            var wikitext = "!{987}{123}";
441            generate.call(this, dom, wikitext);
442        });
443
444        unit.add("[changeset]", function() {
445            var dom = element("p",
446                a("changeset:123", "[123]"),
447                ", ",
448                a("changeset:234", "r234"),
449                ", ",
450                a("changeset:345/trunk", "[345/trunk]"),
451                ", [123], r234, [345/trunk], ar123");
452            generate.call(this, dom, "[123], r234, [345/trunk], ![123], !r234, ![345/trunk], ar123");
453        });
454
455        unit.add("[log]", function() {
456            var dom = element("p",
457                "log - ",
458                a("log:@1:3", "r1:3"),
459                ", r1:3, ",
460                a("log:@1:3", "[1:3]"),
461                ", [1:3], ",
462                a("log:@1:3", "log:@1:3"),
463                ", log:@1:3, ",
464                a("log:trunk@1:3", "log:trunk@1:3"),
465                ", log:trunk@1:3");
466            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");
467        });
468
469        unit.add("wiki:TracLinks", function() {
470            var dom = element("p",
471                a("link:WikiName", "link:WikiName"),
472                " ",
473                a('link:"Foo Bar"', 'link:"Foo Bar"'),
474                " ",
475                a('link:"Foo Bar#baz"', 'link:"Foo Bar#baz"'),
476                " ",
477                a("link:'Foo Bar'", "link:'Foo Bar'"),
478                " ",
479                a("link:'Foo Bar#baz'", "link:'Foo Bar#baz'"),
480                " ",
481                a("svn+ssh://example.com/trunk", "svn+ssh://example.com/trunk"),
482                " ",
483                a("svn+ssh://example.com/trunk", "repository"),
484                " ",
485                a("rfc-2396.compatible://link", "rfc-2396.compatible://link"),
486                " ",
487                a("rfc-2396.compatible://link", "RFC 2396"),
488                " ",
489                a("foo:bar", "foo:bar"),
490                " begin",
491                a("foo:bar", "foo:bar"),
492                " ",
493                a("foo:bar", "foo:bar"),
494                "end begin",
495                a("wiki:WikiStart", "WikiStart"),
496                "end link:'Foo Bar#baz'");
497            generateFragment.call(this, dom, [
498                "link:WikiName",
499                'link:"Foo Bar" link:"Foo Bar#baz"',
500                "link:'Foo Bar' link:'Foo Bar#baz'",
501                "svn+ssh://example.com/trunk [svn+ssh://example.com/trunk repository]",
502                "rfc-2396.compatible://link [rfc-2396.compatible://link RFC 2396]",
503                "foo:bar begin[foo:bar foo:bar] [foo:bar foo:bar]end begin[wiki:WikiStart]end",
504                "!link:'Foo Bar#baz'" ].join(" "));
505            generate.call(this, dom, [
506                "link:WikiName",
507                'link:"Foo Bar" link:"Foo Bar#baz"',
508                "link:'Foo Bar' link:'Foo Bar#baz'",
509                "svn+ssh://example.com/trunk [svn+ssh://example.com/trunk repository]",
510                "rfc-2396.compatible://link [rfc-2396.compatible://link RFC 2396]",
511                "foo:bar begin[foo:bar foo:bar] [foo:bar foo:bar]end begin[wiki:WikiStart]end",
512                "!link:'Foo Bar#baz'" ].join(" "));
513        });
514
515        unit.add("[wiki:TracLinks label]", function() {
516            var dom = element("p",
517                a("link:WikiName", "WikiName"),
518                " ",
519                a("link:WikiName", "wiki name"),
520                " ",
521                a("wiki:WikiName", "wiki]name"),
522                " ",
523                a("wiki:WikiName", "wiki name"),
524                " ",
525                a('link:"Foo Bar"', "Foo Bar"),
526                " ",
527                a('link:"Foo Bar#baz"', "Foo Bar#baz"),
528                " ",
529                a('link:"Foo Bar"', "bar foo"),
530                " ",
531                a('link:"Foo Bar#baz"', 'foo "foobar" bar'),
532                " ",
533                a("link:'Foo Bar'", "Foo Bar"),
534                " ",
535                a("link:'Foo Bar#baz'", "Foo Bar#baz"),
536                " ",
537                a("link:'Foo Bar'", "foo bar"),
538                " ",
539                a("link:'Foo Bar#baz'", "foo 'foobar' bar"),
540                " [link:'Foo Bar#baz'] [link:'Foo Bar#baz' label]");
541            generateFragment.call(this, dom, [
542                "[link:WikiName]",
543                "[link:WikiName 'wiki name']",
544                '[wiki:WikiName "wiki]name"]',
545                "[WikiName 'wiki name']",
546                '[link:"Foo Bar"] [link:"Foo Bar#baz"]',
547                '[link:"Foo Bar" "bar foo"] [link:"Foo Bar#baz" foo "foobar" bar]',
548                "[link:'Foo Bar'] [link:'Foo Bar#baz']",
549                "[link:'Foo Bar' 'foo bar'] [link:'Foo Bar#baz' foo 'foobar' bar]",
550                "![link:'Foo Bar#baz'] ![link:'Foo Bar#baz' label]" ].join(" "));
551            generate.call(this, dom, [
552                "[link:WikiName]",
553                "[link:WikiName wiki name]",
554                '[wiki:WikiName "wiki]name"]',
555                "[wiki:WikiName wiki name]",
556                '[link:"Foo Bar" Foo Bar] [link:"Foo Bar#baz" Foo Bar#baz]',
557                '[link:"Foo Bar" bar foo] [link:"Foo Bar#baz" foo "foobar" bar]',
558                "[link:'Foo Bar' Foo Bar] [link:'Foo Bar#baz' Foo Bar#baz]",
559                "[link:'Foo Bar' foo bar] [link:'Foo Bar#baz' foo 'foobar' bar]",
560                "![link:'Foo Bar#baz'] ![link:'Foo Bar#baz' label]" ].join(" "));
561        });
562
563        unit.add("[/relative label]", function() {
564            var dom = element("p",
565                a("../trac", "Trac"),
566                " ",
567                a("/newticket?component=tracwysiwygplugin", "here"),
568                " ",
569                a("//hostname", "host"),
570                " ",
571                a("//hostname/images", "images"),
572                " ",
573                a("#anchor", "anchor"));
574            var wikitext = [
575                "[../trac Trac]",
576                "[/newticket?component=tracwysiwygplugin here]",
577                "[//hostname host]",
578                "[//hostname/images images]",
579                "[#anchor anchor]" ].join(" ");
580            generate.call(this, dom, wikitext);
581        });
582
583        unit.add("[[macro]]", function() {
584            var dom = element("p",
585                "Line break ", element("br"), " another line", element("br"),
586                "last line [[bR]] ![[Br]] [[Macro]] ![[Macro]]");
587            generateFragment.call(this, dom, "Line break [[BR]] another line[[br]]last line ![[bR]] !![[Br]] [[Macro]] ![[Macro]]");
588            generate.call(this, dom, "Line break [[BR]] another line[[BR]]last line ![[bR]] !![[Br]] [[Macro]] ![[Macro]]");
589        });
590
591        unit.add("WikiPageName", function() {
592            var dom = fragment(
593                element("p",
594                    a("wiki:CamelCase", "CamelCase"),
595                    " CamelCase FooBarA FOo FoobarA OneÅngström Oneångström setTextColor"),
596                element("p",
597                    a("wiki:WikiStart", "WikiStart"),
598                    " Wiki",
599                    a("wiki:Start", "Start"),
600                    " ",
601                    a("wiki:Wiki", "Wiki"),
602                    "Start Wiki",
603                    a("wiki:Start", "Start"),
604                    "Wiki"));
605            generate.call(this, dom, [
606                "CamelCase !CamelCase FooBarA FOo FoobarA OneÅngström Oneångström setTextColor",
607                "",
608                "WikiStart Wiki[wiki:Start] [wiki:Wiki]Start Wiki[wiki:Start]Wiki" ].join("\n"));
609        });
610
611        unit.add('["internal free link"]', function() {
612            var dom = element("p",
613                "link - ",
614                a('wiki:"internal free link"', "internal free link"),
615                ' - ["free link"]');
616            generate.call(this, dom, 'link - [wiki:"internal free link" internal free link] - !["free link"]');
617        });
618
619        unit.add("traclink + underline", function() {
620            var dom = element("p",
621                element("u", a("ticket:123", "#123")), " ",
622                a("ticket:123", element("u", "#123")), " ",
623                element("u", a("report:123", "{123}")), " ",
624                a("report:123", element("u", "{123}")), " ",
625                element("u", a("changeset:123", "[123]")), " ",
626                a("changeset:123", element("u", "[123]")), " ",
627                element("u", a("changeset:123", "r123")), " ",
628                a("changeset:123", element("u", "r123")), " ",
629                element("u", a("log:@123:234", "[123:234]")), " ",
630                a("log:@123:234", element("u", "[123:234]")), " ",
631                element("u", a("wiki:WikiStart", "wiki:WikiStart")), " ",
632                a("wiki:WikiStart", element("u", "wiki:WikiStart")), " ",
633                element("u", a("wiki:WikiStart", "WikiStart")), " ",
634                a("wiki:WikiStart", element("u", "WikiStart")));
635            generateWikitext.call(this, dom, [
636                '__#123__',
637                '__#123__',
638                '__{123}__',
639                '__{123}__',
640                '__[123]__',
641                '__[123]__',
642                '__[changeset:123 r123]__',
643                '__[changeset:123 r123]__',
644                '__[123:234]__',
645                '__[123:234]__',
646                '__[wiki:WikiStart wiki:WikiStart]__',
647                '__[wiki:WikiStart wiki:WikiStart]__',
648                '__[wiki:WikiStart]__',
649                '__[wiki:WikiStart]__' ].join(" "));
650        });
651
652        unit.add("token + br", function() {
653            var dom = fragment(
654                element("p", "head ", a("http://localhost/", "http://localhost/"), element("br"), "tail"),
655                element("p", "head http://localhost/", element("br"), "tail"),
656                element("p", "head ", element("tt", "teletype"), element("br"), "tail"),
657                element("p", "head ", a("wiki:TracLinks", "TracLinks"), element("br"), "tail"),
658                element("p",
659                    "head ", a("http://localhost/", "http://localhost/"), " ",
660                    a("wiki:TracLinks", "wiki:TracLinks"),
661                    element("br"),
662                    "tail"),
663                element("p", "head http://localhost/ wiki:TracLinks", element("br"), "tail"));
664            generateWikitext.call(this, dom, [
665                "head http://localhost/ [[BR]]tail",
666                "",
667                "head !http://localhost/ [[BR]]tail",
668                "",
669                "head `teletype`[[BR]]tail",
670                "",
671                "head TracLinks[[BR]]tail",
672                "",
673                "head http://localhost/ wiki:TracLinks [[BR]]tail",
674                "",
675                "head !http://localhost/ !wiki:TracLinks [[BR]]tail" ].join("\n"));
676        });
677
678        if (window.getSelection) {
679            unit.add("block + br", function() {
680                function br() { return element("br"); }
681                var wikitext = [
682                    "text, br",
683                    "",
684                    "text'', br[[BR]]''",
685                    "",
686                    "|| 1,1[[BR]] || || 1,3 ||",
687                    "|| || 2,2[[BR]][[BR]] ||",
688                    "",
689                    " * list, br[[BR]]",
690                    " * list, br",
691                    " * ",
692                    "",
693                    "text, br[[BR]]" ].join("\n")
694                generateWikitext.call(this,
695                    fragment(
696                        element("p", "text, br", br()),
697                        element("p", "text", element("i", ", br", br()), br()),
698                        element("table", { "class": "wiki" },
699                            element("tbody",
700                                element("tr",
701                                    element("td", "1,1", br(), br()),
702                                    element("td", br()),
703                                    element("td", "1,3", br())),
704                                element("tr",
705                                    element("td", br()),
706                                    element("td", "2,2", br(), br(), br())))),
707                        element("ul",
708                            element("li", "list, br", br(), br()),
709                            element("li", "list, br", br()),
710                            element("li")),
711                        element("p", "text, br", br(), br())),
712                    wikitext);
713                generateFragment.call(this,
714                    fragment(
715                        element("p", "text, br"),
716                        element("p", "text", element("i", ", br", br()), br()),
717                        element("table", { "class": "wiki" },
718                            element("tbody",
719                                element("tr",
720                                    element("td", "1,1", br(), br()),
721                                    element("td", br()),
722                                    element("td", "1,3")),
723                                element("tr",
724                                    element("td", br()),
725                                    element("td", "2,2", br(), br(), br())))),
726                        element("ul",
727                            element("li", "list, br", br(), br()),
728                            element("li", "list, br"),
729                            element("li", br())),
730                        element("p", "text, br", br(), br())),
731                    wikitext);
732            });
733        }
734        else {
735            unit.add("block + br", function() {
736                function br() { return element("br"); }
737                var wikitext = [
738                    "text, br",
739                    "",
740                    "text'', br[[BR]]''",
741                    "",
742                    "|| 1,1[[BR]] || || 1,3 ||",
743                    "|| || 2,2[[BR]][[BR]] ||",
744                    "",
745                    " * list, br[[BR]]",
746                    " * list, br",
747                    " * ",
748                    "",
749                    "text, br[[BR]]" ].join("\n")
750                generate.call(this,
751                    fragment(
752                        element("p", "text, br"),
753                        element("p", "text", element("i", ", br", br())),
754                        element("table", { "class": "wiki" },
755                            element("tbody",
756                                element("tr",
757                                    element("td", "1,1", br()),
758                                    element("td"),
759                                    element("td", "1,3")),
760                                element("tr",
761                                    element("td"),
762                                    element("td", "2,2", br(), br())))),
763                        element("ul",
764                            element("li", "list, br", br()),
765                            element("li", "list, br"),
766                            element("li")),
767                        element("p", "text, br", br())),
768                    wikitext);
769            });
770        }
771
772        unit.add("citation", function() {
773            var dom = fragment(
774                element("blockquote", { "class": "citation" },
775                    element("p", "This is the quoted text continued"),
776                    element("blockquote", { "class": "citation" },
777                        element("p", "a nested quote"),
778                        element("blockquote", { "class": "citation" },
779                            element("p", "a nested-nested quote")))),
780                element("p", "A comment on the above"),
781                element("blockquote", { "class": "citation" },
782                    element("blockquote", { "class": "citation" },
783                        element("p", "start 2nd level")),
784                    element("p", "first level")));
785            generateFragment.call(this, dom, [
786                "> This is the quoted text",
787                "> continued",
788                "> > a nested quote",
789                "> > > a nested-nested quote",
790                "A comment on the above",
791                "> > start 2nd level",
792                ">first level" ].join("\n"));
793            generate.call(this, dom, [
794                "> This is the quoted text continued",
795                "> > a nested quote",
796                "> > > a nested-nested quote",
797                "",
798                "A comment on the above",
799                "",
800                "> > start 2nd level",
801                "> first level" ].join("\n"));
802        });
803
804        unit.add("header", function() {
805            var dom = fragment(
806                element("h1", "Heading 1"),
807                element("h2", { id: "anchor-2" }, "Heading 2"),
808                element("h3", element("u", "Heading"), " ", element("i", "3")),
809                element("h4", { id: "アンカー-4" },
810                    "Heading 4 with ",
811                    a("wiki:WikiStart", "link")),
812                element("h5", "Heading 5"),
813                element("h6", { id: "anchor-6" }, "Heading 6"));
814            generate.call(this, dom, [
815                "= Heading 1 =",
816                "== Heading 2 == #anchor-2",
817                "=== __Heading__ ''3'' ===",
818                "==== Heading 4 with [wiki:WikiStart link] ==== #アンカー-4",
819                "===== Heading 5 =====",
820                "====== Heading 6 ====== #anchor-6" ].join("\n"));
821        });
822
823        unit.add("list", function() {
824            var dom = fragment(
825                element("p", "Paragraph"),
826                element("ul",
827                    element("li", "foo bar boo baz"),
828                    element("ul", element("li", "Subitem Subitem line 2")),
829                    element("li", "item 2 item 2 line 2")),
830                element("p", "Paragraph"));
831            generateFragment.call(this, dom, [
832                "Paragraph",
833                " * foo bar",
834                "   boo baz",
835                "   * Subitem",
836                "     Subitem line 2",
837                " * item 2",
838                "   item 2 line 2",
839                "Paragraph" ].join("\n"));
840            generate.call(this, dom, [
841                "Paragraph",
842                "",
843                " * foo bar boo baz",
844                "   * Subitem Subitem line 2",
845                " * item 2 item 2 line 2",
846                "",
847                "Paragraph" ].join("\n"));
848        });
849
850        unit.add("list 2", function() {
851            var dom = fragment(
852                element("ul",
853                    element("li", "foo bar boo baz"),
854                    element("ul",
855                        element("li", "Subitem 1"),
856                        element("ul",
857                            element("li", "nested item 1"),
858                            element("li", "nested item 2 nested item 2 continued")),
859                        element("li", "Subitem 2 subitem 2 continued"),
860                        element("li", "Subitem 3 subitem 3 continued")),
861                    element("li", "item 2 item 2 line 2")),
862                element("p", "Paragraph"));
863            generateFragment.call(this, dom, [
864                "    * foo bar",
865                "      boo baz",
866                "           * Subitem 1",
867                "             - nested item 1",
868                "             - nested item 2",
869                "             nested item 2 continued",
870                "            * Subitem 2",
871                "             subitem 2 continued",
872                "            * Subitem 3",
873                "            subitem 3 continued",
874                "    * item 2",
875                "     item 2 line 2",
876                "Paragraph" ].join("\n"));
877            generate.call(this, dom, [
878                " * foo bar boo baz",
879                "   * Subitem 1",
880                "     * nested item 1",
881                "     * nested item 2 nested item 2 continued",
882                "   * Subitem 2 subitem 2 continued",
883                "   * Subitem 3 subitem 3 continued",
884                " * item 2 item 2 line 2",
885                "",
886                "Paragraph" ].join("\n"));
887        });
888
889        unit.add("ordered list", function() {
890            var dom = fragment(
891                element("p", "Paragraph"),
892                element("ol",
893                    element("li", "item 1"),
894                    element("ol", { "class": "arabiczero" },
895                        element("li", "item 1.1"),
896                        element("li", "item 1.2"),
897                        element("ol", { "class": "loweralpha" },
898                            element("li", "item 1.2.a"),
899                            element("li", "item 1.2.b")),
900                        element("li", "item 1.3"),
901                        element("ol", { "class": "loweralpha" },
902                            element("li", "item 1.3.a"),
903                            element("li", "item 1.3.b")),
904                        element("li", "item 1.4"),
905                        element("ol", { "class": "upperalpha" },
906                            element("li", "item 1.4.A"),
907                            element("li", "item 1.4.B"),
908                            element("li", "item 1.4.C")),
909                        element("li", "item 1.5"),
910                        element("ol", { "class": "upperalpha" },
911                            element("li", "item 1.5.A")),
912                        element("li", "item 1.6"),
913                        element("ol", { "class": "lowerroman" },
914                            element("li", "item 1.6.i"),
915                            element("li", "item 1.6.ii")),
916                        element("li", "item 1.7"),
917                        element("ol", { "class": "upperroman" },
918                            element("li", "item 1.7.I"),
919                            element("li", "item 1.7.II")))),
920                element("p", "Paragraph"));
921            generateFragment.call(this, dom, [
922                "Paragraph",
923                " 1. item 1",
924                "   0. item 1.1",
925                "   2. item 1.2",
926                "     a. item 1.2.a",
927                "     z. item 1.2.b",
928                "   a. item 1.3",
929                "     b. item 1.3.a",
930                "     y. item 1.3.b",
931                "   Z. item 1.4",
932                "     A. item 1.4.A",
933                "     z. item 1.4.B",
934                "     z. item 1.4.C",
935                "   ii. item 1.5",
936                "     C. item 1.5.A",
937                "   XVI. item 1.6",
938                "     i. item 1.6.i",
939                "     x. item 1.6.ii",
940                "   0. item 1.7",
941                "     I. item 1.7.I",
942                "     III. item 1.7.II",
943                "Paragraph" ].join("\n"));
944            generate.call(this, dom, [
945                "Paragraph",
946                "",
947                " 1. item 1",
948                "   0. item 1.1",
949                "   0. item 1.2",
950                "     a. item 1.2.a",
951                "     a. item 1.2.b",
952                "   0. item 1.3",
953                "     a. item 1.3.a",
954                "     a. item 1.3.b",
955                "   0. item 1.4",
956                "     A. item 1.4.A",
957                "     A. item 1.4.B",
958                "     A. item 1.4.C",
959                "   0. item 1.5",
960                "     A. item 1.5.A",
961                "   0. item 1.6",
962                "     i. item 1.6.i",
963                "     i. item 1.6.ii",
964                "   0. item 1.7",
965                "     I. item 1.7.I",
966                "     I. item 1.7.II",
967                "",
968                "Paragraph" ].join("\n"));
969        });
970
971        unit.add("list + ordered list", function() {
972            var dom = fragment(
973                element("ul",
974                    element("li", "Item 1"),
975                    element("ul", element("li", "Item 1.1")),
976                    element("li", "Item 2")),
977                element("ol",
978                    element("li", "Item 1"),
979                    element("ol", { "class": "loweralpha" },
980                        element("li", "Item 1.a"),
981                        element("li", "Item 1.b"),
982                        element("ol", { "class": "lowerroman" },
983                            element("li", "Item 1.b.i"),
984                            element("li", "Item 1.b.ii"))),
985                    element("li", "Item 2")),
986                element("p", "And numbered lists can also be given an explicit number:"),
987                element("ol", { start: 3 }, element("li", "Item 3")));
988            generateFragment.call(this, dom, [
989                " * Item 1",
990                "   * Item 1.1",
991                " * Item 2",
992                " 1. Item 1",
993                "   a. Item 1.a",
994                "   a. Item 1.b",
995                "      i. Item 1.b.i",
996                "      i. Item 1.b.ii",
997                " 1. Item 2",
998                "And numbered lists can also be given an explicit number:",
999                " 3. Item 3" ].join("\n"));
1000            generate.call(this, dom, [
1001                " * Item 1",
1002                "   * Item 1.1",
1003                " * Item 2",
1004                "",
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                "",
1012                "And numbered lists can also be given an explicit number:",
1013                "",
1014                " 3. Item 3" ].join("\n"));
1015        });
1016
1017        unit.add("list + code block", function() {
1018            var dom = fragment(
1019                element("p", "Paragraph"),
1020                element("ul",
1021                    element("li",
1022                        "item 1",
1023                        element("pre", { "class": "wiki" }, "code")),
1024                    element("ul",
1025                        element("li",
1026                            "item 1.1",
1027                            element("pre", { "class": "wiki" }, "code"),
1028                            "cont.",
1029                            element("pre", { "class": "wiki" }, "code"))),
1030                    element("li",
1031                        "item 2",
1032                        element("pre", { "class": "wiki" }, "code"))),
1033                element("ol", element("li", "item 1")));
1034            generateFragment.call(this, dom, [
1035                "Paragraph",
1036                " * item 1",
1037                "{{{",
1038                "code",
1039                "}}}",
1040                "   * item 1.1",
1041                "{{{",
1042                "code",
1043                "}}}",
1044                "     cont.",
1045                "{{{",
1046                "code",
1047                "}}}",
1048                " * item 2",
1049                "{{{",
1050                "code",
1051                "}}}",
1052                " 1. item 1" ].join("\n"));
1053            generate.call(this, dom, [
1054                "Paragraph",
1055                "",
1056                " * item 1",
1057                "{{{",
1058                "code",
1059                "}}}",
1060                "   * item 1.1",
1061                "{{{",
1062                "code",
1063                "}}}",
1064                "     cont.",
1065                "{{{",
1066                "code",
1067                "}}}",
1068                " * item 2",
1069                "{{{",
1070                "code",
1071                "}}}",
1072                "",
1073                " 1. item 1" ].join("\n"));
1074        });
1075
1076        unit.add("list + citation", function() {
1077            var dom = fragment(
1078                element('ol', element('li', 'item 1')),
1079                element('blockquote', { 'class': 'citation' }, element("p", "citation 1")),
1080                element('ul',
1081                    element('li', 'item 2'),
1082                    element("ol",
1083                        element('li', 'item 2.1'),
1084                        element('li', 'item 2.2'))),
1085                element('blockquote', { 'class': 'citation' }, element("p", "citation 2 citation 3")),
1086                element('ol', element('li', 'item 3')));
1087            generateFragment.call(this, dom, [
1088                ' 1. item 1',
1089                '> citation 1',
1090                ' * item 2',
1091                '   1. item 2.1',
1092                '   1. item 2.2',
1093                '> citation 2',
1094                '> citation 3',
1095                ' 1. item 3' ].join("\n"));
1096            generateWikitext.call(this, dom, [
1097                ' 1. item 1',
1098                '',
1099                '> citation 1',
1100                '',
1101                ' * item 2',
1102                '   1. item 2.1',
1103                '   1. item 2.2',
1104                '',
1105                '> citation 2 citation 3',
1106                '',
1107                ' 1. item 3' ].join("\n"));
1108        });
1109
1110        unit.add("definition", function() {
1111            var dom = element("dl",
1112                element("dt", "python"),
1113                element("dd", "www.python.org :: cont."),
1114                element("dt", element("b", "trac")),
1115                element("dd",
1116                    element("b", "trac"), ".edgewall.org cont.",
1117                    " ", element("tt", "trac-hacks::"), " trac-hacks.org"));
1118            generateFragment.call(this, dom, [
1119                " python:: www.python.org :: cont.",
1120                " '''trac''':: '''trac'''.edgewall.org",
1121                "   cont.",
1122                " `trac-hacks::` trac-hacks.org" ].join("\n"));
1123            generate.call(this, dom, [
1124                " python:: www.python.org :: cont.",
1125                " '''trac''':: '''trac'''.edgewall.org cont. `trac-hacks::` trac-hacks.org" ].join("\n"));
1126        });
1127
1128        unit.add("blockquote", function() {
1129            var dom = fragment(
1130                element("p", "Paragraph"),
1131                element("blockquote",
1132                    element("p", "blockquote 1 cont. 1"),
1133                    element("blockquote",
1134                        element("p", "blockquote 1.1"),
1135                        element("blockquote", element("p", "blockquote 1.1.1 cont. 1.1.1")),
1136                        element("p", "blockquote 1.2")),
1137                    element("p", "blockquote 2")),
1138                element("p", "Paragraph"));
1139            generateFragment.call(this, dom, [
1140                "Paragraph",
1141                "  blockquote 1",
1142                "  cont. 1",
1143                "    blockquote 1.1",
1144                "      blockquote 1.1.1",
1145                "      cont. 1.1.1",
1146                "     blockquote 1.2",
1147                "    blockquote 2",
1148                "Paragraph" ].join("\n"));
1149            generate.call(this, dom, [
1150                "Paragraph",
1151                "",
1152                "  blockquote 1 cont. 1",
1153                "    blockquote 1.1",
1154                "      blockquote 1.1.1 cont. 1.1.1",
1155                "    blockquote 1.2",
1156                "  blockquote 2",
1157                "",
1158                "Paragraph" ].join("\n"));
1159        });
1160
1161        unit.add("table", function() {
1162            var dom = fragment(
1163                element("p", "Paragraph"),
1164                element("table", { "class": "wiki" },
1165                    element("tbody",
1166                        element("tr", element("td", "1.1"), element("td", "1.2")),
1167                        element("tr", element("td", "2.1")),
1168                        element("tr",
1169                            element("td", "3.1"),
1170                            element("td", element("u", "3.2")),
1171                            element("td", element("tt", "3"), " ", element("tt", "-"))))),
1172                element("p", "Paragraph"));
1173            generateFragment.call(this, dom, [
1174                "Paragraph",
1175                "||1.1||1.2||",
1176                "||2.1",
1177                "||3.1||__3.2__||`3` `-`",
1178                "Paragraph" ].join("\n"));
1179            generate.call(this, dom, [
1180                "Paragraph",
1181                "",
1182                "|| 1.1 || 1.2 ||",
1183                "|| 2.1 ||",
1184                "|| 3.1 || __3.2__ || `3` `-` ||",
1185                "",
1186                "Paragraph" ].join("\n"));
1187        });
1188
1189        unit.add("table + rule", function() {
1190            var dom = fragment(
1191                element("table", { "class": "wiki" },
1192                    element("tbody", element("tr", element("td", "1st")))),
1193                element("p", element("b", "bold")),
1194                element("table", { "class": "wiki" },
1195                    element("tbody", element("tr", element("td", "2nd")))),
1196                element("p", "'''normal"));
1197            generateFragment.call(this, dom, [
1198                "||1st||",
1199                "'''bold'''",
1200                "||2nd||",
1201                "!'''normal" ].join("\n"));
1202            generate.call(this, dom, [
1203                "|| 1st ||",
1204                "",
1205                "'''bold'''",
1206                "",
1207                "|| 2nd ||",
1208                "",
1209                "!'''normal" ].join("\n"));
1210        });
1211
1212        unit.add("blockquote + table", function() {
1213            var dom = fragment(
1214                element("p", "Paragraph"),
1215                element("table", { "class": "wiki" },
1216                    element("tbody",
1217                        element("tr", element("td", "pre.1"), element("td", "pre.2")))),
1218                element("blockquote",
1219                    element("table", { "class": "wiki" },
1220                        element("tbody",
1221                            element("tr", element("td", "1.1"), element("td", "1.2")),
1222                            element("tr", element("td", "2.1")))),
1223                    element("blockquote",
1224                        element("table", { "class": "wiki" },
1225                            element("tbody",
1226                                element("tr", element("td", "deep"))))),
1227                    element("table", { "class": "wiki" },
1228                        element("tbody",
1229                            element("tr",
1230                                element("td", "3.1"),
1231                                element("td", element("u", "3.2")),
1232                                element("td", element("tt", "3.3")))))),
1233                element("table", { "class": "wiki" },
1234                    element("tbody",
1235                        element("tr", element("td", "post.1"), element("td", "post.2")))),
1236                element("p", "Paragraph"));
1237            generateFragment.call(this, dom, [
1238                "Paragraph",
1239                "||pre.1||pre.2||",
1240                " ||1.1||1.2||",
1241                " ||2.1",
1242                "  ||deep||",
1243                " ||3.1||__3.2__||`3.3`",
1244                "||post.1||post.2||",
1245                "Paragraph" ].join("\n"));
1246            generate.call(this, dom, [
1247                "Paragraph",
1248                "",
1249                "|| pre.1 || pre.2 ||",
1250                "",
1251                "  || 1.1 || 1.2 ||",
1252                "  || 2.1 ||",
1253                "    || deep ||",
1254                "  || 3.1 || __3.2__ || `3.3` ||",
1255                "",
1256                "|| post.1 || post.2 ||",
1257                "",
1258                "Paragraph" ].join("\n"));
1259        });
1260
1261        unit.add("table [ paragraph, ul ]", function() {
1262            var dom = fragment(
1263                element("table", { "class": "wiki" },
1264                    element("tbody",
1265                        element("tr",
1266                            element("td", element("p", "1.1")),
1267                            element("td",
1268                                element("ul",
1269                                    element("li", "item 1"),
1270                                    element("li", "item 2")))),
1271                        element("tr",
1272                            element("td",
1273                                element("p", "2.1"),
1274                                element("ul",
1275                                    element("li", "item 3"),
1276                                    element("li", "item 4")))))));
1277            generateWikitext.call(this, dom, [
1278                "|| 1.1 || * item 1[[BR]] * item 2 ||",
1279                "|| 2.1[[BR]][[BR]] * item 3[[BR]] * item 4 ||" ].join("\n"));
1280        });
1281
1282        unit.add("table with incomplete markups", function() {
1283            var dom = fragment(
1284                element("table", { "class": "wiki" },
1285                    element("tbody",
1286                        element("tr",
1287                            element("td", element("b", element("i", "'"))),
1288                            element("td", element("b", "bold")))
1289                    )
1290                )
1291            );
1292            generateFragment.call(this, dom, "|| '''''' || '''bold''' ||");
1293        });
1294
1295        unit.add("table from word", function() {
1296            var dom = element("div");
1297            dom.innerHTML = [
1298                '',
1299                '<table class="MsoTableGrid" style="border: medium none ; border-collapse: collapse;" border="1" cellpadding="0" cellspacing="0">',
1300                ' <tbody><tr style="">',
1301                '  <td style="border: 1pt solid windowtext; padding: 0mm 5.4pt; width: 217.55pt;" valign="top" width="290">',
1302                '  <p class="MsoNormal"><span lang="EN-US">a<o:p></o:p></span></p>',
1303                '  <p class="MsoNormal"><span lang="EN-US">b<o:p></o:p></span></p>',
1304                '  </td>',
1305                '  <td style="border-style: solid solid solid none; border-color: windowtext windowtext windowtext -moz-use-text-color; border-width: 1pt 1pt 1pt medium; padding: 0mm 5.4pt; width: 217.55pt;" valign="top" width="290">',
1306                '',
1307                '  <p class="MsoNormal"><span lang="EN-US">b<o:p></o:p></span></p>',
1308                '  </td>',
1309                ' </tr>',
1310                ' <tr style="">',
1311                '  <td style="border-style: none solid solid; border-color: -moz-use-text-color windowtext windowtext; border-width: medium 1pt 1pt; padding: 0mm 5.4pt; width: 217.55pt;" valign="top" width="290">',
1312                '  <p class="MsoNormal"><span lang="EN-US">c<o:p></o:p></span></p>',
1313                '  </td>',
1314                '  <td style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0mm 5.4pt; width: 217.55pt;" valign="top" width="290">',
1315                '',
1316                '  <p class="MsoNormal"><span lang="EN-US">d<o:p></o:p></span></p>',
1317                '  </td>',
1318                ' </tr>',
1319                '</tbody></table>',
1320                '' ].join("\n");
1321            generateWikitext.call(this, dom, [
1322                "|| a[[BR]][[BR]]b || b ||",
1323                "|| c || d ||" ].join("\n"));
1324        });
1325
1326        unit.add("domToWikitext for code block", function() {
1327            var br = function() { return element("br") };
1328            var dom = fragment(
1329                element("h1", "Heading", br(), "1"),
1330                element("h2", "Heading", br(), "2"),
1331                element("h3", "Heading", br(), "3"),
1332                element("h4", "Heading", br(), "4"),
1333                element("h5", "Heading", br(), "5"),
1334                element("h6", "Heading", br(), "6"),
1335                element("p",
1336                    "var TracWysiwyg = function(textarea) {", br(),
1337                    "...", br(),
1338                    "}"),
1339                element("blockquote", { "class": "citation" }, element("p", "citation", br(), "continued")),
1340                element("blockquote", element("p", "quote", br(), "continued")),
1341                element("ul",
1342                    element("li", "item 1", br(), "continued"),
1343                    element("ol", element("li", "item", br(), "1.1"))),
1344                element("dl",
1345                    element("dt", "def to_s(", br(), ")"),
1346                    element("dd", "dt", br(), "dd")),
1347                element("table",
1348                    element("tbody",
1349                        element("tr",
1350                            element("td", "cell", br(), "1"),
1351                            element("th", "cell", br(), "2")))));
1352            var wikitext = instance.domToWikitext(dom, { formatCodeBlock: true });
1353            this.assertEqual([
1354                "= Heading 1 =",
1355                "== Heading 2 ==",
1356                "=== Heading 3 ===",
1357                "==== Heading 4 ====",
1358                "===== Heading 5 =====",
1359                "====== Heading 6 ======",
1360                "var TracWysiwyg = function(textarea) {",
1361                "...",
1362                "}",
1363                "",
1364                "> citation",
1365                "> continued",
1366                "",
1367                "  quote",
1368                "  continued",
1369                "",
1370                " * item 1",
1371                "   continued",
1372                "   1. item",
1373                "     1.1",
1374                "",
1375                " def to_s( ):: dt",
1376                "    dd",
1377                "",
1378                "|| cell[[BR]]1 || cell[[BR]]2 ||" ].join("\n"), wikitext);
1379        });
1380
1381        unit.add("selectRange", function() {
1382            var d = instance.contentDocument;
1383            function _element() {
1384                var args = [ d ];
1385                args.push.apply(args, arguments);
1386                return element.apply(this, args);
1387            }
1388            function _text() {
1389                var args = [ d ];
1390                args.push.apply(args, arguments);
1391                return text.apply(this, args);
1392            }
1393            function assertRangeText(expected, start, startOffset, end, endOffset) {
1394                instance.selectRange(start, startOffset, end, endOffset);
1395                if (expected instanceof RegExp) {
1396                    unit.assertMatch(expected, instance.getSelectionText());
1397                }
1398                else {
1399                    unit.assertEqual(expected, instance.getSelectionText());
1400                }
1401            }
1402            var body = d.body;
1403            while (body.childNodes.length > 0) {
1404                body.removeChild(body.lastChild);
1405            }
1406            body.appendChild(fragment(d,
1407                _element("p",
1408                    "The", " quick", " brown",
1409                    _element("b", " fox", " jumps", " over"),
1410                    " the", " lazy", " dog."),
1411                _element("p", "Brick ", "quiz ", "whangs ", "jumpy ", "veldt ", "fox.")));
1412
1413            var paragraph1 = body.childNodes[0];
1414            var paragraph2 = body.childNodes[1];
1415            var bold = paragraph1.childNodes[3];
1416            assertRangeText("The", paragraph1.childNodes[0], 0, paragraph1.childNodes[0], 3);
1417            assertRangeText("he", paragraph1.childNodes[0], 1, paragraph1.childNodes[0], 3);
1418            assertRangeText("e quick brow", paragraph1.childNodes[0], 2, paragraph1.childNodes[2], 5);
1419            assertRangeText("ick brown", paragraph1.childNodes[1], 3, paragraph1.childNodes[2], 6);
1420            assertRangeText("ick brown fox j", paragraph1.childNodes[1], 3, bold.childNodes[1], 2);
1421            assertRangeText("ver the laz", bold.childNodes[2], 2, paragraph1.childNodes[5], 4);
1422            assertRangeText(" the lazy", paragraph1.childNodes[4], 0, paragraph1.childNodes[5], 5);
1423            assertRangeText("lazy dog.", paragraph1.childNodes[5], 1, paragraph1.childNodes[6], 5);
1424            assertRangeText(/^fox jumps over the lazy dog\.[\r\n]*Brick quiz whangs$/,
1425                bold.childNodes[0], 1, paragraph2.childNodes[2], 6);
1426            assertRangeText(" fox jumps over", paragraph1, 3, paragraph1, 4);
1427            assertRangeText(" dog.", paragraph1, 6, paragraph1, 7);
1428            assertRangeText("", paragraph1, 7, paragraph1, 7);
1429            assertRangeText("quick brown fox jumps over", paragraph1.childNodes[1], 1, paragraph1, 4);
1430            assertRangeText(" fox jumps over t", paragraph1, 3, paragraph1.childNodes[4], 2);
1431        });
1432
1433        unit.add("insertHTML", function() {
1434            var d = instance.contentDocument;
1435            var body = d.body;
1436            while (body.childNodes.length > 0) {
1437                body.removeChild(body.lastChild);
1438            }
1439            instance.insertHTML('<p>blah</p>');
1440            var paragraph1 = body.childNodes[0];
1441            unit.assertEqual('blah', paragraph1.innerHTML);
1442        });
1443
1444        unit.run();
1445    }
1446
1447    var button = document.createElement("button");
1448    button.innerHTML = "run &#187;";
1449    button.style.textDecoration = "underline";
1450    document.body.appendChild(button);
1451    addEvent(button, "click", run);
1452    button.focus();
1453});
Note: See TracBrowser for help on using the repository browser.