123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322 |
- <?php
- /**
- * StatusNet - the distributed open-source microblogging tool
- * Copyright (C) 2010, StatusNet, Inc.
- *
- * A plugin to add titles to notices
- *
- * PHP version 5
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
- * @category NoticeTitle
- * @package StatusNet
- * @author Evan Prodromou <evan@status.net>
- * @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);
- }
- define('NOTICE_TITLE_PLUGIN_VERSION', '0.1');
- /**
- * NoticeTitle plugin to add an optional title to notices.
- *
- * Stores notice titles in a secondary table, notice_title.
- *
- * @category NoticeTitle
- * @package StatusNet
- * @author Evan Prodromou <evan@status.net>
- * @copyright 2010 StatusNet, Inc.
- * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0
- * @link http://status.net/
- */
- class NoticeTitlePlugin extends Plugin
- {
- // By default, notice-title widget will be available to all users.
- // With restricted on, only users who have been granted the
- // "richedit" role get it.
- public $restricted = false;
- /**
- * Database schema setup
- *
- * Add the notice_title helper table
- *
- * @see Schema
- * @see ColumnDef
- *
- * @return boolean hook value; true means continue processing, false means stop.
- */
- function onCheckSchema()
- {
- $schema = Schema::get();
- // For storing titles for notices
- $schema->ensureTable('notice_title', Notice_title::schemaDef());
- return true;
- }
- /**
- * Provide plugin version information.
- *
- * This data is used when showing the version page.
- *
- * @param array &$versions array of version data arrays; see EVENTS.txt
- *
- * @return boolean hook value
- */
- function onPluginVersion(&$versions)
- {
- $url = 'http://status.net/wiki/Plugin:NoticeTitle';
- $versions[] = array('name' => 'NoticeTitle',
- 'version' => NOTICE_TITLE_PLUGIN_VERSION,
- 'author' => 'Evan Prodromou',
- 'homepage' => $url,
- 'rawdescription' =>
- // TRANS: Plugin description.
- _m('Adds optional titles to notices.'));
- return true;
- }
- /**
- * Show title entry when showing notice form
- *
- * @param Form $form Form being shown
- *
- * @return boolean hook value
- */
- function onStartShowNoticeFormData($form)
- {
- if ($this->isAllowedRichEdit()) {
- $form->out->element('style',
- null,
- 'label#notice_data-text-label { display: none }');
- $form->out->element('input', array('type' => 'text',
- 'id' => 'notice_title',
- 'name' => 'notice_title',
- 'size' => 40,
- 'maxlength' => Notice_title::MAXCHARS));
- }
- return true;
- }
- /**
- * Validate notice title before saving
- *
- * @param Action $action NewNoticeAction being executed
- * @param integer &$authorId Author ID
- * @param string &$text Text of the notice
- * @param array &$options Options array
- *
- * @return boolean hook value
- */
- function onStartNoticeSaveWeb($action, &$authorId, &$text, &$options)
- {
- $title = $action->trimmed('notice_title');
- if (!empty($title) && $this->isAllowedRichEdit()) {
- if (mb_strlen($title) > Notice_title::MAXCHARS) {
- // TRANS: Exception thrown when a notice title is too long.
- // TRANS: %d is the maximum number of characters allowed in a title (used for plural).
- throw new Exception(sprintf(_m('The notice title is too long (maximum %d character).',
- 'The notice title is too long (maximum %d characters).',
- Notice_title::MAXCHARS),
- Notice_title::MAXCHARS));
- }
- }
- return true;
- }
- /**
- * Save notice title after notice is saved
- *
- * @param Action $action NewNoticeAction being executed
- * @param Notice $notice Notice that was saved
- *
- * @return boolean hook value
- */
- function onEndNoticeSaveWeb($action, $notice)
- {
- if (!empty($notice)) {
- $title = $action->trimmed('notice_title');
- if (!empty($title) && $this->isAllowedRichEdit()) {
- $nt = new Notice_title();
- $nt->notice_id = $notice->id;
- $nt->title = $title;
- $nt->insert();
- }
- }
- return true;
- }
- /**
- * Show the notice title in lists
- *
- * @param NoticeListItem $nli NoticeListItem being shown
- *
- * @return boolean hook value
- */
- function onStartShowNoticeTitle(NoticeListItem $nli)
- {
- $title = Notice_title::fromNotice($nli->notice);
- if (!empty($title)) {
- $nli->elementStart('h4', array('class' => 'p-name'));
- $nli->element('a', array('href' => $nli->notice->getUrl()), $title);
- $nli->elementEnd('h4');
- return false;
- }
- return true;
- }
- /**
- * Show the notice title in RSS output
- *
- * @param Notice $notice Notice being shown
- * @param array &$entry array of values used for RSS output
- *
- * @return boolean hook value
- */
- function onEndRssEntryArray($notice, &$entry)
- {
- $title = Notice_title::fromNotice($notice);
- if (!empty($title)) {
- $entry['title'] = $title;
- }
- return true;
- }
- /**
- * Show the notice title in Atom output
- *
- * @param Notice $notice Notice being shown
- * @param Activity $act Activity object to be modified
- * @param Profile $scoped Currently logged in/scoped profile
- *
- * @return boolean hook value
- */
- function onEndNoticeAsActivity(Notice $stored, Activity $act, Profile $scoped=null)
- {
- $title = Notice_title::fromNotice($stored);
- if (!empty($title)) {
- foreach ($act->objects as $obj) {
- if ($obj->id == $stored->getUri()) {
- $obj->title = $title;
- break;
- }
- }
- }
- return true;
- }
- /**
- * Remove title when the notice is deleted
- *
- * @param Notice $notice Notice being deleted
- *
- * @return boolean hook value
- */
- function onNoticeDeleteRelated($notice)
- {
- $nt = Notice_title::getKV('notice_id', $notice->id);
- if (!empty($nt)) {
- $nt->delete();
- }
- return true;
- }
- /**
- * If a notice has a title, show it in the <title> element
- *
- * @param Action $action Action being executed
- *
- * @return boolean hook value
- */
- function onStartShowHeadTitle($action)
- {
- $actionName = $action->trimmed('action');
- if ($actionName == 'shownotice') {
- $title = Notice_title::fromNotice($action->notice);
- if (!empty($title)) {
- $action->element('title', null,
- // TRANS: Page title. %1$s is the title, %2$s is the site name.
- sprintf(_m("%1\$s - %2\$s"),
- $title,
- common_config('site', 'name')));
- }
- }
- return true;
- }
- /**
- * If a notice has a title, show it in the <h1> element
- *
- * @param Notice $notice Notice we're getting the title for
- * @param string $title Reference to the variable which we set to the notice's title
- *
- * @return boolean hook value
- */
- function onGetNoticeTitle(Notice $notice, &$title)
- {
- $title = Notice_title::fromNotice($notice);
- if (!is_null($title)) {
- return false;
- }
- return true;
- }
- /**
- * Does the current user have permission to use the notice-title widget?
- * Always true unless the plugin's "restricted" setting is on, in which
- * case it's limited to users with the "richedit" role.
- *
- * @todo FIXME: make that more sanely configurable :)
- *
- * @return boolean
- */
- private function isAllowedRichEdit()
- {
- if ($this->restricted) {
- $user = common_current_user();
- return !empty($user) && $user->hasRole('richedit');
- } else {
- return true;
- }
- }
- }
|