git.gnu.io has moved to IP address 209.51.188.249 -- please double check where you are logging in.

Commit 7dcb2767 authored by Zach Copley's avatar Zach Copley

Merge branch '1.0.x' of gitorious.org:statusnet/mainline into 1.0.x

parents c137d69a 5c852b87
......@@ -2,8 +2,8 @@
README
------
StatusNet 1.0.0rc1
20 September 2011
StatusNet 1.0.0
30 September 2011
This is the README file for StatusNet, the Open Source social
networking platform. It includes general information about the
......@@ -197,6 +197,7 @@ Feedback
place to discuss the software.
* StatusNet has a bug tracker for any defects you may find, or ideas for
making things better. http://status.net/open-source/issues
* The StatusNet forum is at http://forum.status.net/.
Credits
=======
......
......@@ -162,4 +162,72 @@ class DocAction extends Action
Event::handle('EndLoadDoc', array($this->title, &$this->output));
}
}
function showLocalNav()
{
$menu = new DocNav($this);
$menu->show();
}
}
class DocNav extends Menu
{
function show()
{
$stub = new HomeStubNav($this->action);
$this->submenu(_m('MENU','Home'), $stub);
$docs = new DocListNav($this->action);
$this->submenu(_m('MENU','Docs'), $docs);
}
}
class DocListNav extends Menu
{
function getItems()
{
$items = array();
if (Event::handle('StartDocsMenu', array(&$items))) {
$items = array(array('doc',
array('title' => 'help'),
_m('MENU', 'Help'),
_('Getting started'),
'nav_doc_help'),
array('doc',
array('title' => 'about'),
_m('MENU', 'About'),
_('About this site'),
'nav_doc_about'),
array('doc',
array('title' => 'faq'),
_m('MENU', 'FAQ'),
_('Frequently asked questions'),
'nav_doc_faq'),
array('doc',
array('title' => 'contact'),
_m('MENU', 'Contact'),
_('Contact info'),
'nav_doc_contact'),
array('doc',
array('title' => 'tags'),
_m('MENU', 'Tags'),
_('Using tags'),
'nav_doc_tags'),
array('doc',
array('title' => 'groups'),
_m('MENU', 'Groups'),
_('Using groups'),
'nav_doc_groups'),
array('doc',
array('title' => 'api'),
_m('MENU', 'API'),
_('RESTful API'),
'nav_doc_api'));
Event::handle('EndDocsMenu', array(&$items));
}
return $items;
}
}
......@@ -168,4 +168,38 @@ abstract class Managed_DataObject extends Memcached_DataObject
}
return $links;
}
/**
* Return a list of all primary/unique keys / vals that will be used for
* caching. This will understand compound unique keys, which
* Memcached_DataObject doesn't have enough info to handle properly.
*
* @return array of strings
*/
function _allCacheKeys()
{
$table = call_user_func(array(get_class($this), 'schemaDef'));
$ckeys = array();
if (!empty($table['unique keys'])) {
$keyNames = $table['unique keys'];
foreach ($keyNames as $idx => $fields) {
$val = array();
foreach ($fields as $name) {
$val[$name] = self::valueString($this->$name);
}
$ckeys[] = self::multicacheKey($this->tableName(), $val);
}
}
if (!empty($table['primary key'])) {
$fields = $table['primary key'];
$val = array();
foreach ($fields as $name) {
$val[$name] = self::valueString($this->$name);
}
$ckeys[] = self::multicacheKey($this->tableName(), $val);
}
return $ckeys;
}
}
\ No newline at end of file
......@@ -80,26 +80,4 @@ class User_im_prefs extends Managed_DataObject
);
}
/**
* We have two compound keys with unique constraints:
* (transport, user_id) which is our primary key, and
* (transport, screenname) which is an additional constraint.
*
* Currently there's not a way to represent that second key
* in the general keys list, so we're adding it here to the
* list of keys to use for caching, ensuring that it gets
* cleared as well when we change.
*
* @return array of cache keys
*/
function _allCacheKeys()
{
$ukeys = 'transport,screenname';
$uvals = $this->transport . ',' . $this->screenname;
$ckeys = parent::_allCacheKeys();
$ckeys[] = $this->cacheKey($this->tableName(), $ukeys, $uvals);
return $ckeys;
}
}
......@@ -2,13 +2,15 @@
<!-- Document licensed under Creative Commons Attribution 3.0 Unported. See -->
<!-- http://creativecommons.org/licenses/by/3.0/ for details. -->
%%site.name%% is a
[micro-blogging](http://en.wikipedia.org/wiki/Micro-blogging) service
based on the Free Software [StatusNet](http://status.net/) tool.
%%site.name%% is a stream-oriented social network service based on the
Free Software [StatusNet](http://status.net/) tool.
If you [register](%%action.register%%) for an account,
you can post small (%%site.textlimit%% chars or less) text notices
about yourself, where you are, what you're doing, or practically
anything you want. You can also subscribe to the notices of your
friends, or other people you're interested in, and follow them on the
Web or in an [RSS](http://en.wikipedia.org/wiki/RSS) feed.
If you [register](%%action.register%%) for an account, you can post
small (%%site.textlimit%% chars or less) text notices about yourself,
where you are, what you're doing, what you're working on or what
you're thinking about. You can also subscribe to the notices of your
friends, or other people you're interested in, and follow them
privately or on the Web.
You can also post event invitations, bookmarks, polls, questions, or
other kinds of data.
<!-- Copyright 2008-2010 StatusNet Inc. and contributors. -->
<!-- Document licensed under Creative Commons Attribution 3.0 Unported. See -->
<!-- http://creativecommons.org/licenses/by/3.0/ for details. -->
Install the %%site.name%% badge on your blog or web site to show the latest updates
from you and your friends!
<MTMarkdownOptions output='raw'>
<script type="text/javascript" src="http://identi.ca/js/identica-badge.js">
{
"user":"kentbrew",
"server":"identi.ca",
"headerText":" and friends"
}
</script>
</MTMarkdownOptions>
Things to try
--------------
* Click an avatar and the badge will refresh with that user's timeline
* Click a nickname to open a user's profile in your browser
* Click a notice's timestamp to view the notice in your browser
* @-replies and #tags are live links
## Installation instructions
Copy and paste the following JavaScript into an HTML page where
you want the badge to show up. Substitute your own ID in the user
parameter.
<pre>
&lt;script type=&quot;text/javascript&quot; src=&quot;http://identi.ca/js/identica-badge.js&quot;&gt;
{
&quot;user&quot;:&quot;kentbrew&quot;,
&quot;server&quot;:&quot;identi.ca&quot;,
&quot;headerText&quot;:&quot; and friends&quot;
}
&lt;/script&gt;
</pre>
Valid parameters for the badge:
-------------------------------
* user : defaults to 7000 (@kentbrew)
* headerText : defaults to empty
* height : defaults to 350px
* width : defaults to 300px
* background : defaults to #193441. If you set evenBackground, oddBackground,
and headerBackground, you won't see it at all.
* border : defaults to 1px solid black
* userColor : defaults to whatever link color is set to on your page
* headerBackground : defaults to transparent
* headerColor : defaults to white
* evenBackground : defaults to #fff
* oddBackground : defaults to #eee
* thumbnailBorder : 1px solid black
* thumbnailSize : defaults to 24px
* padding : defaults to 3px
* server : defaults to identi.ca
Licence
-------
Identi.ca badge by [Kent Brewster](http://kentbrewster.com/identica-badge/).
Licenced under [CC-BY-SA-3](http://kentbrewster.com/rights-and-permissions/).
<!-- Copyright 2008-2010 StatusNet Inc. and contributors. -->
<!-- Document licensed under Creative Commons Attribution 3.0 Unported. See -->
<!-- http://creativecommons.org/licenses/by/3.0/ for details. -->
A bookmarklet is a small piece of javascript code used as a bookmark. This one will let you post to %%site.name%% simply by selecting some text on a page and pressing the bookmarklet.
Drag-and-drop the following link to your bookmarks bar or right-click it and add it to your browser favorites to keep it handy.
<a href="javascript:(function(){var%20d=document,w=window,e=w.getSelection,k=d.getSelection,x=d.selection,s=(e?e():(k)?k():(x?x.createRange().text:0)),f='http://%%site.server%%/%%site.path%%/index.php?action=bookmarklet',l=d.location,e=encodeURIComponent,g=f+'&status_textarea=%E2%80%9C'+((e(s))?e(s):e(document.title))+'%E2%80%9D%20%E2%80%94%20'+e(l.href);function%20a(){if(!w.open(g,'t','toolbar=0,resizable=0,scrollbars=1,status=1,width=450,height=200')){l.href=g;}}a();})()">Post to %%site.name%%</a>
......@@ -5,14 +5,6 @@
There are a number of options for getting in contact with responsible
people for %%site.name%%.
Post a notice
-------------
If you have a question about how to do something, just post a notice
with your question. People here like to answer messages. Watch the
[public timeline](%%action.top%%) for answers; they'll usually start
with "@" plus your user name.
Bugs
----
......@@ -25,4 +17,10 @@ Email
You can reach the responsible party for this server at [%%site.email%%](mailto:%%site.email%%).
Post a notice
-------------
If you have a question about how to do something, just post a notice
with your question. Watch your inbox [public timeline](%%action.top%%)
for answers.
......@@ -8,39 +8,43 @@ some answers.
What is %%site.name%%?
----------------------
%%site.name%% is a [micro-blogging](http://en.wikipedia.org/wiki/Micro-blogging) service.
%%site.name%% is a stream oriented social network service.
You can use it to write short notices about yourself, where you are,
and what you're doing, and those notices will be sent to all your friends
and fans.
How is %%site.name%% different from Twitter, Jaiku, Pownce, Plurk, others?
--------------------------------------------------------------------------
%%site.name%% is an [Open Network Service](http://opendefinition.org/ossd). Our main
goal is to provide a fair and transparent service that preserves users' autonomy. In
particular, all the software used for %%site.name%% is [Free Software](http://en.wikipedia.org/wiki/Free_Software), and all the data is available
under the [%%license.title%%](%%license.url%%) license, making it Open Data.
You can also post event invitations, bookmarks, polls, and questions or
other kinds of social broadcasts.
The software also implements the [OpenMicroBlogging](http://openmicroblogging.org/) protocol, meaning that you can have friends on other microblogging services
that can receive your notices.
How is %%site.name%% different from Twitter?
--------------------------------------------
The goal here is *autonomy* -- you deserve the right to manage your own on-line
presence. If you don't like how %%site.name%% works, you can take your data and the source code and set up your own server (or move your account to another one).
Like [Twitter](http://twitter.com/), %%site.name%% is a light service
with a stream-oriented interface. It uses @-replies, hashtags,
provides search, and has private messages. It provides an API, and can
be integrated with SMS systems. You can create lists.
Where is feature X?
-------------------
Unlike Twitter, %%site.name%% allows more data than just plain text
and links to travel across the network. You can install the StatusNet
software that runs %%site.name%% on your own servers, since it's Free
and Open Source software. You can make groups, and share privately
with those groups.
The software we run, [StatusNet](http://status.net/), is still in its early stages,
and many features people expect from microblogging sites are not yet implemented. Some important ones that are expected "soon":
You can make your site available only to people you choose. You can
customize it with your own themes and plugins, or download plugins
from the StatusNet site.
* More [AJAX](http://en.wikipedia.org/wiki/AJAX)-y interface
* Maps
* Cross-post to Pownce, Jaiku, etc.
* Pull messages from Twitter, Pownce, Jaiku, etc.
* [Facebook](http://www.facebook.com/) integration
* Image, video, audio notices
How is %%site.name%% different from Yammer, SocialCast, or Salesforce Chatter?
------------------------------------------------------------------------------
There is [a list of bugs and features](http://status.net/bugs/) that you may find
interesting. New ideas or complaints are very welcome.
Like some enterprise social software services, StatusNet lets you
share privately with other people in your company. You can use
microapps to post richer kinds of data, use public and private groups
to share with team members, use extended profiles to show more about
yourself and your company, and review groups and users in a directory.
Unlike those other services, StatusNet is free and open source
software. You can install it on your own servers. You can customize
the theme and add plugins.
......@@ -4,7 +4,8 @@
Users on %%site.name%% can create *groups* that other users can join.
Groups can be a great way to share information and entertainment with
a group of people who have a common interest or background.
a group of people who have a common interest or background; who work
together on a team; or who have a particular knowledge or skill.
You can find out about groups on the server on the
[Groups](%%action.groups%%) page. You can join a group by clicking on
......@@ -13,16 +14,16 @@ the "Join" button either in the group list or on the group's home page.
Starting a new group
--------------------
If you want, you can start a new group for friends and people with
common interests. Note that all groups are free for anyone to join.
You can start a new group for friends and colleagues. Note that all
groups are free for anyone to join.
To start a new group, use the [new group](%%action.newgroup%%) tool
and fill out the form. Describe your group as best you can if you want
people to be able to find it.
When choosing the nickname for your group, try to keep it short. The
nickname is included in every message to and from the group, so the
less chars the better. Try using acronyms for organizations, or
nickname is sometimes included in messages to and from the group, so
the less chars the better. Try using acronyms for organizations, or
airport codes for places (like 'pdx' instead of 'portland').
Sending messages to a group
......@@ -33,14 +34,22 @@ anywhere in the message. If you have more than one group named, the
notice will go to each group. Only members can send notices to a
group, and groups do not respond to direct messages (DMs).
You can also select the group from the "To:" drop down when posting.
You can make a group message private by clicking the "private" button
before posting.
Receiving messages
------------------
New group messages will appear in your inbox, and will also come to
your phone or IM client if you've set them up to receive notices.
Remote groups
-------------
Private groups
--------------
The administrator can make a group private. For a private group, all
notices will marked as private for group members only. Also,
administrators will have to approve all new members to the group.
While it's technically possible, this version of StatusNet does not
support remote group membership.
Private groups are visible in the group directory.
......@@ -2,38 +2,18 @@
<!-- Document licensed under Creative Commons Attribution 3.0 Unported. See -->
<!-- http://creativecommons.org/licenses/by/3.0/ for details. -->
%%site.name%% is a **microblogging service**. Users post short (%%site.textlimit%%
character) notices which are broadcast to their friends and fans using
the Web, RSS, or instant messages.
%%site.name%% is a **social service**. Users can post short
(%%site.textlimit%% character) status messages which are broadcast to
their friends and colleagues on the service and (optionally) onto the Web.
You can also broadcast other types of data, like bookmarks, event
invitations, polls, and questions.
If you'd like to try it out, first [register](%%action.register%%) a new account.
Then, on the [public timeline](%%action.top%%), enter your message into
the textbox at the top of the page, and click "Send". It will go out on the
public timeline and to anyone who is subscribed to your notices (probably nobody,
at first).
public timeline and to anyone who is subscribed to your notices.
To subscribe to other people's notifications, go to their profile page
and click the "subscribe" button. They'll get a notice that you're now
subscribed to their notifications, and, who knows?, they might subscribe
back.
More help
---------
Here are some documents that you might find helpful in understanding
%%site.name%% and how to use it.
* [About](%%doc.about%%) - an overview of the service
* [FAQ](%%doc.faq%%) - frequently-asked questions about %%site.name%%
* [Contact](%%doc.contact%%) - who to contact with questions about the service
* [IM](%%doc.im%%) - using the instant-message (IM) features of %%site.name%%
* [SMS](%%doc.sms%%) - tying your cellphone to %%site.name%%
* [Tags](%%doc.tags%%) - different ways to use tagging
* [Groups](%%doc.groups%%) - joining together in groups
* [Lists](%%doc.lists%%) - organize your contacts
* [OpenMicroBlogging](%%doc.openmublog%%) - subscribing to remote users
* [Privacy](%%doc.privacy%%) - %%site.name%%'s privacy policy
* [Source](%%doc.source%%) - How to get the StatusNet source code
* [Badge](%%doc.badge%%) - How to put a StatusNet badge on your blog or homepage
* [Bookmarklet](%%doc.bookmarklet%%) - Bookmarklet for posting Web pages
* [API](%%doc.api%%) - API for use by external clients
subscribed to their notifications.
<!-- Copyright 2008-2010 StatusNet Inc. and contributors. -->
<!-- Document licensed under Creative Commons Attribution 3.0 Unported. See -->
<!-- http://creativecommons.org/licenses/by/3.0/ for details. -->
%%site.name%% supports
[tags](http://en.wikipedia.org/wiki/Tag_(metadata)) to help you
organize your activities here. You can use tags for people and for
notices.
Tagging a notice
----------------
You can tag a notice using a *hashtag*; a # character followed by
letters and numbers as well as '.', '-', and '_'. Note that accented
latin characters are not supported, and non-roman scripts are right out.
The HTML for the notice will link to a stream of all the other notices
with that tag. This can be a great way to keep track of a conversation.
The most popular current tags on the site can be found in the [public
tag cloud](%%action.publictagcloud%%). Their size shows their
popularity and recency.
Tagging yourself
----------------
You can also add tags for yourself on your [profile
settings](%%action.profilesettings%%) page or by using the edit tags
button on your profile page. Use single words to
describe yourself, your experiences and your interest. The tags will
become links on your profile page to a list of all the users on the
site who use that same tag. It can be a nice way to find people who
are related to you geographically or who have a common interest.
Tagging others
--------------
You can also tag other users by using the edit tags button next to
their profile. Such tags are called *people tags*. Once you have
created a people tag, you can add or remove users from it using the
tag's edit form. This makes it easy to organize your subscriptions
into groups and sort through them separately. Also, it will let
you create custom lists of people that others can subscribe to.
You can also send a notice "to the attention of" your subscribers
whom you've marked with a particular tag (note: *not* people who've
marked themselves with that tag). "@#family hello" will send a
notice to all your subscribers you've marked with the tag 'family'.
Private and public people tags
------------------------------
A private people tag is only visible to the creator, it cannot be
subscribed to, but the timeline can be viewed. To create a new
private prepend a '.' to the tag in the tags editing box. To set
an existing public tag as private or vice-versa, go to the tag's
edit page.
Remote people tags
------------------
You can even [tag remote users](%%action.profilesettings%%). Just
enter the remote profile's URI and click on the "Fetch" button to
fetch the profile, you can then add tags and save them.
Subscribing to the timeline of a people tag on another server also
works. Just copy the URL of the people tag's timeline page to the
[OStatus subscription](%%action.ostatussub%%) form.
<!-- Copyright 2008-2010 StatusNet Inc. and contributors. -->
<!-- Document licensed under Creative Commons Attribution 3.0 Unported. See -->
<!-- http://creativecommons.org/licenses/by/3.0/ for details. -->
[OpenMicroBlogging](http://openmicroblogging.org/) is a protocol that
lets users of one [microblogging](http://en.wikipedia.org/wiki/microblogging) service
subscribe to notices by users of another service. The protocol, based on
[OAuth](http://oauth.net/), is open and free, and doesn't depend on any
central authority to maintain the federated microblogs.
The [StatusNet](http://status.net/) software that runs %%site.name%% supports
OpenMicroBlogging 0.1. Anyone can make a new installation of StatusNet on their
own servers, and users of that new installation can subscribe to notices from
%%site.name%%.
Remote subscription
-------------------
If you have an account on a remote site that supports OpenMicroBlogging, and you
want to subscribe to the notices of a user on this site, click on the "Subscribe"
link under their avatar on their profile page. This should take you to the
[remote subscription](%%action.remotesubscribe%%) page. Make sure that you've got the
right nickname registered, and enter your profile URL on the other microblogging
service.
You'll be taken to your microblogging service, where you'll be asked to confirm the
subscription. When you confirm, your service will receive new notifications from
the user on %%site.name%%, and your service will forward them to you (using IM, SMS,
the Web, or whatever else).
......@@ -51,19 +51,3 @@ subscribed to, but the timeline can be viewed. To create a new
private prepend a '.' to the tag in the tags editing box. To set
an existing public tag as private or vice-versa, go to the tag's
edit page.
The most used public tags are displayed in the
[public people tag cloud](%%action.publicpeopletagcloud%%). Their
size shows their frequency of use.
Remote people tags
------------------
You can even [tag remote users](%%action.profilesettings%%). Just
enter the remote profile's URI and click on the "Fetch" button to
fetch the profile, you can then add tags and save them.
Subscribing to the timeline of a people tag on another server also
works. Just copy the URL of the people tag's timeline page to the
[OStatus subscription](%%action.ostatussub%%) form.
......@@ -43,11 +43,23 @@
*/
class Cache
{
var $_items = array();
/**
* @var array additional in-process cache for web requests;
* disabled on CLI, unsafe for long-running daemons
*/
var $_items = array();
var $_inlineCache = true;
static $_inst = null;
const COMPRESSED = 1;
private function __construct() {
// Potentially long-running daemons or maintenance scripts
// should not use an in-process cache as it becomes out of
// date.
$this->_inlineCache = (php_sapi_name() != 'cli');
}
/**
* Singleton constructor
*
......@@ -166,7 +178,7 @@ class Cache
common_perf_counter('Cache::get', $key);
if (Event::handle('StartCacheGet', array(&$key, &$value))) {
if (array_key_exists($key, $this->_items)) {
if ($this->_inlineCache && array_key_exists($key, $this->_items)) {
$value = unserialize($this->_items[$key]);
}
Event::handle('EndCacheGet', array($key, &$value));
......@@ -193,7 +205,9 @@ class Cache
if (Event::handle('StartCacheSet', array(&$key, &$value, &$flag,
&$expiry, &$success))) {
$this->_items[$key] = serialize($value);
if ($this->_inlineCache) {
$this->_items[$key] = serialize($value);
}
$success = true;
......@@ -244,7 +258,7 @@ class Cache
common_perf_counter('Cache::delete', $key);
if (Event::handle('StartCacheDelete', array(&$key, &$success))) {
if (array_key_exists($key, $this->_items)) {
if ($this->_inlineCache && array_key_exists($key, $this->_items)) {
unset($this->_items[$key]);
}
$success = true;
......
<?php
/**
* StatusNet - the distributed open-source microblogging tool
* Copyright (C) 2011, StatusNet, Inc.
*
* Stub sub-menu for sections that need to go home
*
* 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 Menu
* @package StatusNet
* @author Evan Prodromou <evan@status.net>
* @copyright 2011 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);
}
/**
* stub sub-menu for settings and stuff
*
* @category General
* @package StatusNet
* @author Evan Prodromou <evan@status.net>
* @copyright 2011 StatusNet, Inc.
* @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0
* @link http://status.net/
*/
class HomeStubNav extends Menu
{
function getItems()
{
return array(array('top',
null,
// TRANS: Menu item in personal group navigation menu.
_m('MENU','Home'),
// TRANS: Menu item title in personal group navigation menu.
// TRANS: %s is a username.
_('Back to top'),
'nav_return_top'));
}
}
......@@ -79,9 +79,6 @@ class SecondaryNav extends Menu
// TRANS: Secondary navigation menu item leading to e-mail contact information on the
// TRANS: StatusNet site, where to report bugs, ...
_m('MENU','Contact'));
$this->out->menuItem(common_local_url('doc', array('title' => 'badge')),
// TRANS: Secondary navigation menu item. Leads to information about embedding a timeline widget.
_m('MENU','Badge'));
Event::handle('EndSecondaryNav', array($this->action));
}
$this->out->elementEnd('ul');
......
......@@ -59,24 +59,9 @@ class SettingsNav extends Menu
$nickname = $user->nickname;
$name = $user->getProfile()->getBestName();
// Stub section w/ home link
$this->action->elementStart('ul');
$this->action->elementStart('li');
// TRANS: Header in settings navigation panel.
$this->action->element('h3', null, _m('HEADER','Home'));
$this->action->elementStart('ul', 'nav');
$this->out->menuItem(common_local_url('all', array('nickname' =>
$nickname)),
// TRANS: Menu item in settings navigation panel.
_m('MENU','Home'),
// TRANS: Menu item title in settings navigation panel.
// TRANS: %s is a username.
sprintf(_('%s and friends'), $name),
$this->action == 'all', 'nav_timeline_personal');
$this->action->elementEnd('ul');
$this->action->elementEnd('li');
$this->action->elementEnd('ul');
$stub = new HomeStubNav($this->action);
$this->submenu(_m('MENU','Home'), $stub);
$this->action->elementStart('ul');
$this->action->elementStart('li');
// TRANS: Header in settings navigation panel.
......
......@@ -536,15 +536,12 @@ class OpenIDPlugin extends Plugin
*
* @return boolean hook value
*/
function onEndLoadDoc($title, &$output)
{
if ($title == 'help') {
// TRANS: Item on help page. This message contains Markdown links in the form [description](link).
$menuitem = _m('* [OpenID](%%doc.openid%%) - What OpenID is and how to use it with this service.');
$output .= common_markup_to_html($menuitem);
}
function onEndDocsMenu(&$items) {
$items[] = array('doc',
array('title' => 'openid'),
_m('MENU', 'OpenID'),
_('Logging in with OpenID'),
'nav_doc_openid');
return true;
}
......
......@@ -3,9 +3,9 @@
If you already have an account on %%site.name%%, you can [login](%%action.login%%) with your username and password as usual.
To use OpenID in the future, you can [add an OpenID to your account](%%action.openidsettings%%) after you have logged in normally.
There are many [Public OpenID providers](http://wiki.openid.net/OpenID-Providers), and you may already have an OpenID-enabled account on another service.
There are many [Public OpenID providers](http://openid.net/get-an-openid/), and you may already have an OpenID-enabled account on another service.