diff options
| author | Xavier Morel <xmo@openerp.com> | 2012-01-17 12:22:46 +0100 |
|---|---|---|
| committer | Xavier Morel <xmo@openerp.com> | 2012-01-17 12:22:46 +0100 |
| commit | 24ef362e7f3c05decf176a9e2ff94440fe749e6a (patch) | |
| tree | fc95d226aecf760fdf51946b6f38763d25b27788 /addons/wiki/static/src/lib/wiky/wiky.js | |
| parent | ecfcf9c409b64b2b8bd026c92e329d608a017c92 (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-x | addons/wiki/static/src/lib/wiky/wiky.js | 303 |
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; +}; |
