diff --git a/e107_handlers/e_parse_class.php b/e107_handlers/e_parse_class.php index e13a60af8..a45e4a343 100644 --- a/e107_handlers/e_parse_class.php +++ b/e107_handlers/e_parse_class.php @@ -32,6 +32,8 @@ class e_parse */ private $multibyte = false; // previously $utfAction + private $pref; // core prefs used in toHTML. + // Profanity filter private $e_pf; @@ -102,8 +104,8 @@ class e_parse 'link_replace' => true, // Parse shortcodes - TRUE enables parsing - 'parse_sc' => false, + // remove HTML tags. 'no_tags' => false, @@ -182,6 +184,11 @@ class e_parse 'RAWTEXT' => array( 'nobreak' => true, 'retain_nl' => true, 'link_click' => false, 'emotes' => false, 'hook' => false, 'no_tags' => true + ), + 'NODEFAULT' => + array ('context' => false, 'fromadmin' => false, 'emotes' => false, 'defs' => false, 'constants' => false, 'hook' => false, + 'scripts' => false, 'link_click' => false, 'link_replace' => false, 'parse_sc' => false, 'no_tags' => false, 'value' => false, + 'nobreak' => false, 'retain_nl' => false ) ); @@ -316,9 +323,14 @@ class e_parse } - public function getModifierList() + public function getModifierList($type = '') { - return $this->e_SuperMods; + if($type === 'super') + { + return $this->e_SuperMods; + } + + return $this->e_Modifiers; } @@ -1348,29 +1360,24 @@ class e_parse return $text; } - $pref = e107::getPref(); + if(empty($this->pref)) // cache the prefs. + { + $prefsUsed = array('smiley_activate', 'make_clickable', 'link_replace', 'main_wordwrap', 'link_text', + 'email_text', 'links_new_window', 'profanity_filter', 'tohtml_hook', 'e_tohtml_list', 'e_parse_list' + ); + + $cfg = e107::getConfig(); + foreach($prefsUsed as $v) + { + $this->pref[$v] = $cfg->get($v); + } + } global $fromadmin; // Set default modifiers to start $opts = $this->getModifiers($modifiers); - // Turn off a few things if not enabled in options - if(empty($pref['smiley_activate'])) - { - $opts['emotes'] = false; - } - - if(empty($pref['make_clickable'])) - { - $opts['link_click'] = false; - } - - if(empty($pref['link_replace'])) - { - $opts['link_replace'] = false; - } - if($this->isHtml($text)) //BC FIx for when HTML is saved without [html][/html] { $opts['nobreak'] = true; @@ -1405,9 +1412,9 @@ class e_parse */ // Make sure we have a valid count for word wrapping - if(!$wrap && !empty($pref['main_wordwrap'])) + if(!$wrap && !empty($this->pref['main_wordwrap'])) { - $wrap = $pref['main_wordwrap']; + $wrap = $this->pref['main_wordwrap']; } // $text = " ".$text; @@ -1570,10 +1577,10 @@ class e_parse if($opts['link_replace'] && defset('ADMIN_AREA') !== true) { - $link_text = $pref['link_text']; - $email_text = ($pref['email_text']) ? $this->replaceConstants($pref['email_text']) : LAN_EMAIL_SUBS; + $link_text = $this->pref['link_text']; + $email_text = ($this->pref['email_text']) ? $this->replaceConstants($this->pref['email_text']) : LAN_EMAIL_SUBS; - $sub_blk = $this->makeClickable($sub_blk, 'url', array('sub' => $link_text, 'ext' => $pref['links_new_window'])); + $sub_blk = $this->makeClickable($sub_blk, 'url', array('sub' => $link_text, 'ext' => $this->pref['links_new_window'])); $sub_blk = $this->makeClickable($sub_blk, 'email', array('sub' => $email_text)); } else @@ -1661,7 +1668,7 @@ class e_parse // profanity filter - if(!empty($pref['profanity_filter'])) + if($this->pref['profanity_filter']) { if(!is_object($this->e_pf)) { @@ -1686,12 +1693,12 @@ class e_parse if($opts['hook']) //Run any hooked in parsers { - if(!empty($pref['tohtml_hook'])) + if(!empty($this->pref['tohtml_hook'])) { // trigger_error('tohtml_hook is deprecated. Use e_parse.php instead.', E_USER_DEPRECATED); // NO LAN //Process the older tohtml_hook pref (deprecated) - foreach(explode(',', $pref['tohtml_hook']) as $hook) + foreach(explode(',', $this->pref['tohtml_hook']) as $hook) { if(!is_object($this->e_hook[$hook]) && is_readable(e_PLUGIN . $hook . '/' . $hook . '.php')) { @@ -1710,10 +1717,10 @@ class e_parse /** * / @deprecated */ - if(isset($pref['e_tohtml_list']) && is_array($pref['e_tohtml_list'])) + if(isset($this->pref['e_tohtml_list']) && is_array($this->pref['e_tohtml_list'])) { - foreach($pref['e_tohtml_list'] as $hook) + foreach($this->pref['e_tohtml_list'] as $hook) { if(empty($hook)) { @@ -1741,9 +1748,9 @@ class e_parse /** * / Preferred 'hook' */ - if(!empty($pref['e_parse_list'])) + if(!empty($this->pref['e_parse_list'])) { - foreach($pref['e_parse_list'] as $plugin) + foreach($this->pref['e_parse_list'] as $plugin) { $hookObj = e107::getAddon($plugin, 'e_parse'); if($tmp = e107::callMethod($hookObj, 'toHTML', $sub_blk, $opts['context'])) @@ -5320,6 +5327,11 @@ class e_parse { return $opts; } + + if(strpos($modifiers,'defaults_off') !== false) + { + $opts = $this->e_SuperMods['NODEFAULT']; + } // Now process any modifiers that are specified $aMods = explode(',', $modifiers); @@ -5351,6 +5363,21 @@ class e_parse } } + // Turn off a few things if not enabled in options + if(empty($this->pref['smiley_activate'])) + { + $opts['emotes'] = false; + } + + if(empty($this->pref['make_clickable'])) + { + $opts['link_click'] = false; + } + + if(empty($this->pref['link_replace'])) + { + $opts['link_replace'] = false; + } return $opts; } diff --git a/e107_tests/tests/unit/e_parseTest.php b/e107_tests/tests/unit/e_parseTest.php index 7f73b2eb0..d20efb60e 100644 --- a/e107_tests/tests/unit/e_parseTest.php +++ b/e107_tests/tests/unit/e_parseTest.php @@ -135,6 +135,209 @@ while($row = $sql->fetch()) } */ + function testToHTMLModifiers() + { + e107::getConfig()->set('make_clickable', 0)->save(false, true); + + $list = $this->tp->getModifierList(); + + $tests = array ( + 'emotes_off' => + array( + 'input' => ":-)", + 'expected' => ':-)', + ), + 'emotes_on' => + array( + 'input' => ":-)", + 'expected' => 'smile', + ), + 'no_hook' => + array( + 'input' => "", + 'expected' => '', + ), + 'do_hook' => + array( + 'input' => "", + 'expected' => '', + ), + 'scripts_off' => + array( + 'input' => "", + 'expected' => '', + ), + 'scripts_on' => + array( + 'input' => "", + 'expected' => '', + ), + 'no_make_clickable' => + array( + 'input' => "www.somewhere.com mailto:myemail@somewhere.com", + 'expected' => 'www.somewhere.com mailto:myemail@somewhere.com', + ), + 'make_clickable' => + array( + 'input' => "www.somewhere.com mailto:myemail@somewhere.com", + 'expected' => '', // random obfiscation + ), + 'no_replace' => + array( + 'input' => "www.somewhere.com", + 'expected' => '', + ), + 'replace' => + array( + 'input' => "www.somewhere.com", + 'expected' => '', + ), + 'consts_off' => + array( + 'input' => "{e_PLUGIN}", + 'expected' => '{e_PLUGIN}', + ), + 'consts_rel' => + array( + 'input' => "{e_PLUGIN}", + 'expected' => 'e107_plugins/', + ), + 'consts_abs' => + array( + 'input' => "{e_PLUGIN}", + 'expected' => '/e107_plugins/', + ), + 'consts_full' => + array( + 'input' => "{e_PLUGIN}", + 'expected' => 'https://localhost/e107/e107_plugins/', + ), + 'scparse_off' => + array( + 'input' => "{SITENAME}", + 'expected' => '{SITENAME}', + ), + 'scparse_on' => + array( + 'input' => "{SITENAME}", + 'expected' => 'e107', + ), + 'no_tags' => + array( + 'input' => "bold", + 'expected' => 'bold', + ), + 'do_tags' => + array( + 'input' => "bold", + 'expected' => 'bold', + ), + 'fromadmin' => + array( + 'input' => "My Text {SITENAME} {e_PLUGIN} www.somewhere.com \nNew line :-)", + 'expected' => '', + ), + 'notadmin' => + array( + 'input' => "My Text {SITENAME} {e_PLUGIN} www.somewhere.com \nNew line :-)", + 'expected' => '', + ), + 'er_off' => + array( + 'input' => "My Text {SITENAME} {e_PLUGIN} www.somewhere.com \nNew line :-)", + 'expected' => '', + ), + 'er_on' => + array( + 'input' => "My Text {SITENAME} {e_PLUGIN} www.somewhere.com \nNew line :-)", + 'expected' => '', + ), + 'defs_off' => + array( + 'input' => "LAN_THANK_YOU", + 'expected' => 'LAN_THANK_YOU', + ), + 'defs_on' => + array( + 'input' => "LAN_THANK_YOU", + 'expected' => 'Thank you', + ), + 'dobreak' => + array( + 'input' => "Line 1\nLine 2\nLine 3", + 'expected' => 'Line 1
Line 2
Line 3', + ), + 'nobreak' => + array( + 'input' => "Line 1\nLine 2\nLine 3", + 'expected' => "Line 1\nLine 2\nLine 3", + ), + 'lb_nl' => + array( + 'input' => "Line 1\nLine 2\nLine 3", + 'expected' => "Line 1\nLine 2\nLine 3", + ), + 'lb_br' => + array( + 'input' => "Line 1\nLine 2\nLine 3", + 'expected' => 'Line 1
Line 2
Line 3', + ), + 'retain_nl' => + array( + 'input' => "Line 1\nLine 2\nLine 3", + 'expected' => "Line 1\nLine 2\nLine 3", + ), + 'defs' => + array( + 'input' => "LAN_THANK_YOU", + 'expected' => 'Thank you', + ), + 'parse_sc' => + array( + 'input' => "{SITENAME}", + 'expected' => 'e107', + ), + 'constants' => + array( + 'input' => "{e_PLUGIN}", + 'expected' => 'e107_plugins/', + ), + 'value' => + array( + 'input' => "", + 'expected' => '', + ), + 'wysiwyg' => + array( + 'input' => "", + 'expected' => '', + ), + ); + + + + $ret = []; + foreach($list as $mod => $val) + { + if(empty($tests[$mod]['expected'])) + { + continue; + } + + $result = $this->tp->toHTML($tests[$mod]['input'], false, 'defaults_off,'.$mod); + $this->assertSame($tests[$mod]['expected'], $result, $mod." didn't match the expected result."); + // $ret[$mod] = $result; + + } + + + // e107::getConfig()->set('make_clickable', 0)->save(false, true); + // var_export($ret); + + } + + + function testToHTMLWithBBcode() { $tests = array( @@ -1161,9 +1364,25 @@ while($row = $sql->fetch()) 'nobreak' => true, 'retain_nl' => true, ), + 'NODEFAULT' => array( + 'context' => 'NODEFAULT', + 'fromadmin' => false, + 'emotes' => false, + 'defs' => false, + 'constants' => false, + 'hook' => false, + 'scripts' => false, + 'link_click' => false, + 'link_replace' => false, + 'parse_sc' => false, + 'no_tags' => false, + 'value' => false, + 'nobreak' => false, + 'retain_nl' => false, + ) ); - $list = $this->tp->getModifierList(); + $list = $this->tp->getModifierList('super'); $this->assertSame($expected, $list);