From 7868e3897b0f282611f1ccb1715a30a93404ddc7 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Tobias=20H=C3=B6=C3=9Fl?= <tobias@hoessl.eu>
Date: Tue, 13 Mar 2012 21:46:57 +0000
Subject: [PATCH] In HTML2BBCode: fetch the URL of [EMBED] using JavaScript
 instead of an ajax-call to a php-script. Once there actually is embedded Code
 in the HTML, this function is called after every single keypress. Not only is
 making an ajax-call every keypress bandith intensive - it also made typing
 hard / slow. Making a lot of JavaScript-RegExp-Computation every keypress
 isn't exactly great either, but still performs better.

---
 .../plugins/bbcode/editor_plugin_src.js       | 262 ++++++++++--------
 1 file changed, 140 insertions(+), 122 deletions(-)

diff --git a/library/tinymce/jscripts/tiny_mce/plugins/bbcode/editor_plugin_src.js b/library/tinymce/jscripts/tiny_mce/plugins/bbcode/editor_plugin_src.js
index 44d1473a9..183f2bc68 100755
--- a/library/tinymce/jscripts/tiny_mce/plugins/bbcode/editor_plugin_src.js
+++ b/library/tinymce/jscripts/tiny_mce/plugins/bbcode/editor_plugin_src.js
@@ -44,61 +44,79 @@
 		_dfrn_html2bbcode : function(s) {
 			s = tinymce.trim(s);
 
-			function rep(re, str) {
-
-				//modify code to keep stuff intact within [code][/code] blocks
-				//Waitman Gobble NO WARRANTY
-
-
-				var o = new Array();
-				var x = s.split("[code]");
-				var i = 0;
-
-				var si = "";
-				si = x.shift();
-				si = si.replace(re,str);
-				o.push(si);
-
-				for (i = 0; i < x.length; i++) {
-					var no = new Array();
-					var j = x.shift();
-					var g = j.split("[/code]");
-					no.push(g.shift());
-					si = g.shift();
-					si = si.replace(re,str);
-					no.push(si);
-					o.push(no.join("[/code]"));
-				}
-
-				s = o.join("[code]");
-
-			};
-
-
-
-
-			/* oembed */
-			function _h2b_cb(match) {
-				function s_h2b(data) {
-						match = data;
+			function rep(re, str) {
+
+				//modify code to keep stuff intact within [code][/code] blocks
+				//Waitman Gobble NO WARRANTY
+
+
+				var o = new Array();
+				var x = s.split("[code]");
+				var i = 0;
+
+				var si = "";
+				si = x.shift();
+				si = si.replace(re,str);
+				o.push(si);
+
+				for (i = 0; i < x.length; i++) {
+					var no = new Array();
+					var j = x.shift();
+					var g = j.split("[/code]");
+					no.push(g.shift());
+					si = g.shift();
+					si = si.replace(re,str);
+					no.push(si);
+					o.push(no.join("[/code]"));
+				}
+
+				s = o.join("[code]");
+
+			};
+
+
+
+
+			/* oembed */
+			function _h2b_cb(match) {
+				/*
+				function s_h2b(data) {
+						match = data;
 				}
 				$.ajax({
-					type:"POST",
+					type:"POST",
 					url: 'oembed/h2b',
-					data: {text: match},
-					async: false,
-					success: s_h2b,
-					dataType: 'html'
-				});
-				return match;
-			}
+					data: {text: match},
+					async: false,
+					success: s_h2b,
+					dataType: 'html'
+				});
+				*/
+				
+				var f, g, tof = [], tor = [];
+				var find_spanc = /<span [^>]*class *= *[\"'](?:[^\"']* )*oembed(?: [^\"']*)*[\"'][^>]*>(.*?(?:<span[^>]*>(.*?)<\/span *>)*.*?)<\/span *>/ig;
+				while (f = find_spanc.exec(match)) {
+					var find_a = /<a([^>]* rel=[\"']oembed[\"'][^>]*)>.*?<\/a *>/ig;
+					if (g = find_a.exec(f[1])) {
+						var find_href = /href=[\"']([^\"']*)[\"']/ig;
+						var m2 = find_href.exec(g[1]);
+						if (m2[1]) {
+							tof.push(f[0]);
+							tor.push("[EMBED]" + m2[1] + "[/EMBED]");
+						}
+					}
+				}
+				for (var i = 0; i < tof.length; i++) match = match.replace(tof[i], tor[i]);
+				
+				return match;
+			}
 			if (s.indexOf('class="oembed')>=0){
 				//alert("request oembed html2bbcode");
 				s = _h2b_cb(s);
 			}
-			
-			/* /oembed */
-
+			
+			/* /oembed */
+
 
 			// example: <strong> to [b]
 			rep(/<a class=\"bookmark\" href=\"(.*?)\".*?>(.*?)<\/a>/gi,"[bookmark=$1]$2[/bookmark]");
@@ -111,16 +129,16 @@
 			rep(/<img.*?src=\"(.*?)\".*?height=\"(.*?)\".*?width=\"(.*?)\".*?\/>/gi,"[img=$3x$2]$1[/img]");
 			rep(/<img.*?src=\"(.*?)\".*?width=\"(.*?)\".*?height=\"(.*?)\".*?\/>/gi,"[img=$2x$3]$1[/img]");
 			rep(/<img.*?src=\"(.*?)\".*?\/>/gi,"[img]$1[/img]");
-
-			rep(/<ul class=\"listbullet\" style=\"list-style-type\: circle\;\">(.*?)<\/ul>/gi,"[list]$1[/list]");
-			rep(/<ul class=\"listnone\" style=\"list-style-type\: none\;\">(.*?)<\/ul>/gi,"[list=]$1[/list]");
-			rep(/<ul class=\"listdecimal\" style=\"list-style-type\: decimal\;\">(.*?)<\/ul>/gi,"[list=1]$1[/list]");
-			rep(/<ul class=\"listlowerroman\" style=\"list-style-type\: lower-roman\;\">(.*?)<\/ul>/gi,"[list=i]$1[/list]");
-			rep(/<ul class=\"listupperroman\" style=\"list-style-type\: upper-roman\;\">(.*?)<\/ul>/gi,"[list=I]$1[/list]");
-			rep(/<ul class=\"listloweralpha\" style=\"list-style-type\: lower-alpha\;\">(.*?)<\/ul>/gi,"[list=a]$1[/list]");
-			rep(/<ul class=\"listupperalpha\" style=\"list-style-type\: upper-alpha\;\">(.*?)<\/ul>/gi,"[list=A]$1[/list]");
-			rep(/<li>(.*?)<\/li>/gi,'[li]$1[/li]');
-
+
+			rep(/<ul class=\"listbullet\" style=\"list-style-type\: circle\;\">(.*?)<\/ul>/gi,"[list]$1[/list]");
+			rep(/<ul class=\"listnone\" style=\"list-style-type\: none\;\">(.*?)<\/ul>/gi,"[list=]$1[/list]");
+			rep(/<ul class=\"listdecimal\" style=\"list-style-type\: decimal\;\">(.*?)<\/ul>/gi,"[list=1]$1[/list]");
+			rep(/<ul class=\"listlowerroman\" style=\"list-style-type\: lower-roman\;\">(.*?)<\/ul>/gi,"[list=i]$1[/list]");
+			rep(/<ul class=\"listupperroman\" style=\"list-style-type\: upper-roman\;\">(.*?)<\/ul>/gi,"[list=I]$1[/list]");
+			rep(/<ul class=\"listloweralpha\" style=\"list-style-type\: lower-alpha\;\">(.*?)<\/ul>/gi,"[list=a]$1[/list]");
+			rep(/<ul class=\"listupperalpha\" style=\"list-style-type\: upper-alpha\;\">(.*?)<\/ul>/gi,"[list=A]$1[/list]");
+			rep(/<li>(.*?)<\/li>/gi,'[li]$1[/li]');
+
 			rep(/<code>(.*?)<\/code>/gi,"[code]$1[/code]");
 			rep(/<\/(strong|b)>/gi,"[/b]");
 			rep(/<(strong|b)>/gi,"[b]");
@@ -149,42 +167,42 @@
 		// BBCode -> HTML from DFRN dialect
 		_dfrn_bbcode2html : function(s) {
 			s = tinymce.trim(s);
-
-
-                        function rep(re, str) {
-
-                                //modify code to keep stuff intact within [code][/code] blocks
-                                //Waitman Gobble NO WARRANTY
-
-
-                                var o = new Array();
-                                var x = s.split("[code]");
-                                var i = 0;
-
-                                var si = "";
-                                si = x.shift();
-                                si = si.replace(re,str);
-                                o.push(si);
-
-                                for (i = 0; i < x.length; i++) {
-                                        var no = new Array();
-                                        var j = x.shift();
-                                        var g = j.split("[/code]");
-                                        no.push(g.shift());
-                                        si = g.shift();
-                                        si = si.replace(re,str);
-                                        no.push(si);
-                                        o.push(no.join("[/code]"));
-                                }
-
-                                s = o.join("[code]");
-
-                        };
-
-
-
-
-
+
+
+                        function rep(re, str) {
+
+                                //modify code to keep stuff intact within [code][/code] blocks
+                                //Waitman Gobble NO WARRANTY
+
+
+                                var o = new Array();
+                                var x = s.split("[code]");
+                                var i = 0;
+
+                                var si = "";
+                                si = x.shift();
+                                si = si.replace(re,str);
+                                o.push(si);
+
+                                for (i = 0; i < x.length; i++) {
+                                        var no = new Array();
+                                        var j = x.shift();
+                                        var g = j.split("[/code]");
+                                        no.push(g.shift());
+                                        si = g.shift();
+                                        si = si.replace(re,str);
+                                        no.push(si);
+                                        o.push(no.join("[/code]"));
+                                }
+
+                                s = o.join("[code]");
+
+                        };
+
+
+
+
+
 			// example: [b] to <strong>
 			rep(/\n/gi,"<br />");
 			rep(/\[b\]/gi,"<strong>");
@@ -193,43 +211,43 @@
 			rep(/\[\/i\]/gi,"</em>");
 			rep(/\[u\]/gi,"<u>");
 			rep(/\[\/u\]/gi,"</u>");
-			rep(/\[hr\]/gi,"<hr />");
+			rep(/\[hr\]/gi,"<hr />");
 			rep(/\[bookmark=([^\]]+)\](.*?)\[\/bookmark\]/gi,"<a class=\"bookmark\" href=\"$1\">$2</a>");
 			rep(/\[url=([^\]]+)\](.*?)\[\/url\]/gi,"<a href=\"$1\">$2</a>");
 			rep(/\[url\](.*?)\[\/url\]/gi,"<a href=\"$1\">$1</a>");
 			rep(/\[img=(.*?)x(.*?)\](.*?)\[\/img\]/gi,"<img width=\"$1\" height=\"$2\" src=\"$3\" />");
 			rep(/\[img\](.*?)\[\/img\]/gi,"<img src=\"$1\" />");
-
-			rep(/\[list\](.*?)\[\/list\]/gi, '<ul class="listbullet" style="list-style-type: circle;">$1</ul>');
-			rep(/\[list=\](.*?)\[\/list\]/gi, '<ul class="listnone" style="list-style-type: none;">$1</ul>');
-			rep(/\[list=1\](.*?)\[\/list\]/gi, '<ul class="listdecimal" style="list-style-type: decimal;">$1</ul>');
-			rep(/\[list=i\](.*?)\[\/list\]/gi,'<ul class="listlowerroman" style="list-style-type: lower-roman;">$1</ul>');
-			rep(/\[list=I\](.*?)\[\/list\]/gi, '<ul class="listupperroman" style="list-style-type: upper-roman;">$1</ul>');
-			rep(/\[list=a\](.*?)\[\/list\]/gi, '<ul class="listloweralpha" style="list-style-type: lower-alpha;">$1</ul>');
-			rep(/\[list=A\](.*?)\[\/list\]/gi, '<ul class="listupperalpha" style="list-style-type: upper-alpha;">$1</ul>');
-			rep(/\[li\](.*?)\[\/li\]/gi, '<li>$1</li>');
+
+			rep(/\[list\](.*?)\[\/list\]/gi, '<ul class="listbullet" style="list-style-type: circle;">$1</ul>');
+			rep(/\[list=\](.*?)\[\/list\]/gi, '<ul class="listnone" style="list-style-type: none;">$1</ul>');
+			rep(/\[list=1\](.*?)\[\/list\]/gi, '<ul class="listdecimal" style="list-style-type: decimal;">$1</ul>');
+			rep(/\[list=i\](.*?)\[\/list\]/gi,'<ul class="listlowerroman" style="list-style-type: lower-roman;">$1</ul>');
+			rep(/\[list=I\](.*?)\[\/list\]/gi, '<ul class="listupperroman" style="list-style-type: upper-roman;">$1</ul>');
+			rep(/\[list=a\](.*?)\[\/list\]/gi, '<ul class="listloweralpha" style="list-style-type: lower-alpha;">$1</ul>');
+			rep(/\[list=A\](.*?)\[\/list\]/gi, '<ul class="listupperalpha" style="list-style-type: upper-alpha;">$1</ul>');
+			rep(/\[li\](.*?)\[\/li\]/gi, '<li>$1</li>');
 			rep(/\[color=(.*?)\](.*?)\[\/color\]/gi,"<span style=\"color: $1;\">$2</span>");
 			rep(/\[size=(.*?)\](.*?)\[\/size\]/gi,"<span style=\"font-size: $1;\">$2</span>");
 			rep(/\[code\](.*?)\[\/code\]/gi,"<code>$1</code>");
 			rep(/\[quote.*?\](.*?)\[\/quote\]/gi,"<blockquote>$1</blockquote>");
-
-			/* oembed */
-			function _b2h_cb(match, url) {
-				url = bin2hex(url);
-				function s_b2h(data) {
-						match = data;
-				}
-				$.ajax({
-					url: 'oembed/b2h?url=' + url,
-					async: false,
-					success: s_b2h,
-					dataType: 'html'
-				});
-				return match;
-			}
-			s = s.replace(/\[embed\](.*?)\[\/embed\]/gi, _b2h_cb);
-			
-			/* /oembed */
+
+			/* oembed */
+			function _b2h_cb(match, url) {
+				url = bin2hex(url);
+				function s_b2h(data) {
+						match = data;
+				}
+				$.ajax({
+					url: 'oembed/b2h?url=' + url,
+					async: false,
+					success: s_b2h,
+					dataType: 'html'
+				});
+				return match;
+			}
+			s = s.replace(/\[embed\](.*?)\[\/embed\]/gi, _b2h_cb);
+			
+			/* /oembed */
 
 			return s; 
 		}