summaryrefslogtreecommitdiff
path: root/addons/wiki/static/src/lib/wiky/wiky.js
diff options
context:
space:
mode:
authorXavier Morel <xmo@openerp.com>2012-01-17 12:22:46 +0100
committerXavier Morel <xmo@openerp.com>2012-01-17 12:22:46 +0100
commit24ef362e7f3c05decf176a9e2ff94440fe749e6a (patch)
treefc95d226aecf760fdf51946b6f38763d25b27788 /addons/wiki/static/src/lib/wiky/wiky.js
parentecfcf9c409b64b2b8bd026c92e329d608a017c92 (diff)
[ADD] extremely basic wikitext support for web client, in page view
* Headers work (kinda) * Lists work * Text decoration (bold, italics) work * Indentation works BUT Internal links, OpenERP actions, images, attachments and tables don't work lp bug: https://launchpad.net/bugs/910527 fixed bzr revid: xmo@openerp.com-20120117112246-mrpjld9382ibupr6
Diffstat (limited to 'addons/wiki/static/src/lib/wiky/wiky.js')
-rwxr-xr-xaddons/wiki/static/src/lib/wiky/wiky.js303
1 files changed, 303 insertions, 0 deletions
diff --git a/addons/wiki/static/src/lib/wiky/wiky.js b/addons/wiki/static/src/lib/wiky/wiky.js
new file mode 100755
index 00000000000..5bc9c6f167d
--- /dev/null
+++ b/addons/wiki/static/src/lib/wiky/wiky.js
@@ -0,0 +1,303 @@
+/**
+ * Wiky.js - Javascript library to converts Wiki MarkUp language to HTML.
+ * You can do whatever with it. Please give me some credits (Apache License)
+ * - Tanin Na Nakorn
+ */
+
+var wiky = {};
+
+
+wiky.process = function(wikitext) {
+ var lines = wikitext.split(/\r?\n/);
+ var start;
+ var html = "";
+
+ for (var i=0;i<lines.length;i++)
+ {
+ var line = lines[i];
+ if (line.match(/^===/)!=null && line.match(/===$/)!=null)
+ {
+ html += "<h2>"+line.substring(3,line.length-3)+"</h2>";
+ }
+ else if (line.match(/^==/)!=null && line.match(/==$/)!=null)
+ {
+ html += "<h3>"+line.substring(2,line.length-2)+"</h3>";
+ }
+ else if (line.match(/^:+/)!=null)
+ {
+ // find start line and ending line
+ start = i;
+ while (i < lines.length && lines[i].match(/^:+/)!=null) i++;
+ i--;
+
+ html += wiky.process_indent(lines,start,i);
+ }
+ else if (line.match(/^----+(\s*)$/)!=null)
+ {
+ html += "<hr/>";
+ }
+ else if (line.match(/^(\*+) /)!=null)
+ {
+ // find start line and ending line
+ start = i;
+ while (i < lines.length && lines[i].match(/^(\*+|##+):? /)!=null) i++;
+ i--;
+
+ html += wiky.process_bullet_point(lines,start,i);
+ }
+ else if (line.match(/^(#+) /)!=null)
+ {
+ // find start line and ending line
+ start = i;
+ while (i < lines.length && lines[i].match(/^(#+|\*\*+):? /)!=null) i++;
+ i--;
+
+ html += wiky.process_bullet_point(lines,start,i);
+ }
+ else
+ {
+ html += wiky.process_normal(line);
+ }
+
+ html += "<br/>\n";
+ }
+
+ return html;
+};
+
+wiky.process_indent = function(lines,start,end) {
+ var html = "<dl>";
+
+ for(var i=start;i<=end;i++) {
+
+ html += "<dd>";
+
+ var this_count = lines[i].match(/^(:+)/)[1].length;
+
+ html += wiky.process_normal(lines[i].substring(this_count));
+
+ var nested_end = i;
+ for (var j=i+1;j<=end;j++) {
+ var nested_count = lines[j].match(/^(:+)/)[1].length;
+ if (nested_count <= this_count) break;
+ else nested_end = j;
+ }
+
+ if (nested_end > i) {
+ html += wiky.process_indent(lines,i+1,nested_end);
+ i = nested_end;
+ }
+
+ html += "</dd>";
+ }
+
+ html += "</dl>";
+ return html;
+};
+
+wiky.process_bullet_point = function(lines,start,end) {
+ var html = (lines[start].charAt(0)=='*')?"<ul>":"<ol>";
+
+ for(var i=start;i<=end;i++) {
+
+ html += "<li>";
+
+ var this_count = lines[i].match(/^(\*+|#+) /)[1].length;
+
+ html += wiky.process_normal(lines[i].substring(this_count+1));
+
+ // continue previous with #:
+ {
+ var nested_end = i;
+ for (var j = i + 1; j <= end; j++) {
+ var nested_count = lines[j].match(/^(\*+|#+):? /)[1].length;
+
+ if (nested_count < this_count)
+ break;
+ else {
+ if (lines[j].charAt(nested_count) == ':') {
+ html += "<br/>" + wiky.process_normal(lines[j].substring(nested_count + 2));
+ nested_end = j;
+ } else {
+ break;
+ }
+ }
+
+ }
+
+ i = nested_end;
+ }
+
+ // nested bullet point
+ {
+ var nested_end = i;
+ for (var j = i + 1; j <= end; j++) {
+ var nested_count = lines[j].match(/^(\*+|#+):? /)[1].length;
+ if (nested_count <= this_count)
+ break;
+ else
+ nested_end = j;
+ }
+
+ if (nested_end > i) {
+ html += wiky.process_bullet_point(lines, i + 1, nested_end);
+ i = nested_end;
+ }
+ }
+
+ // continue previous with #:
+ {
+ var nested_end = i;
+ for (var j = i + 1; j <= end; j++) {
+ var nested_count = lines[j].match(/^(\*+|#+):? /)[1].length;
+
+ if (nested_count < this_count)
+ break;
+ else {
+ if (lines[j].charAt(nested_count) == ':') {
+ html += wiky.process_normal(lines[j].substring(nested_count + 2));
+ nested_end = j;
+ } else {
+ break;
+ }
+ }
+
+ }
+
+ i = nested_end;
+ }
+
+ html += "</li>";
+ }
+
+ html += (lines[start].charAt(0)=='*')?"</ul>":"</ol>";
+ return html;
+};
+
+wiky.process_url = function(txt) {
+
+ var index = txt.indexOf(" ");
+
+ if (index == -1)
+ {
+ return "<a target='"+txt+"' href='"+txt+"' style='background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAFZJREFUeF59z4EJADEIQ1F36k7u5E7ZKXeUQPACJ3wK7UNokVxVk9kHnQH7bY9hbDyDhNXgjpRLqFlo4M2GgfyJHhjq8V4agfrgPQX3JtJQGbofmCHgA/nAKks+JAjFAAAAAElFTkSuQmCC\") no-repeat scroll right center transparent;padding-right: 13px;'></a>";
+ }
+ else
+ {
+ var url = txt.substring(0,index);
+ var label = txt.substring(index+1);
+ return "<a target='"+url+"' href='"+url+"' style='background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAFZJREFUeF59z4EJADEIQ1F36k7u5E7ZKXeUQPACJ3wK7UNokVxVk9kHnQH7bY9hbDyDhNXgjpRLqFlo4M2GgfyJHhjq8V4agfrgPQX3JtJQGbofmCHgA/nAKks+JAjFAAAAAElFTkSuQmCC\") no-repeat scroll right center transparent;padding-right: 13px;'>"+label+"</a>";
+ }
+};
+
+wiky.process_image = function(txt) {
+ var index = txt.indexOf(" ");
+ var url = txt;
+ var label = "";
+
+ if (index > -1)
+ {
+ url = txt.substring(0,index);
+ label = txt.substring(index+1);
+ }
+
+
+ return "<img src='"+url+"' alt=\""+label+"\" />";
+};
+
+wiky.process_video = function(url) {
+
+ if (url.match(/^(https?:\/\/)?(www.)?youtube.com\//) == null)
+ {
+ return "<b>"+url+" is an invalid YouTube URL</b>";
+ }
+ var result;
+ if ((result = url.match(/^(https?:\/\/)?(www.)?youtube.com\/watch\?(.*)v=([^&]+)/)) != null)
+ {
+ url = "http://www.youtube.com/embed/"+result[4];
+ }
+
+
+ return '<iframe width="480" height="390" src="'+url+'" frameborder="0" allowfullscreen></iframe>';
+};
+
+wiky.process_normal = function(wikitext) {
+
+ // Image
+ {
+ var index = wikitext.indexOf("[[File:");
+ var end_index = wikitext.indexOf("]]", index + 7);
+ while (index > -1 && end_index > -1) {
+
+ wikitext = wikitext.substring(0,index)
+ + wiky.process_image(wikitext.substring(index+7,end_index))
+ + wikitext.substring(end_index+2);
+
+ index = wikitext.indexOf("[[File:");
+ end_index = wikitext.indexOf("]]", index + 7);
+ }
+ }
+
+ // Video
+ {
+ var index = wikitext.indexOf("[[Video:");
+ var end_index = wikitext.indexOf("]]", index + 8);
+ while (index > -1 && end_index > -1) {
+
+ wikitext = wikitext.substring(0,index)
+ + wiky.process_video(wikitext.substring(index+8,end_index))
+ + wikitext.substring(end_index+2);
+
+ index = wikitext.indexOf("[[Video:");
+ end_index = wikitext.indexOf("]]", index + 8);
+ }
+ }
+
+
+ // URL
+ var protocols = ["http","ftp","news"];
+
+ for (var i=0;i<protocols.length;i++)
+ {
+ var index = wikitext.indexOf("["+protocols[i]+"://");
+ var end_index = wikitext.indexOf("]", index + 1);
+ while (index > -1 && end_index > -1) {
+
+ wikitext = wikitext.substring(0,index)
+ + wiky.process_url(wikitext.substring(index+1,end_index))
+ + wikitext.substring(end_index+1);
+
+ index = wikitext.indexOf("["+protocols[i]+"://",end_index+1);
+ end_index = wikitext.indexOf("]", index + 1);
+
+ }
+ }
+
+ var count_b = 0;
+ var index = wikitext.indexOf("'''");
+ while(index > -1) {
+
+ if ((count_b%2)==0) wikitext = wikitext.replace(/'''/,"<b>");
+ else wikitext = wikitext.replace(/'''/,"</b>");
+
+ count_b++;
+
+ index = wikitext.indexOf("'''",index);
+ }
+
+ var count_i = 0;
+ var index = wikitext.indexOf("''");
+ while(index > -1) {
+
+ if ((count_i%2)==0) wikitext = wikitext.replace(/''/,"<i>");
+ else wikitext = wikitext.replace(/''/,"</i>");
+
+ count_i++;
+
+ index = wikitext.indexOf("''",index);
+ }
+
+ wikitext = wikitext.replace(/<\/b><\/i>/g,"</i></b>");
+
+ return wikitext;
+};