1
0
mirror of https://github.com/e107inc/e107.git synced 2025-08-03 21:27:25 +02:00

Tinymce parser now loads up to 3x faster.

This commit is contained in:
Cameron
2015-04-11 20:40:29 -07:00
parent 71500fc723
commit f5a5a64e98
3 changed files with 215 additions and 160 deletions

View File

@@ -130,7 +130,7 @@ $text = "
<tr> <tr>
<th><!-- --></th> <th><!-- --></th>
<th class='left'>".CACLAN_17."</th> <th class='left'>".CACLAN_17."</th>
<th class='center last'>".CACLAN_1."</th> <th class='left last'>".CACLAN_1."</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
@@ -140,7 +140,7 @@ $text = "
<div class='field-help'>".CACLAN_13."</div> <div class='field-help'>".CACLAN_13."</div>
</td> </td>
<td>{$contentcache_label}</td> <td>{$contentcache_label}</td>
<td class='center middle'> <td class='left middle'>
".$frm->radio_switch('cachestatus', e107::getPref('cachestatus'))." ".$frm->radio_switch('cachestatus', e107::getPref('cachestatus'))."
</td> </td>
</tr> </tr>
@@ -150,7 +150,7 @@ $text = "
<div class='field-help'>".CACLAN_14."</div> <div class='field-help'>".CACLAN_14."</div>
</td> </td>
<td>{$syscache_label}</td> <td>{$syscache_label}</td>
<td class='center middle'> <td class='left middle'>
".$frm->radio_switch('syscachestatus', e107::getPref('syscachestatus'))." ".$frm->radio_switch('syscachestatus', e107::getPref('syscachestatus'))."
</td> </td>
</tr> </tr>
@@ -160,7 +160,7 @@ $text = "
<div class='field-help'>".CACLAN_21."</div> <div class='field-help'>".CACLAN_21."</div>
</td> </td>
<td>{$dbcache_label}</td> <td>{$dbcache_label}</td>
<td class='center middle'> <td class='left middle'>
".LAN_ENABLED." ".LAN_ENABLED."
</td> </td>
</tr> </tr>
@@ -170,13 +170,13 @@ $text = "
<div class='field-help'>".CACLAN_23."</div> <div class='field-help'>".CACLAN_23."</div>
</td> </td>
<td>{$imgcache_label}</td> <td>{$imgcache_label}</td>
<td class='center middle'> <td class='left middle'>
".LAN_ENABLED." ".LAN_ENABLED."
</td> </td>
</tr> </tr>
</tbody> </tbody>
</table> </table>
<div class='buttons-bar'> <div class='buttons-bar form-inline'>
<div class='f-right'>".$frm->admin_button('submit_cache', CACLAN_2, 'update')."</div> <div class='f-right'>".$frm->admin_button('submit_cache', CACLAN_2, 'update')."</div>
".$frm->select('option_clear_cache', array( ".$frm->select('option_clear_cache', array(
'empty_all' => CACLAN_26, 'empty_all' => CACLAN_26,

View File

@@ -90,7 +90,7 @@ class e_bbcode
* *
* Code uses a crude stack-based syntax analyser to handle nested bbcodes (including nested 'size' bbcodes, for example) * Code uses a crude stack-based syntax analyser to handle nested bbcodes (including nested 'size' bbcodes, for example)
*/ */
function parseBBCodes($value, $p_ID, $force_lower = 'default', $bbStrip = FALSE) function parseBBCodes($value, $p_ID='', $force_lower = 'default', $bbStrip = FALSE)
{ {
global $postID; global $postID;
$postID = $p_ID; $postID = $p_ID;

View File

@@ -5,170 +5,225 @@
* Copyright (C) e107 Inc (e107.org) * Copyright (C) e107 Inc (e107.org)
* Released under the terms and conditions of the * Released under the terms and conditions of the
* GNU General Public License (http://www.gnu.org/licenses/gpl.txt) * GNU General Public License (http://www.gnu.org/licenses/gpl.txt)
*
* $URL: https://e107.svn.sourceforge.net/svnroot/e107/trunk/e107_0.8/e107_handlers/bbcode_handler.php $
* $Id: bbcode_handler.php 12778 2012-06-02 08:12:16Z e107coders $
*/ */
if(empty($_POST['content']))
{
header('Content-Length: 0');
exit;
}
$_E107['no_online'] = true;
$_E107['no_menus'] = true;
$_E107['no_forceuserupdate'] = true;
require_once("../../../../class2.php"); require_once("../../../../class2.php");
/** /**
* Two Modes supported below going to and from the Tinymce wysiwyg editor. * Two Modes supported below going to and from the Tinymce wysiwyg editor.
* 1) When the post_html pref is active - raw html is used in the editor and wrapped in [html] [/html] bbcodes in the background. * 1) When the post_html pref is active - raw html is used in the editor and wrapped in [html] [/html] bbcodes in the background.
* 2) When the post_html pref is disabled - bbcodes are used in the background and converted to html for the editor. * 2) When the post_html pref is disabled - bbcodes are used in the background and converted to html for the editor.
* Tested extensively over 24 hours with Images - check with Cameron first if issues arise. * Tested extensively over 24 hours with Images - check with Cameron first if issues arise.
* TODO Test Lines breaks and out html tags. * TODO Check with html5 tags active.
* TODO Check with html5 tags active. */
*/ class e107TinyMceParser
if($_POST['mode'] == 'tohtml')
{ {
protected $gzipCompression = true;
// XXX @Cam possible fix - convert to BB first, see news admin AJAX request/response values for reference why /**
$content = stripslashes($_POST['content']); *
*/
function __construct()
// $content = e107::getBB()->htmltoBBcode($content); //XXX This breaks inserted images from media-manager. :/
e107::getBB()->setClass($_SESSION['media_category']);
if(check_class($pref['post_html'])) // raw HTML within [html] tags.
{
// $content = $tp->replaceConstants($content,'abs');
if(strstr($content,"[html]") === false) // BC - convert old BB code text to html.
{
e107::getBB()->clearClass();
$content = str_replace('\r\n',"<br />",$content);
$content = nl2br($content, true);
$content = $tp->toHtml($content, true);
}
$content = str_replace("{e_BASE}",e_HTTP,$content); // We want {e_BASE} in the final data going to the DB, but not the editor.
$srch = array("<!-- bbcode-html-start -->","<!-- bbcode-html-end -->","[html]","[/html]");
$content = str_replace($srch,"",$content);
$content = e107::getBB()->parseBBCodes($content); // parse the <bbcode> tag so we see the HTML equivalent while editing!
if(!empty($content) && E107_DEBUG_LEVEL > 0)
{
$content = "-- DEBUG MODE ACTIVE -- \n".$content;
// echo htmlentities($content)."\n";
// echo "<pre>".$content."</pre>";
echo $content;
exit;
}
echo $content;
}
else // bbcode Mode.
{
// XXX @Cam this breaks new lines, currently we use \n instead [br]
//echo $tp->toHtml(str_replace("\n","",$content), true);
$content = str_replace("{e_BASE}",e_HTTP, $content); // We want {e_BASE} in the final data going to the DB, but not the editor.
$content = $tp->toHtml($content, true);
$content = str_replace(e_MEDIA_IMAGE,"{e_MEDIA_IMAGE}",$content);
if(!empty($content) && E107_DEBUG_LEVEL > 0)
{
echo "<!-- bbcode mode -->";
//print_r(htmlentities($content))."\n";
//exit;
}
echo $content;
}
e107::getBB()->clearClass();
}
if($_POST['mode'] == 'tobbcode')
{
// echo $_POST['content'];
$content = stripslashes($_POST['content']);
if(check_class($pref['post_html'])) // Plain HTML mode.
{
$srch = array('src="'.e_HTTP.'thumb.php?','src="/{e_MEDIA_IMAGE}');
$repl = array('src="{e_BASE}thumb.php?','src="{e_BASE}thumb.php?src=e_MEDIA_IMAGE/');
$content = str_replace($srch, $repl, $content);
// resize the thumbnail to match wysiwyg width/height.
// $psrch = '/<img[^>]*src="{e_BASE}thumb.php\?src=([\S]*)w=([\d]*)&amp;h=([\d]*)"(.*)width="([\d]*)" height="([\d]*)"/i';
// $prepl = '<img src="{e_BASE}thumb.php?src=$1w=$5&amp;h=$6"$4width="$5" height="$6" ';
// $content = preg_replace($psrch, $prepl, $content);
$content = updateImg($content);
$content = $tp->parseBBTags($content,true); // replace html with bbcode equivalent
if(strip_tags($content, '<i>') == '&nbsp;') // Avoid this: [html]<p>&nbsp;</p>[/html]
{
exit;
}
echo $content ? "[html]".$content."[/html]" : ""; // Add the tags before saving to DB.
}
else // bbcode Mode. //XXX Disabled at the moment in tinymce/e_meta.php - post_html is required to activate.
{
// [img width=400]/e107_2.0/thumb.php?src={e_MEDIA_IMAGE}2012-12/e107org_white_stripe.png&w=400&h=0[/img]
// $content = str_replace("{e_BASE}","", $content); // We want {e_BASE} in the final data going to the DB, but not the editor.
echo e107::getBB()->htmltoBBcode($content); // not reliable enough yet.
}
}
/**
* Rebuld <img> tags with modified thumbnail size.
*/
function updateImg($text)
{
$arr = e107::getParser()->getTags($text,'img');
$srch = array("?","&");
$repl = array("\?","&amp;");
foreach($arr['img'] as $img)
{ {
$regexp = '#(<img[^>]*src="'.str_replace($srch, $repl, $img['src']).'"[^>]*>)#'; $html = '';
$width = vartrue($img['width']) ? ' width="'.$img['width'].'"' : ''; if($_POST['mode'] == 'tohtml')
$height = vartrue($img['height']) ? ' height="'.$img['height'].'"' : ''; {
$style = vartrue($img['style']) ? ' style="'.$img['style'].'"' : ''; $html = $this->toHtml($_POST['content']);
$class = vartrue($img['class']) ? ' class="'.$img['class'].'"' : ''; }
$alt = vartrue($img['alt']) ? ' alt="'.$img['alt'].'"' : '';
if($_POST['mode'] == 'tobbcode')
list($url,$qry) = explode("?",$img['src']); {
$html = $this->toBBcode($_POST['content']);
parse_str($qry,$qr); }
$qr['w'] = $img['width']; if($this->gzipCompression == true)
$qr['h'] = $img['height']; {
header('Content-Encoding: gzip');
$src = $url."?".urldecode(http_build_query($qr)); $gzipoutput = gzencode($html,6);
header('Content-Length: '.strlen($gzipoutput));
$replacement = '<img'.$class.$style.' src="'.$src.'"'.$width.$height.$alt.' />'; echo $gzipoutput;
}
$text = preg_replace($regexp, $replacement, $text); else
{
echo $html;
} }
}
function toHtml($content)
{
global $pref, $tp; //XXX faster?
// XXX @Cam possible fix - convert to BB first, see news admin AJAX request/response values for reference why
$content = stripslashes($content);
// $content = e107::getBB()->htmltoBBcode($content); //XXX This breaks inserted images from media-manager. :/
e107::getBB()->setClass($_SESSION['media_category']);
if(check_class($pref['post_html'])) // raw HTML within [html] tags.
{
// $content = $tp->replaceConstants($content,'abs');
if(strstr($content,"[html]") === false) // BC - convert old BB code text to html.
{
e107::getBB()->clearClass();
$content = str_replace('\r\n',"<br />",$content);
$content = nl2br($content, true);
$content = $tp->toHtml($content, true);
}
$content = str_replace("{e_BASE}",e_HTTP,$content); // We want {e_BASE} in the final data going to the DB, but not the editor.
$srch = array("<!-- bbcode-html-start -->","<!-- bbcode-html-end -->","[html]","[/html]");
$content = str_replace($srch,"",$content);
$content = e107::getBB()->parseBBCodes($content); // parse the <bbcode> tag so we see the HTML equivalent while editing!
if(!empty($content) && E107_DEBUG_LEVEL > 0)
{
$content = "-- DEBUG MODE ACTIVE -- \n".$content;
// echo htmlentities($content)."\n";
// echo "<pre>".$content."</pre>";
$text = $content;
return $text;
// exit;
}
else
{
$text = $content;
}
}
else // bbcode Mode.
{
// XXX @Cam this breaks new lines, currently we use \n instead [br]
//echo $tp->toHtml(str_replace("\n","",$content), true);
$content = str_replace("{e_BASE}",e_HTTP, $content); // We want {e_BASE} in the final data going to the DB, but not the editor.
$content = $tp->toHtml($content, true);
$content = str_replace(e_MEDIA_IMAGE,"{e_MEDIA_IMAGE}",$content);
$text = "";
if(!empty($content) && E107_DEBUG_LEVEL > 0)
{
$text .= "<!-- bbcode mode -->";
//print_r(htmlentities($content))."\n";
//exit;
}
$text .= $content;
}
e107::getBB()->clearClass();
return $text;
}
function toBBcode($content)
{
// echo $_POST['content'];
global $pref, $tp;
$content = stripslashes($content);
if(check_class($pref['post_html'])) // Plain HTML mode.
{
$srch = array('src="'.e_HTTP.'thumb.php?','src="/{e_MEDIA_IMAGE}');
$repl = array('src="{e_BASE}thumb.php?','src="{e_BASE}thumb.php?src=e_MEDIA_IMAGE/');
$content = str_replace($srch, $repl, $content);
// resize the thumbnail to match wysiwyg width/height.
// $psrch = '/<img[^>]*src="{e_BASE}thumb.php\?src=([\S]*)w=([\d]*)&amp;h=([\d]*)"(.*)width="([\d]*)" height="([\d]*)"/i';
// $prepl = '<img src="{e_BASE}thumb.php?src=$1w=$5&amp;h=$6"$4width="$5" height="$6" ';
// $content = preg_replace($psrch, $prepl, $content);
$content = $this->updateImg($content);
$content = $tp->parseBBTags($content,true); // replace html with bbcode equivalent
if(strip_tags($content, '<i>') == '&nbsp;') // Avoid this: [html]<p>&nbsp;</p>[/html]
{
exit;
}
$text = $content ? "[html]".$content."[/html]" : ""; // Add the tags before saving to DB.
}
else // bbcode Mode. //XXX Disabled at the moment in tinymce/e_meta.php - post_html is required to activate.
{
// [img width=400]/e107_2.0/thumb.php?src={e_MEDIA_IMAGE}2012-12/e107org_white_stripe.png&w=400&h=0[/img]
// $content = str_replace("{e_BASE}","", $content); // We want {e_BASE} in the final data going to the DB, but not the editor.
$text = e107::getBB()->htmltoBBcode($content); // not reliable enough yet.
}
return $text;
}
/**
* Rebuld <img> tags with modified thumbnail size.
*/
function updateImg($text)
{
$arr = e107::getParser()->getTags($text,'img');
$srch = array("?","&");
$repl = array("\?","&amp;");
foreach($arr['img'] as $img)
{
$regexp = '#(<img[^>]*src="'.str_replace($srch, $repl, $img['src']).'"[^>]*>)#';
$width = vartrue($img['width']) ? ' width="'.$img['width'].'"' : '';
$height = vartrue($img['height']) ? ' height="'.$img['height'].'"' : '';
$style = vartrue($img['style']) ? ' style="'.$img['style'].'"' : '';
$class = vartrue($img['class']) ? ' class="'.$img['class'].'"' : '';
$alt = vartrue($img['alt']) ? ' alt="'.$img['alt'].'"' : '';
list($url,$qry) = explode("?",$img['src']);
parse_str($qry,$qr);
$qr['w'] = $img['width'];
$qr['h'] = $img['height'];
$src = $url."?".urldecode(http_build_query($qr));
$replacement = '<img'.$class.$style.' src="'.$src.'"'.$width.$height.$alt.' />';
$text = preg_replace($regexp, $replacement, $text);
}
return $text;
}
return $text;
} }
new e107TinyMceParser();
?> ?>