annotate static/js/pagedown/Markdown.Converter.js @ 149:d29e2f337b00

Updated to Bootstrap 3.0.
author Ludovic Chabant <ludovic@chabant.com>
date Thu, 12 Dec 2013 21:54:04 -0800
parents 8250c977bc50
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
3
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1 var Markdown;
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
2
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
3 if (typeof exports === "object" && typeof require === "function") // we're in a CommonJS (e.g. Node.js) module
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
4 Markdown = exports;
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
5 else
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
6 Markdown = {};
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
7
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
8 // The following text is included for historical reasons, but should
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
9 // be taken with a pinch of salt; it's not all true anymore.
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
10
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
11 //
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
12 // Wherever possible, Showdown is a straight, line-by-line port
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
13 // of the Perl version of Markdown.
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
14 //
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
15 // This is not a normal parser design; it's basically just a
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
16 // series of string substitutions. It's hard to read and
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
17 // maintain this way, but keeping Showdown close to the original
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
18 // design makes it easier to port new features.
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
19 //
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
20 // More importantly, Showdown behaves like markdown.pl in most
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
21 // edge cases. So web applications can do client-side preview
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
22 // in Javascript, and then build identical HTML on the server.
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
23 //
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
24 // This port needs the new RegExp functionality of ECMA 262,
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
25 // 3rd Edition (i.e. Javascript 1.5). Most modern web browsers
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
26 // should do fine. Even with the new regular expression features,
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
27 // We do a lot of work to emulate Perl's regex functionality.
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
28 // The tricky changes in this file mostly have the "attacklab:"
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
29 // label. Major or self-explanatory changes don't.
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
30 //
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
31 // Smart diff tools like Araxis Merge will be able to match up
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
32 // this file with markdown.pl in a useful way. A little tweaking
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
33 // helps: in a copy of markdown.pl, replace "#" with "//" and
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
34 // replace "$text" with "text". Be sure to ignore whitespace
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
35 // and line endings.
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
36 //
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
37
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
38
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
39 //
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
40 // Usage:
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
41 //
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
42 // var text = "Markdown *rocks*.";
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
43 //
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
44 // var converter = new Markdown.Converter();
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
45 // var html = converter.makeHtml(text);
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
46 //
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
47 // alert(html);
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
48 //
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
49 // Note: move the sample code to the bottom of this
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
50 // file before uncommenting it.
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
51 //
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
52
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
53 (function () {
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
54
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
55 function identity(x) { return x; }
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
56 function returnFalse(x) { return false; }
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
57
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
58 function HookCollection() { }
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
59
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
60 HookCollection.prototype = {
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
61
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
62 chain: function (hookname, func) {
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
63 var original = this[hookname];
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
64 if (!original)
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
65 throw new Error("unknown hook " + hookname);
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
66
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
67 if (original === identity)
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
68 this[hookname] = func;
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
69 else
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
70 this[hookname] = function (x) { return func(original(x)); }
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
71 },
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
72 set: function (hookname, func) {
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
73 if (!this[hookname])
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
74 throw new Error("unknown hook " + hookname);
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
75 this[hookname] = func;
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
76 },
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
77 addNoop: function (hookname) {
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
78 this[hookname] = identity;
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
79 },
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
80 addFalse: function (hookname) {
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
81 this[hookname] = returnFalse;
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
82 }
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
83 };
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
84
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
85 Markdown.HookCollection = HookCollection;
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
86
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
87 // g_urls and g_titles allow arbitrary user-entered strings as keys. This
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
88 // caused an exception (and hence stopped the rendering) when the user entered
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
89 // e.g. [push] or [__proto__]. Adding a prefix to the actual key prevents this
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
90 // (since no builtin property starts with "s_"). See
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
91 // http://meta.stackoverflow.com/questions/64655/strange-wmd-bug
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
92 // (granted, switching from Array() to Object() alone would have left only __proto__
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
93 // to be a problem)
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
94 function SaveHash() { }
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
95 SaveHash.prototype = {
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
96 set: function (key, value) {
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
97 this["s_" + key] = value;
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
98 },
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
99 get: function (key) {
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
100 return this["s_" + key];
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
101 }
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
102 };
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
103
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
104 Markdown.Converter = function () {
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
105 var pluginHooks = this.hooks = new HookCollection();
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
106 pluginHooks.addNoop("plainLinkText"); // given a URL that was encountered by itself (without markup), should return the link text that's to be given to this link
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
107 pluginHooks.addNoop("preConversion"); // called with the orignal text as given to makeHtml. The result of this plugin hook is the actual markdown source that will be cooked
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
108 pluginHooks.addNoop("postConversion"); // called with the final cooked HTML code. The result of this plugin hook is the actual output of makeHtml
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
109
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
110 //
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
111 // Private state of the converter instance:
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
112 //
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
113
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
114 // Global hashes, used by various utility routines
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
115 var g_urls;
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
116 var g_titles;
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
117 var g_html_blocks;
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
118
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
119 // Used to track when we're inside an ordered or unordered list
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
120 // (see _ProcessListItems() for details):
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
121 var g_list_level;
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
122
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
123 this.makeHtml = function (text) {
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
124
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
125 //
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
126 // Main function. The order in which other subs are called here is
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
127 // essential. Link and image substitutions need to happen before
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
128 // _EscapeSpecialCharsWithinTagAttributes(), so that any *'s or _'s in the <a>
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
129 // and <img> tags get encoded.
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
130 //
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
131
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
132 // This will only happen if makeHtml on the same converter instance is called from a plugin hook.
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
133 // Don't do that.
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
134 if (g_urls)
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
135 throw new Error("Recursive call to converter.makeHtml");
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
136
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
137 // Create the private state objects.
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
138 g_urls = new SaveHash();
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
139 g_titles = new SaveHash();
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
140 g_html_blocks = [];
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
141 g_list_level = 0;
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
142
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
143 text = pluginHooks.preConversion(text);
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
144
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
145 // attacklab: Replace ~ with ~T
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
146 // This lets us use tilde as an escape char to avoid md5 hashes
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
147 // The choice of character is arbitray; anything that isn't
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
148 // magic in Markdown will work.
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
149 text = text.replace(/~/g, "~T");
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
150
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
151 // attacklab: Replace $ with ~D
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
152 // RegExp interprets $ as a special character
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
153 // when it's in a replacement string
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
154 text = text.replace(/\$/g, "~D");
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
155
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
156 // Standardize line endings
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
157 text = text.replace(/\r\n/g, "\n"); // DOS to Unix
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
158 text = text.replace(/\r/g, "\n"); // Mac to Unix
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
159
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
160 // Make sure text begins and ends with a couple of newlines:
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
161 text = "\n\n" + text + "\n\n";
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
162
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
163 // Convert all tabs to spaces.
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
164 text = _Detab(text);
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
165
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
166 // Strip any lines consisting only of spaces and tabs.
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
167 // This makes subsequent regexen easier to write, because we can
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
168 // match consecutive blank lines with /\n+/ instead of something
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
169 // contorted like /[ \t]*\n+/ .
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
170 text = text.replace(/^[ \t]+$/mg, "");
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
171
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
172 // Turn block-level HTML blocks into hash entries
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
173 text = _HashHTMLBlocks(text);
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
174
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
175 // Strip link definitions, store in hashes.
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
176 text = _StripLinkDefinitions(text);
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
177
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
178 text = _RunBlockGamut(text);
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
179
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
180 text = _UnescapeSpecialChars(text);
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
181
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
182 // attacklab: Restore dollar signs
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
183 text = text.replace(/~D/g, "$$");
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
184
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
185 // attacklab: Restore tildes
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
186 text = text.replace(/~T/g, "~");
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
187
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
188 text = pluginHooks.postConversion(text);
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
189
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
190 g_html_blocks = g_titles = g_urls = null;
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
191
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
192 return text;
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
193 };
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
194
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
195 function _StripLinkDefinitions(text) {
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
196 //
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
197 // Strips link definitions from text, stores the URLs and titles in
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
198 // hash references.
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
199 //
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
200
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
201 // Link defs are in the form: ^[id]: url "optional title"
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
202
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
203 /*
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
204 text = text.replace(/
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
205 ^[ ]{0,3}\[(.+)\]: // id = $1 attacklab: g_tab_width - 1
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
206 [ \t]*
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
207 \n? // maybe *one* newline
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
208 [ \t]*
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
209 <?(\S+?)>? // url = $2
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
210 (?=\s|$) // lookahead for whitespace instead of the lookbehind removed below
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
211 [ \t]*
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
212 \n? // maybe one newline
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
213 [ \t]*
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
214 ( // (potential) title = $3
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
215 (\n*) // any lines skipped = $4 attacklab: lookbehind removed
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
216 [ \t]+
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
217 ["(]
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
218 (.+?) // title = $5
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
219 [")]
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
220 [ \t]*
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
221 )? // title is optional
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
222 (?:\n+|$)
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
223 /gm, function(){...});
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
224 */
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
225
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
226 text = text.replace(/^[ ]{0,3}\[(.+)\]:[ \t]*\n?[ \t]*<?(\S+?)>?(?=\s|$)[ \t]*\n?[ \t]*((\n*)["(](.+?)[")][ \t]*)?(?:\n+)/gm,
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
227 function (wholeMatch, m1, m2, m3, m4, m5) {
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
228 m1 = m1.toLowerCase();
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
229 g_urls.set(m1, _EncodeAmpsAndAngles(m2)); // Link IDs are case-insensitive
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
230 if (m4) {
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
231 // Oops, found blank lines, so it's not a title.
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
232 // Put back the parenthetical statement we stole.
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
233 return m3;
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
234 } else if (m5) {
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
235 g_titles.set(m1, m5.replace(/"/g, "&quot;"));
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
236 }
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
237
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
238 // Completely remove the definition from the text
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
239 return "";
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
240 }
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
241 );
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
242
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
243 return text;
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
244 }
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
245
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
246 function _HashHTMLBlocks(text) {
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
247
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
248 // Hashify HTML blocks:
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
249 // We only want to do this for block-level HTML tags, such as headers,
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
250 // lists, and tables. That's because we still want to wrap <p>s around
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
251 // "paragraphs" that are wrapped in non-block-level tags, such as anchors,
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
252 // phrase emphasis, and spans. The list of tags we're looking for is
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
253 // hard-coded:
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
254 var block_tags_a = "p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|script|noscript|form|fieldset|iframe|math|ins|del"
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
255 var block_tags_b = "p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|script|noscript|form|fieldset|iframe|math"
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
256
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
257 // First, look for nested blocks, e.g.:
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
258 // <div>
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
259 // <div>
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
260 // tags for inner block must be indented.
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
261 // </div>
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
262 // </div>
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
263 //
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
264 // The outermost tags must start at the left margin for this to match, and
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
265 // the inner nested divs must be indented.
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
266 // We need to do this before the next, more liberal match, because the next
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
267 // match will start at the first `<div>` and stop at the first `</div>`.
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
268
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
269 // attacklab: This regex can be expensive when it fails.
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
270
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
271 /*
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
272 text = text.replace(/
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
273 ( // save in $1
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
274 ^ // start of line (with /m)
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
275 <($block_tags_a) // start tag = $2
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
276 \b // word break
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
277 // attacklab: hack around khtml/pcre bug...
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
278 [^\r]*?\n // any number of lines, minimally matching
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
279 </\2> // the matching end tag
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
280 [ \t]* // trailing spaces/tabs
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
281 (?=\n+) // followed by a newline
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
282 ) // attacklab: there are sentinel newlines at end of document
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
283 /gm,function(){...}};
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
284 */
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
285 text = text.replace(/^(<(p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|script|noscript|form|fieldset|iframe|math|ins|del)\b[^\r]*?\n<\/\2>[ \t]*(?=\n+))/gm, hashElement);
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
286
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
287 //
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
288 // Now match more liberally, simply from `\n<tag>` to `</tag>\n`
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
289 //
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
290
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
291 /*
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
292 text = text.replace(/
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
293 ( // save in $1
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
294 ^ // start of line (with /m)
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
295 <($block_tags_b) // start tag = $2
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
296 \b // word break
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
297 // attacklab: hack around khtml/pcre bug...
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
298 [^\r]*? // any number of lines, minimally matching
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
299 .*</\2> // the matching end tag
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
300 [ \t]* // trailing spaces/tabs
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
301 (?=\n+) // followed by a newline
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
302 ) // attacklab: there are sentinel newlines at end of document
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
303 /gm,function(){...}};
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
304 */
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
305 text = text.replace(/^(<(p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|script|noscript|form|fieldset|iframe|math)\b[^\r]*?.*<\/\2>[ \t]*(?=\n+)\n)/gm, hashElement);
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
306
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
307 // Special case just for <hr />. It was easier to make a special case than
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
308 // to make the other regex more complicated.
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
309
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
310 /*
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
311 text = text.replace(/
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
312 \n // Starting after a blank line
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
313 [ ]{0,3}
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
314 ( // save in $1
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
315 (<(hr) // start tag = $2
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
316 \b // word break
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
317 ([^<>])*?
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
318 \/?>) // the matching end tag
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
319 [ \t]*
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
320 (?=\n{2,}) // followed by a blank line
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
321 )
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
322 /g,hashElement);
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
323 */
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
324 text = text.replace(/\n[ ]{0,3}((<(hr)\b([^<>])*?\/?>)[ \t]*(?=\n{2,}))/g, hashElement);
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
325
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
326 // Special case for standalone HTML comments:
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
327
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
328 /*
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
329 text = text.replace(/
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
330 \n\n // Starting after a blank line
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
331 [ ]{0,3} // attacklab: g_tab_width - 1
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
332 ( // save in $1
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
333 <!
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
334 (--(?:|(?:[^>-]|-[^>])(?:[^-]|-[^-])*)--) // see http://www.w3.org/TR/html-markup/syntax.html#comments and http://meta.stackoverflow.com/q/95256
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
335 >
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
336 [ \t]*
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
337 (?=\n{2,}) // followed by a blank line
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
338 )
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
339 /g,hashElement);
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
340 */
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
341 text = text.replace(/\n\n[ ]{0,3}(<!(--(?:|(?:[^>-]|-[^>])(?:[^-]|-[^-])*)--)>[ \t]*(?=\n{2,}))/g, hashElement);
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
342
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
343 // PHP and ASP-style processor instructions (<?...?> and <%...%>)
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
344
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
345 /*
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
346 text = text.replace(/
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
347 (?:
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
348 \n\n // Starting after a blank line
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
349 )
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
350 ( // save in $1
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
351 [ ]{0,3} // attacklab: g_tab_width - 1
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
352 (?:
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
353 <([?%]) // $2
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
354 [^\r]*?
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
355 \2>
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
356 )
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
357 [ \t]*
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
358 (?=\n{2,}) // followed by a blank line
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
359 )
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
360 /g,hashElement);
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
361 */
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
362 text = text.replace(/(?:\n\n)([ ]{0,3}(?:<([?%])[^\r]*?\2>)[ \t]*(?=\n{2,}))/g, hashElement);
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
363
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
364 return text;
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
365 }
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
366
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
367 function hashElement(wholeMatch, m1) {
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
368 var blockText = m1;
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
369
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
370 // Undo double lines
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
371 blockText = blockText.replace(/^\n+/, "");
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
372
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
373 // strip trailing blank lines
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
374 blockText = blockText.replace(/\n+$/g, "");
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
375
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
376 // Replace the element text with a marker ("~KxK" where x is its key)
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
377 blockText = "\n\n~K" + (g_html_blocks.push(blockText) - 1) + "K\n\n";
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
378
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
379 return blockText;
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
380 }
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
381
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
382 function _RunBlockGamut(text, doNotUnhash) {
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
383 //
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
384 // These are all the transformations that form block-level
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
385 // tags like paragraphs, headers, and list items.
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
386 //
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
387 text = _DoHeaders(text);
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
388
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
389 // Do Horizontal Rules:
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
390 var replacement = "<hr />\n";
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
391 text = text.replace(/^[ ]{0,2}([ ]?\*[ ]?){3,}[ \t]*$/gm, replacement);
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
392 text = text.replace(/^[ ]{0,2}([ ]?-[ ]?){3,}[ \t]*$/gm, replacement);
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
393 text = text.replace(/^[ ]{0,2}([ ]?_[ ]?){3,}[ \t]*$/gm, replacement);
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
394
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
395 text = _DoLists(text);
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
396 text = _DoCodeBlocks(text);
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
397 text = _DoBlockQuotes(text);
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
398
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
399 // We already ran _HashHTMLBlocks() before, in Markdown(), but that
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
400 // was to escape raw HTML in the original Markdown source. This time,
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
401 // we're escaping the markup we've just created, so that we don't wrap
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
402 // <p> tags around block-level tags.
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
403 text = _HashHTMLBlocks(text);
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
404 text = _FormParagraphs(text, doNotUnhash);
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
405
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
406 return text;
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
407 }
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
408
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
409 function _RunSpanGamut(text) {
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
410 //
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
411 // These are all the transformations that occur *within* block-level
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
412 // tags like paragraphs, headers, and list items.
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
413 //
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
414
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
415 text = _DoCodeSpans(text);
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
416 text = _EscapeSpecialCharsWithinTagAttributes(text);
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
417 text = _EncodeBackslashEscapes(text);
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
418
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
419 // Process anchor and image tags. Images must come first,
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
420 // because ![foo][f] looks like an anchor.
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
421 text = _DoImages(text);
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
422 text = _DoAnchors(text);
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
423
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
424 // Make links out of things like `<http://example.com/>`
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
425 // Must come after _DoAnchors(), because you can use < and >
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
426 // delimiters in inline links like [this](<url>).
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
427 text = _DoAutoLinks(text);
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
428
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
429 text = text.replace(/~P/g, "://"); // put in place to prevent autolinking; reset now
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
430
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
431 text = _EncodeAmpsAndAngles(text);
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
432 text = _DoItalicsAndBold(text);
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
433
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
434 // Do hard breaks:
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
435 text = text.replace(/ +\n/g, " <br>\n");
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
436
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
437 return text;
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
438 }
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
439
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
440 function _EscapeSpecialCharsWithinTagAttributes(text) {
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
441 //
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
442 // Within tags -- meaning between < and > -- encode [\ ` * _] so they
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
443 // don't conflict with their use in Markdown for code, italics and strong.
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
444 //
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
445
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
446 // Build a regex to find HTML tags and comments. See Friedl's
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
447 // "Mastering Regular Expressions", 2nd Ed., pp. 200-201.
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
448
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
449 // SE: changed the comment part of the regex
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
450
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
451 var regex = /(<[a-z\/!$]("[^"]*"|'[^']*'|[^'">])*>|<!(--(?:|(?:[^>-]|-[^>])(?:[^-]|-[^-])*)--)>)/gi;
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
452
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
453 text = text.replace(regex, function (wholeMatch) {
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
454 var tag = wholeMatch.replace(/(.)<\/?code>(?=.)/g, "$1`");
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
455 tag = escapeCharacters(tag, wholeMatch.charAt(1) == "!" ? "\\`*_/" : "\\`*_"); // also escape slashes in comments to prevent autolinking there -- http://meta.stackoverflow.com/questions/95987
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
456 return tag;
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
457 });
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
458
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
459 return text;
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
460 }
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
461
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
462 function _DoAnchors(text) {
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
463 //
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
464 // Turn Markdown link shortcuts into XHTML <a> tags.
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
465 //
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
466 //
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
467 // First, handle reference-style links: [link text] [id]
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
468 //
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
469
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
470 /*
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
471 text = text.replace(/
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
472 ( // wrap whole match in $1
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
473 \[
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
474 (
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
475 (?:
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
476 \[[^\]]*\] // allow brackets nested one level
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
477 |
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
478 [^\[] // or anything else
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
479 )*
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
480 )
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
481 \]
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
482
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
483 [ ]? // one optional space
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
484 (?:\n[ ]*)? // one optional newline followed by spaces
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
485
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
486 \[
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
487 (.*?) // id = $3
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
488 \]
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
489 )
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
490 ()()()() // pad remaining backreferences
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
491 /g, writeAnchorTag);
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
492 */
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
493 text = text.replace(/(\[((?:\[[^\]]*\]|[^\[\]])*)\][ ]?(?:\n[ ]*)?\[(.*?)\])()()()()/g, writeAnchorTag);
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
494
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
495 //
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
496 // Next, inline-style links: [link text](url "optional title")
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
497 //
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
498
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
499 /*
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
500 text = text.replace(/
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
501 ( // wrap whole match in $1
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
502 \[
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
503 (
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
504 (?:
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
505 \[[^\]]*\] // allow brackets nested one level
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
506 |
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
507 [^\[\]] // or anything else
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
508 )*
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
509 )
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
510 \]
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
511 \( // literal paren
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
512 [ \t]*
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
513 () // no id, so leave $3 empty
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
514 <?( // href = $4
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
515 (?:
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
516 \([^)]*\) // allow one level of (correctly nested) parens (think MSDN)
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
517 |
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
518 [^()\s]
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
519 )*?
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
520 )>?
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
521 [ \t]*
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
522 ( // $5
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
523 (['"]) // quote char = $6
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
524 (.*?) // Title = $7
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
525 \6 // matching quote
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
526 [ \t]* // ignore any spaces/tabs between closing quote and )
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
527 )? // title is optional
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
528 \)
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
529 )
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
530 /g, writeAnchorTag);
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
531 */
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
532
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
533 text = text.replace(/(\[((?:\[[^\]]*\]|[^\[\]])*)\]\([ \t]*()<?((?:\([^)]*\)|[^()\s])*?)>?[ \t]*((['"])(.*?)\6[ \t]*)?\))/g, writeAnchorTag);
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
534
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
535 //
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
536 // Last, handle reference-style shortcuts: [link text]
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
537 // These must come last in case you've also got [link test][1]
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
538 // or [link test](/foo)
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
539 //
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
540
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
541 /*
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
542 text = text.replace(/
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
543 ( // wrap whole match in $1
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
544 \[
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
545 ([^\[\]]+) // link text = $2; can't contain '[' or ']'
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
546 \]
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
547 )
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
548 ()()()()() // pad rest of backreferences
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
549 /g, writeAnchorTag);
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
550 */
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
551 text = text.replace(/(\[([^\[\]]+)\])()()()()()/g, writeAnchorTag);
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
552
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
553 return text;
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
554 }
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
555
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
556 function writeAnchorTag(wholeMatch, m1, m2, m3, m4, m5, m6, m7) {
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
557 if (m7 == undefined) m7 = "";
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
558 var whole_match = m1;
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
559 var link_text = m2.replace(/:\/\//g, "~P"); // to prevent auto-linking withing the link. will be converted back after the auto-linker runs
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
560 var link_id = m3.toLowerCase();
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
561 var url = m4;
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
562 var title = m7;
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
563
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
564 if (url == "") {
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
565 if (link_id == "") {
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
566 // lower-case and turn embedded newlines into spaces
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
567 link_id = link_text.toLowerCase().replace(/ ?\n/g, " ");
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
568 }
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
569 url = "#" + link_id;
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
570
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
571 if (g_urls.get(link_id) != undefined) {
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
572 url = g_urls.get(link_id);
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
573 if (g_titles.get(link_id) != undefined) {
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
574 title = g_titles.get(link_id);
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
575 }
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
576 }
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
577 else {
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
578 if (whole_match.search(/\(\s*\)$/m) > -1) {
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
579 // Special case for explicit empty url
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
580 url = "";
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
581 } else {
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
582 return whole_match;
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
583 }
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
584 }
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
585 }
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
586 url = encodeProblemUrlChars(url);
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
587 url = escapeCharacters(url, "*_");
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
588 var result = "<a href=\"" + url + "\"";
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
589
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
590 if (title != "") {
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
591 title = attributeEncode(title);
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
592 title = escapeCharacters(title, "*_");
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
593 result += " title=\"" + title + "\"";
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
594 }
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
595
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
596 result += ">" + link_text + "</a>";
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
597
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
598 return result;
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
599 }
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
600
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
601 function _DoImages(text) {
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
602 //
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
603 // Turn Markdown image shortcuts into <img> tags.
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
604 //
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
605
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
606 //
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
607 // First, handle reference-style labeled images: ![alt text][id]
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
608 //
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
609
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
610 /*
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
611 text = text.replace(/
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
612 ( // wrap whole match in $1
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
613 !\[
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
614 (.*?) // alt text = $2
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
615 \]
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
616
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
617 [ ]? // one optional space
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
618 (?:\n[ ]*)? // one optional newline followed by spaces
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
619
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
620 \[
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
621 (.*?) // id = $3
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
622 \]
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
623 )
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
624 ()()()() // pad rest of backreferences
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
625 /g, writeImageTag);
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
626 */
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
627 text = text.replace(/(!\[(.*?)\][ ]?(?:\n[ ]*)?\[(.*?)\])()()()()/g, writeImageTag);
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
628
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
629 //
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
630 // Next, handle inline images: ![alt text](url "optional title")
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
631 // Don't forget: encode * and _
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
632
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
633 /*
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
634 text = text.replace(/
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
635 ( // wrap whole match in $1
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
636 !\[
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
637 (.*?) // alt text = $2
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
638 \]
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
639 \s? // One optional whitespace character
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
640 \( // literal paren
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
641 [ \t]*
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
642 () // no id, so leave $3 empty
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
643 <?(\S+?)>? // src url = $4
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
644 [ \t]*
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
645 ( // $5
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
646 (['"]) // quote char = $6
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
647 (.*?) // title = $7
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
648 \6 // matching quote
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
649 [ \t]*
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
650 )? // title is optional
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
651 \)
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
652 )
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
653 /g, writeImageTag);
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
654 */
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
655 text = text.replace(/(!\[(.*?)\]\s?\([ \t]*()<?(\S+?)>?[ \t]*((['"])(.*?)\6[ \t]*)?\))/g, writeImageTag);
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
656
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
657 return text;
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
658 }
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
659
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
660 function attributeEncode(text) {
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
661 // unconditionally replace angle brackets here -- what ends up in an attribute (e.g. alt or title)
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
662 // never makes sense to have verbatim HTML in it (and the sanitizer would totally break it)
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
663 return text.replace(/>/g, "&gt;").replace(/</g, "&lt;").replace(/"/g, "&quot;");
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
664 }
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
665
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
666 function writeImageTag(wholeMatch, m1, m2, m3, m4, m5, m6, m7) {
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
667 var whole_match = m1;
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
668 var alt_text = m2;
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
669 var link_id = m3.toLowerCase();
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
670 var url = m4;
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
671 var title = m7;
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
672
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
673 if (!title) title = "";
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
674
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
675 if (url == "") {
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
676 if (link_id == "") {
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
677 // lower-case and turn embedded newlines into spaces
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
678 link_id = alt_text.toLowerCase().replace(/ ?\n/g, " ");
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
679 }
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
680 url = "#" + link_id;
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
681
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
682 if (g_urls.get(link_id) != undefined) {
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
683 url = g_urls.get(link_id);
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
684 if (g_titles.get(link_id) != undefined) {
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
685 title = g_titles.get(link_id);
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
686 }
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
687 }
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
688 else {
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
689 return whole_match;
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
690 }
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
691 }
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
692
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
693 alt_text = escapeCharacters(attributeEncode(alt_text), "*_[]()");
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
694 url = escapeCharacters(url, "*_");
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
695 var result = "<img src=\"" + url + "\" alt=\"" + alt_text + "\"";
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
696
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
697 // attacklab: Markdown.pl adds empty title attributes to images.
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
698 // Replicate this bug.
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
699
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
700 //if (title != "") {
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
701 title = attributeEncode(title);
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
702 title = escapeCharacters(title, "*_");
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
703 result += " title=\"" + title + "\"";
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
704 //}
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
705
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
706 result += " />";
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
707
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
708 return result;
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
709 }
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
710
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
711 function _DoHeaders(text) {
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
712
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
713 // Setext-style headers:
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
714 // Header 1
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
715 // ========
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
716 //
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
717 // Header 2
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
718 // --------
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
719 //
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
720 text = text.replace(/^(.+)[ \t]*\n=+[ \t]*\n+/gm,
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
721 function (wholeMatch, m1) { return "<h1>" + _RunSpanGamut(m1) + "</h1>\n\n"; }
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
722 );
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
723
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
724 text = text.replace(/^(.+)[ \t]*\n-+[ \t]*\n+/gm,
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
725 function (matchFound, m1) { return "<h2>" + _RunSpanGamut(m1) + "</h2>\n\n"; }
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
726 );
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
727
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
728 // atx-style headers:
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
729 // # Header 1
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
730 // ## Header 2
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
731 // ## Header 2 with closing hashes ##
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
732 // ...
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
733 // ###### Header 6
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
734 //
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
735
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
736 /*
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
737 text = text.replace(/
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
738 ^(\#{1,6}) // $1 = string of #'s
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
739 [ \t]*
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
740 (.+?) // $2 = Header text
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
741 [ \t]*
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
742 \#* // optional closing #'s (not counted)
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
743 \n+
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
744 /gm, function() {...});
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
745 */
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
746
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
747 text = text.replace(/^(\#{1,6})[ \t]*(.+?)[ \t]*\#*\n+/gm,
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
748 function (wholeMatch, m1, m2) {
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
749 var h_level = m1.length;
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
750 return "<h" + h_level + ">" + _RunSpanGamut(m2) + "</h" + h_level + ">\n\n";
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
751 }
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
752 );
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
753
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
754 return text;
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
755 }
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
756
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
757 function _DoLists(text) {
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
758 //
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
759 // Form HTML ordered (numbered) and unordered (bulleted) lists.
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
760 //
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
761
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
762 // attacklab: add sentinel to hack around khtml/safari bug:
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
763 // http://bugs.webkit.org/show_bug.cgi?id=11231
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
764 text += "~0";
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
765
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
766 // Re-usable pattern to match any entirel ul or ol list:
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
767
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
768 /*
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
769 var whole_list = /
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
770 ( // $1 = whole list
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
771 ( // $2
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
772 [ ]{0,3} // attacklab: g_tab_width - 1
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
773 ([*+-]|\d+[.]) // $3 = first list item marker
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
774 [ \t]+
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
775 )
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
776 [^\r]+?
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
777 ( // $4
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
778 ~0 // sentinel for workaround; should be $
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
779 |
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
780 \n{2,}
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
781 (?=\S)
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
782 (?! // Negative lookahead for another list item marker
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
783 [ \t]*
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
784 (?:[*+-]|\d+[.])[ \t]+
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
785 )
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
786 )
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
787 )
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
788 /g
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
789 */
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
790 var whole_list = /^(([ ]{0,3}([*+-]|\d+[.])[ \t]+)[^\r]+?(~0|\n{2,}(?=\S)(?![ \t]*(?:[*+-]|\d+[.])[ \t]+)))/gm;
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
791
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
792 if (g_list_level) {
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
793 text = text.replace(whole_list, function (wholeMatch, m1, m2) {
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
794 var list = m1;
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
795 var list_type = (m2.search(/[*+-]/g) > -1) ? "ul" : "ol";
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
796
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
797 var result = _ProcessListItems(list, list_type);
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
798
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
799 // Trim any trailing whitespace, to put the closing `</$list_type>`
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
800 // up on the preceding line, to get it past the current stupid
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
801 // HTML block parser. This is a hack to work around the terrible
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
802 // hack that is the HTML block parser.
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
803 result = result.replace(/\s+$/, "");
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
804 result = "<" + list_type + ">" + result + "</" + list_type + ">\n";
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
805 return result;
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
806 });
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
807 } else {
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
808 whole_list = /(\n\n|^\n?)(([ ]{0,3}([*+-]|\d+[.])[ \t]+)[^\r]+?(~0|\n{2,}(?=\S)(?![ \t]*(?:[*+-]|\d+[.])[ \t]+)))/g;
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
809 text = text.replace(whole_list, function (wholeMatch, m1, m2, m3) {
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
810 var runup = m1;
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
811 var list = m2;
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
812
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
813 var list_type = (m3.search(/[*+-]/g) > -1) ? "ul" : "ol";
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
814 var result = _ProcessListItems(list, list_type);
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
815 result = runup + "<" + list_type + ">\n" + result + "</" + list_type + ">\n";
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
816 return result;
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
817 });
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
818 }
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
819
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
820 // attacklab: strip sentinel
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
821 text = text.replace(/~0/, "");
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
822
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
823 return text;
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
824 }
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
825
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
826 var _listItemMarkers = { ol: "\\d+[.]", ul: "[*+-]" };
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
827
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
828 function _ProcessListItems(list_str, list_type) {
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
829 //
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
830 // Process the contents of a single ordered or unordered list, splitting it
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
831 // into individual list items.
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
832 //
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
833 // list_type is either "ul" or "ol".
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
834
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
835 // The $g_list_level global keeps track of when we're inside a list.
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
836 // Each time we enter a list, we increment it; when we leave a list,
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
837 // we decrement. If it's zero, we're not in a list anymore.
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
838 //
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
839 // We do this because when we're not inside a list, we want to treat
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
840 // something like this:
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
841 //
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
842 // I recommend upgrading to version
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
843 // 8. Oops, now this line is treated
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
844 // as a sub-list.
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
845 //
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
846 // As a single paragraph, despite the fact that the second line starts
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
847 // with a digit-period-space sequence.
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
848 //
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
849 // Whereas when we're inside a list (or sub-list), that line will be
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
850 // treated as the start of a sub-list. What a kludge, huh? This is
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
851 // an aspect of Markdown's syntax that's hard to parse perfectly
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
852 // without resorting to mind-reading. Perhaps the solution is to
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
853 // change the syntax rules such that sub-lists must start with a
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
854 // starting cardinal number; e.g. "1." or "a.".
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
855
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
856 g_list_level++;
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
857
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
858 // trim trailing blank lines:
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
859 list_str = list_str.replace(/\n{2,}$/, "\n");
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
860
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
861 // attacklab: add sentinel to emulate \z
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
862 list_str += "~0";
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
863
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
864 // In the original attacklab showdown, list_type was not given to this function, and anything
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
865 // that matched /[*+-]|\d+[.]/ would just create the next <li>, causing this mismatch:
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
866 //
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
867 // Markdown rendered by WMD rendered by MarkdownSharp
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
868 // ------------------------------------------------------------------
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
869 // 1. first 1. first 1. first
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
870 // 2. second 2. second 2. second
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
871 // - third 3. third * third
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
872 //
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
873 // We changed this to behave identical to MarkdownSharp. This is the constructed RegEx,
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
874 // with {MARKER} being one of \d+[.] or [*+-], depending on list_type:
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
875
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
876 /*
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
877 list_str = list_str.replace(/
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
878 (^[ \t]*) // leading whitespace = $1
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
879 ({MARKER}) [ \t]+ // list marker = $2
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
880 ([^\r]+? // list item text = $3
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
881 (\n+)
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
882 )
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
883 (?=
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
884 (~0 | \2 ({MARKER}) [ \t]+)
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
885 )
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
886 /gm, function(){...});
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
887 */
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
888
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
889 var marker = _listItemMarkers[list_type];
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
890 var re = new RegExp("(^[ \\t]*)(" + marker + ")[ \\t]+([^\\r]+?(\\n+))(?=(~0|\\1(" + marker + ")[ \\t]+))", "gm");
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
891 var last_item_had_a_double_newline = false;
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
892 list_str = list_str.replace(re,
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
893 function (wholeMatch, m1, m2, m3) {
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
894 var item = m3;
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
895 var leading_space = m1;
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
896 var ends_with_double_newline = /\n\n$/.test(item);
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
897 var contains_double_newline = ends_with_double_newline || item.search(/\n{2,}/) > -1;
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
898
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
899 if (contains_double_newline || last_item_had_a_double_newline) {
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
900 item = _RunBlockGamut(_Outdent(item), /* doNotUnhash = */true);
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
901 }
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
902 else {
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
903 // Recursion for sub-lists:
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
904 item = _DoLists(_Outdent(item));
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
905 item = item.replace(/\n$/, ""); // chomp(item)
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
906 item = _RunSpanGamut(item);
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
907 }
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
908 last_item_had_a_double_newline = ends_with_double_newline;
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
909 return "<li>" + item + "</li>\n";
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
910 }
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
911 );
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
912
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
913 // attacklab: strip sentinel
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
914 list_str = list_str.replace(/~0/g, "");
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
915
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
916 g_list_level--;
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
917 return list_str;
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
918 }
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
919
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
920 function _DoCodeBlocks(text) {
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
921 //
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
922 // Process Markdown `<pre><code>` blocks.
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
923 //
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
924
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
925 /*
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
926 text = text.replace(/
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
927 (?:\n\n|^)
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
928 ( // $1 = the code block -- one or more lines, starting with a space/tab
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
929 (?:
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
930 (?:[ ]{4}|\t) // Lines must start with a tab or a tab-width of spaces - attacklab: g_tab_width
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
931 .*\n+
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
932 )+
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
933 )
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
934 (\n*[ ]{0,3}[^ \t\n]|(?=~0)) // attacklab: g_tab_width
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
935 /g ,function(){...});
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
936 */
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
937
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
938 // attacklab: sentinel workarounds for lack of \A and \Z, safari\khtml bug
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
939 text += "~0";
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
940
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
941 text = text.replace(/(?:\n\n|^)((?:(?:[ ]{4}|\t).*\n+)+)(\n*[ ]{0,3}[^ \t\n]|(?=~0))/g,
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
942 function (wholeMatch, m1, m2) {
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
943 var codeblock = m1;
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
944 var nextChar = m2;
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
945
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
946 codeblock = _EncodeCode(_Outdent(codeblock));
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
947 codeblock = _Detab(codeblock);
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
948 codeblock = codeblock.replace(/^\n+/g, ""); // trim leading newlines
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
949 codeblock = codeblock.replace(/\n+$/g, ""); // trim trailing whitespace
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
950
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
951 codeblock = "<pre><code>" + codeblock + "\n</code></pre>";
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
952
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
953 return "\n\n" + codeblock + "\n\n" + nextChar;
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
954 }
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
955 );
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
956
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
957 // attacklab: strip sentinel
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
958 text = text.replace(/~0/, "");
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
959
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
960 return text;
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
961 }
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
962
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
963 function hashBlock(text) {
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
964 text = text.replace(/(^\n+|\n+$)/g, "");
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
965 return "\n\n~K" + (g_html_blocks.push(text) - 1) + "K\n\n";
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
966 }
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
967
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
968 function _DoCodeSpans(text) {
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
969 //
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
970 // * Backtick quotes are used for <code></code> spans.
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
971 //
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
972 // * You can use multiple backticks as the delimiters if you want to
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
973 // include literal backticks in the code span. So, this input:
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
974 //
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
975 // Just type ``foo `bar` baz`` at the prompt.
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
976 //
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
977 // Will translate to:
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
978 //
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
979 // <p>Just type <code>foo `bar` baz</code> at the prompt.</p>
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
980 //
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
981 // There's no arbitrary limit to the number of backticks you
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
982 // can use as delimters. If you need three consecutive backticks
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
983 // in your code, use four for delimiters, etc.
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
984 //
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
985 // * You can use spaces to get literal backticks at the edges:
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
986 //
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
987 // ... type `` `bar` `` ...
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
988 //
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
989 // Turns to:
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
990 //
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
991 // ... type <code>`bar`</code> ...
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
992 //
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
993
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
994 /*
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
995 text = text.replace(/
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
996 (^|[^\\]) // Character before opening ` can't be a backslash
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
997 (`+) // $2 = Opening run of `
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
998 ( // $3 = The code block
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
999 [^\r]*?
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1000 [^`] // attacklab: work around lack of lookbehind
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1001 )
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1002 \2 // Matching closer
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1003 (?!`)
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1004 /gm, function(){...});
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1005 */
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1006
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1007 text = text.replace(/(^|[^\\])(`+)([^\r]*?[^`])\2(?!`)/gm,
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1008 function (wholeMatch, m1, m2, m3, m4) {
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1009 var c = m3;
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1010 c = c.replace(/^([ \t]*)/g, ""); // leading whitespace
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1011 c = c.replace(/[ \t]*$/g, ""); // trailing whitespace
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1012 c = _EncodeCode(c);
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1013 c = c.replace(/:\/\//g, "~P"); // to prevent auto-linking. Not necessary in code *blocks*, but in code spans. Will be converted back after the auto-linker runs.
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1014 return m1 + "<code>" + c + "</code>";
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1015 }
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1016 );
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1017
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1018 return text;
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1019 }
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1020
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1021 function _EncodeCode(text) {
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1022 //
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1023 // Encode/escape certain characters inside Markdown code runs.
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1024 // The point is that in code, these characters are literals,
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1025 // and lose their special Markdown meanings.
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1026 //
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1027 // Encode all ampersands; HTML entities are not
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1028 // entities within a Markdown code span.
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1029 text = text.replace(/&/g, "&amp;");
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1030
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1031 // Do the angle bracket song and dance:
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1032 text = text.replace(/</g, "&lt;");
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1033 text = text.replace(/>/g, "&gt;");
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1034
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1035 // Now, escape characters that are magic in Markdown:
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1036 text = escapeCharacters(text, "\*_{}[]\\", false);
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1037
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1038 // jj the line above breaks this:
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1039 //---
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1040
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1041 //* Item
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1042
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1043 // 1. Subitem
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1044
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1045 // special char: *
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1046 //---
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1047
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1048 return text;
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1049 }
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1050
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1051 function _DoItalicsAndBold(text) {
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1052
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1053 // <strong> must go first:
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1054 text = text.replace(/([\W_]|^)(\*\*|__)(?=\S)([^\r]*?\S[\*_]*)\2([\W_]|$)/g,
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1055 "$1<strong>$3</strong>$4");
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1056
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1057 text = text.replace(/([\W_]|^)(\*|_)(?=\S)([^\r\*_]*?\S)\2([\W_]|$)/g,
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1058 "$1<em>$3</em>$4");
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1059
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1060 return text;
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1061 }
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1062
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1063 function _DoBlockQuotes(text) {
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1064
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1065 /*
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1066 text = text.replace(/
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1067 ( // Wrap whole match in $1
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1068 (
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1069 ^[ \t]*>[ \t]? // '>' at the start of a line
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1070 .+\n // rest of the first line
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1071 (.+\n)* // subsequent consecutive lines
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1072 \n* // blanks
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1073 )+
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1074 )
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1075 /gm, function(){...});
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1076 */
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1077
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1078 text = text.replace(/((^[ \t]*>[ \t]?.+\n(.+\n)*\n*)+)/gm,
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1079 function (wholeMatch, m1) {
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1080 var bq = m1;
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1081
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1082 // attacklab: hack around Konqueror 3.5.4 bug:
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1083 // "----------bug".replace(/^-/g,"") == "bug"
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1084
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1085 bq = bq.replace(/^[ \t]*>[ \t]?/gm, "~0"); // trim one level of quoting
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1086
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1087 // attacklab: clean up hack
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1088 bq = bq.replace(/~0/g, "");
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1089
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1090 bq = bq.replace(/^[ \t]+$/gm, ""); // trim whitespace-only lines
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1091 bq = _RunBlockGamut(bq); // recurse
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1092
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1093 bq = bq.replace(/(^|\n)/g, "$1 ");
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1094 // These leading spaces screw with <pre> content, so we need to fix that:
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1095 bq = bq.replace(
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1096 /(\s*<pre>[^\r]+?<\/pre>)/gm,
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1097 function (wholeMatch, m1) {
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1098 var pre = m1;
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1099 // attacklab: hack around Konqueror 3.5.4 bug:
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1100 pre = pre.replace(/^ /mg, "~0");
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1101 pre = pre.replace(/~0/g, "");
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1102 return pre;
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1103 });
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1104
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1105 return hashBlock("<blockquote>\n" + bq + "\n</blockquote>");
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1106 }
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1107 );
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1108 return text;
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1109 }
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1110
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1111 function _FormParagraphs(text, doNotUnhash) {
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1112 //
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1113 // Params:
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1114 // $text - string to process with html <p> tags
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1115 //
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1116
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1117 // Strip leading and trailing lines:
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1118 text = text.replace(/^\n+/g, "");
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1119 text = text.replace(/\n+$/g, "");
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1120
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1121 var grafs = text.split(/\n{2,}/g);
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1122 var grafsOut = [];
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1123
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1124 var markerRe = /~K(\d+)K/;
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1125
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1126 //
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1127 // Wrap <p> tags.
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1128 //
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1129 var end = grafs.length;
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1130 for (var i = 0; i < end; i++) {
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1131 var str = grafs[i];
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1132
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1133 // if this is an HTML marker, copy it
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1134 if (markerRe.test(str)) {
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1135 grafsOut.push(str);
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1136 }
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1137 else if (/\S/.test(str)) {
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1138 str = _RunSpanGamut(str);
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1139 str = str.replace(/^([ \t]*)/g, "<p>");
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1140 str += "</p>"
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1141 grafsOut.push(str);
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1142 }
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1143
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1144 }
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1145 //
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1146 // Unhashify HTML blocks
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1147 //
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1148 if (!doNotUnhash) {
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1149 end = grafsOut.length;
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1150 for (var i = 0; i < end; i++) {
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1151 var foundAny = true;
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1152 while (foundAny) { // we may need several runs, since the data may be nested
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1153 foundAny = false;
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1154 grafsOut[i] = grafsOut[i].replace(/~K(\d+)K/g, function (wholeMatch, id) {
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1155 foundAny = true;
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1156 return g_html_blocks[id];
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1157 });
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1158 }
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1159 }
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1160 }
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1161 return grafsOut.join("\n\n");
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1162 }
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1163
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1164 function _EncodeAmpsAndAngles(text) {
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1165 // Smart processing for ampersands and angle brackets that need to be encoded.
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1166
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1167 // Ampersand-encoding based entirely on Nat Irons's Amputator MT plugin:
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1168 // http://bumppo.net/projects/amputator/
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1169 text = text.replace(/&(?!#?[xX]?(?:[0-9a-fA-F]+|\w+);)/g, "&amp;");
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1170
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1171 // Encode naked <'s
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1172 text = text.replace(/<(?![a-z\/?\$!])/gi, "&lt;");
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1173
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1174 return text;
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1175 }
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1176
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1177 function _EncodeBackslashEscapes(text) {
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1178 //
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1179 // Parameter: String.
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1180 // Returns: The string, with after processing the following backslash
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1181 // escape sequences.
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1182 //
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1183
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1184 // attacklab: The polite way to do this is with the new
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1185 // escapeCharacters() function:
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1186 //
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1187 // text = escapeCharacters(text,"\\",true);
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1188 // text = escapeCharacters(text,"`*_{}[]()>#+-.!",true);
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1189 //
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1190 // ...but we're sidestepping its use of the (slow) RegExp constructor
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1191 // as an optimization for Firefox. This function gets called a LOT.
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1192
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1193 text = text.replace(/\\(\\)/g, escapeCharacters_callback);
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1194 text = text.replace(/\\([`*_{}\[\]()>#+-.!])/g, escapeCharacters_callback);
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1195 return text;
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1196 }
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1197
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1198 function _DoAutoLinks(text) {
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1199
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1200 // note that at this point, all other URL in the text are already hyperlinked as <a href=""></a>
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1201 // *except* for the <http://www.foo.com> case
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1202
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1203 // automatically add < and > around unadorned raw hyperlinks
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1204 // must be preceded by space/BOF and followed by non-word/EOF character
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1205 text = text.replace(/(^|\s)(https?|ftp)(:\/\/[-A-Z0-9+&@#\/%?=~_|\[\]\(\)!:,\.;]*[-A-Z0-9+&@#\/%=~_|\[\]])($|\W)/gi, "$1<$2$3>$4");
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1206
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1207 // autolink anything like <http://example.com>
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1208
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1209 var replacer = function (wholematch, m1) { return "<a href=\"" + m1 + "\">" + pluginHooks.plainLinkText(m1) + "</a>"; }
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1210 text = text.replace(/<((https?|ftp):[^'">\s]+)>/gi, replacer);
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1211
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1212 // Email addresses: <address@domain.foo>
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1213 /*
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1214 text = text.replace(/
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1215 <
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1216 (?:mailto:)?
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1217 (
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1218 [-.\w]+
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1219 \@
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1220 [-a-z0-9]+(\.[-a-z0-9]+)*\.[a-z]+
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1221 )
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1222 >
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1223 /gi, _DoAutoLinks_callback());
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1224 */
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1225
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1226 /* disabling email autolinking, since we don't do that on the server, either
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1227 text = text.replace(/<(?:mailto:)?([-.\w]+\@[-a-z0-9]+(\.[-a-z0-9]+)*\.[a-z]+)>/gi,
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1228 function(wholeMatch,m1) {
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1229 return _EncodeEmailAddress( _UnescapeSpecialChars(m1) );
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1230 }
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1231 );
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1232 */
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1233 return text;
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1234 }
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1235
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1236 function _UnescapeSpecialChars(text) {
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1237 //
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1238 // Swap back in all the special characters we've hidden.
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1239 //
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1240 text = text.replace(/~E(\d+)E/g,
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1241 function (wholeMatch, m1) {
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1242 var charCodeToReplace = parseInt(m1);
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1243 return String.fromCharCode(charCodeToReplace);
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1244 }
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1245 );
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1246 return text;
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1247 }
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1248
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1249 function _Outdent(text) {
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1250 //
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1251 // Remove one level of line-leading tabs or spaces
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1252 //
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1253
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1254 // attacklab: hack around Konqueror 3.5.4 bug:
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1255 // "----------bug".replace(/^-/g,"") == "bug"
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1256
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1257 text = text.replace(/^(\t|[ ]{1,4})/gm, "~0"); // attacklab: g_tab_width
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1258
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1259 // attacklab: clean up hack
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1260 text = text.replace(/~0/g, "")
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1261
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1262 return text;
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1263 }
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1264
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1265 function _Detab(text) {
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1266 if (!/\t/.test(text))
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1267 return text;
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1268
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1269 var spaces = [" ", " ", " ", " "],
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1270 skew = 0,
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1271 v;
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1272
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1273 return text.replace(/[\n\t]/g, function (match, offset) {
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1274 if (match === "\n") {
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1275 skew = offset + 1;
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1276 return match;
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1277 }
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1278 v = (offset - skew) % 4;
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1279 skew = offset + 1;
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1280 return spaces[v];
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1281 });
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1282 }
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1283
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1284 //
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1285 // attacklab: Utility functions
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1286 //
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1287
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1288 var _problemUrlChars = /(?:["'*()[\]:]|~D)/g;
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1289
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1290 // hex-encodes some unusual "problem" chars in URLs to avoid URL detection problems
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1291 function encodeProblemUrlChars(url) {
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1292 if (!url)
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1293 return "";
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1294
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1295 var len = url.length;
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1296
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1297 return url.replace(_problemUrlChars, function (match, offset) {
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1298 if (match == "~D") // escape for dollar
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1299 return "%24";
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1300 if (match == ":") {
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1301 if (offset == len - 1 || /[0-9\/]/.test(url.charAt(offset + 1)))
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1302 return ":"
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1303 }
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1304 return "%" + match.charCodeAt(0).toString(16);
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1305 });
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1306 }
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1307
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1308
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1309 function escapeCharacters(text, charsToEscape, afterBackslash) {
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1310 // First we have to escape the escape characters so that
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1311 // we can build a character class out of them
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1312 var regexString = "([" + charsToEscape.replace(/([\[\]\\])/g, "\\$1") + "])";
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1313
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1314 if (afterBackslash) {
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1315 regexString = "\\\\" + regexString;
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1316 }
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1317
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1318 var regex = new RegExp(regexString, "g");
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1319 text = text.replace(regex, escapeCharacters_callback);
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1320
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1321 return text;
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1322 }
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1323
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1324
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1325 function escapeCharacters_callback(wholeMatch, m1) {
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1326 var charCodeToEscape = m1.charCodeAt(0);
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1327 return "~E" + charCodeToEscape + "E";
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1328 }
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1329
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1330 }; // end of the Markdown.Converter constructor
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1331
59cad6ce1a1c Added support for history and diffing.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1332 })();