. * * @category WYSIWYG * @package StatusNet * @author Evan Prodromou * @copyright 2010 StatusNet, Inc. * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0 * @link http://status.net/ */ if (!defined('STATUSNET')) { // This check helps protect against security problems; // your code file can't be executed directly from the web. exit(1); } /** * Use TinyMCE library to allow rich text editing in the browser * * Converts the notice form in browser to a rich-text editor. * * @category WYSIWYG * @package StatusNet * @author Evan Prodromou * @copyright 2010 StatusNet, Inc. * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0 * @link http://status.net/ */ class TinyMCEPlugin extends Plugin { var $html; function onEndShowScripts($action) { if (common_logged_in()) { $action->script(common_path('plugins/TinyMCE/js/jquery.tinymce.js')); $action->inlineScript($this->_inlineScript()); } return true; } function onEndShowStyles($action) { $action->style('span#notice_data-text_container, span#notice_data-text_parent { float: left }'); return true; } function onPluginVersion(&$versions) { $versions[] = array('name' => 'TinyMCE', 'version' => STATUSNET_VERSION, 'author' => 'Evan Prodromou', 'homepage' => 'http://status.net/wiki/Plugin:TinyMCE', 'rawdescription' => _m('Use TinyMCE library to allow rich text editing in the browser')); return true; } /** * Sanitize HTML input and strip out potentially dangerous bits. * * @param string $raw HTML * @return string HTML */ private function sanitizeHtml($raw) { require_once INSTALLDIR.'/extlib/htmLawed/htmLawed.php'; $config = array('safe' => 1, 'deny_attribute' => 'id,style,on*'); return htmLawed($raw, $config); } /** * Strip HTML to plaintext string * * @param string $html HTML * @return string plaintext, single line */ private function stripHtml($html) { return str_replace("\n", " ", html_entity_decode(strip_tags($html))); } /** * Hook for new-notice form processing to take our HTML goodies; * won't affect API posting etc. * * @param NewNoticeAction $action * @param User $user * @param string $content * @param array $options * @return boolean hook return */ function onSaveNewNoticeWeb($action, $user, &$content, &$options) { $html = $this->sanitizeHtml($action->arg('status_textarea')); $options['rendered'] = $html; $content = $this->stripHtml($html); return true; } function _inlineScript() { $path = common_path('plugins/TinyMCE/js/tiny_mce.js'); // Note: the normal on-submit triggering to save data from // the HTML editor into the textarea doesn't play well with // our AJAX form submission. Manually moving it to trigger // on our send button click. $scr = <<