diff options
Diffstat (limited to 'extensions/tinymce/jscripts/tiny_mce/plugins/mediawiki/wiki2html.js')
-rw-r--r-- | extensions/tinymce/jscripts/tiny_mce/plugins/mediawiki/wiki2html.js | 103 |
1 files changed, 103 insertions, 0 deletions
diff --git a/extensions/tinymce/jscripts/tiny_mce/plugins/mediawiki/wiki2html.js b/extensions/tinymce/jscripts/tiny_mce/plugins/mediawiki/wiki2html.js new file mode 100644 index 0000000..63ccf52 --- /dev/null +++ b/extensions/tinymce/jscripts/tiny_mce/plugins/mediawiki/wiki2html.js @@ -0,0 +1,103 @@ +/* + @author: remy sharp / http://remysharp.com + @url: http://remysharp.com/2008/04/01/wiki-to-html-using-javascript/ + @license: Creative Commons License - ShareAlike http://creativecommons.org/licenses/by-sa/3.0/ + @version: 1.0 + + Can extend String or be used stand alone - just change the flag at the top of the script. +*/ + +(function () { + +var extendString = true; + +if (extendString) { + String.prototype.wiki2html = wiki2html; + String.prototype.iswiki = iswiki; +} else { + window.wiki2html = wiki2html; + window.iswiki = iswiki; +} + +// utility function to check whether it's worth running through the wiki2html +function iswiki(s) { + if (extendString) { + s = this; + } + + return !!(s.match(/^[\s{2} `#\*='{2}]/m)); +} + +// the regex beast... +function wiki2html(s) { + if (extendString) { + s = this; + } + + // lists need to be done using a function to allow for recusive calls + function list(str) { + return str.replace(/(?:(?:(?:^|\n)[\*#].*)+)/g, function (m) { // (?=[\*#]) + var type = m.match(/(^|\n)#/) ? 'OL' : 'UL'; + // strip first layer of list + m = m.replace(/(^|\n)[\*#][ ]{0,1}/g, "$1"); + m = list(m); + return '<' + type + '><li>' + m.replace(/^\n/, '').split(/\n/).join('</li><li>') + '</li></' + type + '>'; + }); + } + + return list(s + + /* BLOCK ELEMENTS */ + .replace(/(?:^|\n+)([^# =\*<].+)(?:\n+|$)/gm, function (m, l) { + if (l.match(/^\^+$/)) return l; + return "\n<p>" + l + "</p>\n"; + }) + + .replace(/(?:^|\n)[ ]{2}(.*)+/g, function (m, l) { // blockquotes + if (l.match(/^\s+$/)) return m; + return '<blockquote>' + l + '</pre>'; + }) + + .replace(/((?:^|\n)[ ]+.*)+/g, function (m) { // code + if (m.match(/^\s+$/)) return m; + return '<pre>' + m.replace(/(^|\n)[ ]+/g, "$1") + '</pre>'; + }) + + .replace(/(?:^|\n)([=]+)(.*)\1/g, function (m, l, t) { // headings + return '<h' + l.length + '>' + t + '</h' + l.length + '>'; + }) + + /* INLINE ELEMENTS */ + .replace(/'''(.*?)'''/g, function (m, l) { // bold + return '<strong>' + l + '</strong>'; + }) + + .replace(/''(.*?)''/g, function (m, l) { // italic + return '<em>' + l + '</em>'; + }) + + .replace(/[^\[](http[^\[\s]*)/g, function (m, l) { // normal link + return '<a href="' + l + '">' + l + '</a>'; + }) + + .replace(/[\[](http.*)[!\]]/g, function (m, l) { // external link + var p = l.replace(/[\[\]]/g, '').split(/ /); + var link = p.shift(); + return '<a href="' + link + '">' + (p.length ? p.join(' ') : link) + '</a>'; + }) + + .replace(/\[\[(.*?)\]\]/g, function (m, l) { // internal link or image + var p = l.split(/\|/); + var link = p.shift(); + + if (link.match(/^Image:(.*)/)) { + // no support for images - since it looks up the source from the wiki db :-( + return m; + } else { + return '<a href="' + link + '">' + (p.length ? p.join('|') : link) + '</a>'; + } + }) + ); +} + +})();
\ No newline at end of file |