Merge remote-tracking branch 'upstream/2021.06-rc' into http-input-data

This commit is contained in:
Michael 2021-05-22 20:26:32 +00:00
commit 6f44476c56
158 changed files with 760 additions and 633 deletions

View file

@ -1 +1 @@
2021.06-dev 2021.06-rc

View file

@ -38,7 +38,7 @@ use Friendica\Util\DateTimeFormat;
define('FRIENDICA_PLATFORM', 'Friendica'); define('FRIENDICA_PLATFORM', 'Friendica');
define('FRIENDICA_CODENAME', 'Siberian Iris'); define('FRIENDICA_CODENAME', 'Siberian Iris');
define('FRIENDICA_VERSION', '2021.06-dev'); define('FRIENDICA_VERSION', '2021.06-rc');
define('DFRN_PROTOCOL_VERSION', '2.23'); define('DFRN_PROTOCOL_VERSION', '2.23');
define('NEW_TABLE_STRUCTURE_VERSION', 1288); define('NEW_TABLE_STRUCTURE_VERSION', 1288);

View file

@ -1,6 +1,6 @@
-- ------------------------------------------ -- ------------------------------------------
-- Friendica 2021.06-dev (Siberian Iris) -- Friendica 2021.06-rc (Siberian Iris)
-- DB_UPDATE_VERSION 1418 -- DB_UPDATE_VERSION 1419
-- ------------------------------------------ -- ------------------------------------------
@ -751,6 +751,7 @@ CREATE TABLE IF NOT EXISTS `mail` (
`from-photo` varchar(255) NOT NULL DEFAULT '' COMMENT 'contact photo link of the sender', `from-photo` varchar(255) NOT NULL DEFAULT '' COMMENT 'contact photo link of the sender',
`from-url` varchar(255) NOT NULL DEFAULT '' COMMENT 'profile linke of the sender', `from-url` varchar(255) NOT NULL DEFAULT '' COMMENT 'profile linke of the sender',
`contact-id` varchar(255) COMMENT 'contact.id', `contact-id` varchar(255) COMMENT 'contact.id',
`author-id` int unsigned COMMENT 'Link to the contact table with uid=0 of the author of the mail',
`convid` int unsigned COMMENT 'conv.id', `convid` int unsigned COMMENT 'conv.id',
`title` varchar(255) NOT NULL DEFAULT '' COMMENT '', `title` varchar(255) NOT NULL DEFAULT '' COMMENT '',
`body` mediumtext COMMENT '', `body` mediumtext COMMENT '',
@ -759,7 +760,11 @@ CREATE TABLE IF NOT EXISTS `mail` (
`replied` boolean NOT NULL DEFAULT '0' COMMENT '', `replied` boolean NOT NULL DEFAULT '0' COMMENT '',
`unknown` boolean NOT NULL DEFAULT '0' COMMENT 'if sender not in the contact table this is 1', `unknown` boolean NOT NULL DEFAULT '0' COMMENT 'if sender not in the contact table this is 1',
`uri` varchar(255) NOT NULL DEFAULT '' COMMENT '', `uri` varchar(255) NOT NULL DEFAULT '' COMMENT '',
`uri-id` int unsigned COMMENT 'Item-uri id of the related mail',
`parent-uri` varchar(255) NOT NULL DEFAULT '' COMMENT '', `parent-uri` varchar(255) NOT NULL DEFAULT '' COMMENT '',
`parent-uri-id` int unsigned COMMENT 'Item-uri id of the parent of the related mail',
`thr-parent` varchar(255) COMMENT '',
`thr-parent-id` int unsigned COMMENT 'Id of the item-uri table that contains the thread parent uri',
`created` datetime NOT NULL DEFAULT '0001-01-01 00:00:00' COMMENT 'creation time of the private message', `created` datetime NOT NULL DEFAULT '0001-01-01 00:00:00' COMMENT 'creation time of the private message',
PRIMARY KEY(`id`), PRIMARY KEY(`id`),
INDEX `uid_seen` (`uid`,`seen`), INDEX `uid_seen` (`uid`,`seen`),
@ -767,7 +772,15 @@ CREATE TABLE IF NOT EXISTS `mail` (
INDEX `uri` (`uri`(64)), INDEX `uri` (`uri`(64)),
INDEX `parent-uri` (`parent-uri`(64)), INDEX `parent-uri` (`parent-uri`(64)),
INDEX `contactid` (`contact-id`(32)), INDEX `contactid` (`contact-id`(32)),
FOREIGN KEY (`uid`) REFERENCES `user` (`uid`) ON UPDATE RESTRICT ON DELETE CASCADE INDEX `author-id` (`author-id`),
INDEX `uri-id` (`uri-id`),
INDEX `parent-uri-id` (`parent-uri-id`),
INDEX `thr-parent-id` (`thr-parent-id`),
FOREIGN KEY (`uid`) REFERENCES `user` (`uid`) ON UPDATE RESTRICT ON DELETE CASCADE,
FOREIGN KEY (`author-id`) REFERENCES `contact` (`id`) ON UPDATE RESTRICT ON DELETE RESTRICT,
FOREIGN KEY (`uri-id`) REFERENCES `item-uri` (`id`) ON UPDATE RESTRICT ON DELETE CASCADE,
FOREIGN KEY (`parent-uri-id`) REFERENCES `item-uri` (`id`) ON UPDATE RESTRICT ON DELETE CASCADE,
FOREIGN KEY (`thr-parent-id`) REFERENCES `item-uri` (`id`) ON UPDATE RESTRICT ON DELETE CASCADE
) DEFAULT COLLATE utf8mb4_general_ci COMMENT='private messages'; ) DEFAULT COLLATE utf8mb4_general_ci COMMENT='private messages';
-- --

View file

@ -119,17 +119,29 @@ These endpoints use the [Mastodon API entities](https://docs.joinmastodon.org/en
## Currently unimplemented endpoints ## Currently unimplemented endpoints
These emdpoints are planned to be implemented These emdpoints are planned to be implemented somewhere in the future.
- [`PATCH /api/v1/accounts/update_credentials`](https://docs.joinmastodon.org/methods/accounts/) - [`PATCH /api/v1/accounts/update_credentials`](https://docs.joinmastodon.org/methods/accounts/)
- [`GET /api/v1/instance/activity`](https://docs.joinmastodon.org/methods/instance#weekly-activity) - [`GET /api/v1/instance/activity`](https://docs.joinmastodon.org/methods/instance#weekly-activity)
## Dummy endpoints
These endpoints are returning empty data to avoid error messages when using third party clients.
They refer to features that don't exist in Friendica yet.
- [`GET /api/v1/accounts/:id/identity_proofs`](https://docs.joinmastodon.org/methods/accounts/)
- [`GET /api/v1/announcements`](https://docs.joinmastodon.org/methods/announcements/)
- [`GET /api/v1/endorsements`](https://docs.joinmastodon.org/methods/accounts/endorsements/)
- [`GET /api/v1/filters`](https://docs.joinmastodon.org/methods/accounts/filters/)
- [`GET /api/v1/markers`](https://docs.joinmastodon.org/methods/timelines/markers/)
- [`GET /api/v1/scheduled_statuses`](https://docs.joinmastodon.org/methods/statuses/scheduled_statuses/)
## Non supportable endpoints ## Non supportable endpoints
These endpoints won't be implemented, since they refer to functionality that doesn't exist in Friendica These endpoints won't be implemented at the moment.
They refer to features that don't exist in Friendica yet.
- [`POST /api/v1/accounts`](https://docs.joinmastodon.org/methods/accounts/) - [`POST /api/v1/accounts`](https://docs.joinmastodon.org/methods/accounts/)
- [`GET /api/v1/accounts/:id/identity_proofs`](https://docs.joinmastodon.org/methods/accounts/)
- [`POST /api/v1/accounts/:id/pin`](https://docs.joinmastodon.org/methods/accounts/) - [`POST /api/v1/accounts/:id/pin`](https://docs.joinmastodon.org/methods/accounts/)
- [`POST /api/v1/accounts/:id/unpin`](https://docs.joinmastodon.org/methods/accounts/) - [`POST /api/v1/accounts/:id/unpin`](https://docs.joinmastodon.org/methods/accounts/)
- [`GET /api/v1/admin/accounts`](https://docs.joinmastodon.org/methods/admin/) - [`GET /api/v1/admin/accounts`](https://docs.joinmastodon.org/methods/admin/)
@ -138,29 +150,24 @@ These endpoints won't be implemented, since they refer to functionality that doe
- [`GET /api/v1/admin/reports`](https://docs.joinmastodon.org/methods/admin/) - [`GET /api/v1/admin/reports`](https://docs.joinmastodon.org/methods/admin/)
- [`GET /api/v1/admin/reports/:id`](https://docs.joinmastodon.org/methods/admin/) - [`GET /api/v1/admin/reports/:id`](https://docs.joinmastodon.org/methods/admin/)
- [`POST /api/v1/admin/reports/:id/{action}`](https://docs.joinmastodon.org/methods/admin/) - [`POST /api/v1/admin/reports/:id/{action}`](https://docs.joinmastodon.org/methods/admin/)
- [`GET /api/v1/announcements`](https://docs.joinmastodon.org/methods/announcements/)
- [`POST /api/v1/announcements/:id/dismiss`](https://docs.joinmastodon.org/methods/announcements/) - [`POST /api/v1/announcements/:id/dismiss`](https://docs.joinmastodon.org/methods/announcements/)
- [`PUT /api/v1/announcements/:id/reactions/{name}`](https://docs.joinmastodon.org/methods/announcements/) - [`PUT /api/v1/announcements/:id/reactions/{name}`](https://docs.joinmastodon.org/methods/announcements/)
- [`DELETE /api/v1/announcements/:id/reactions/{name}`](https://docs.joinmastodon.org/methods/announcements/) - [`DELETE /api/v1/announcements/:id/reactions/{name}`](https://docs.joinmastodon.org/methods/announcements/)
- [`GET /api/v1/domain_blocks`](https://docs.joinmastodon.org/methods/accounts/domain_blocks/) - [`GET /api/v1/domain_blocks`](https://docs.joinmastodon.org/methods/accounts/domain_blocks/)
- [`POST /api/v1/domain_blocks`](https://docs.joinmastodon.org/methods/accounts/domain_blocks/) - [`POST /api/v1/domain_blocks`](https://docs.joinmastodon.org/methods/accounts/domain_blocks/)
- [`DELETE /api/v1/domain_blocks`](https://docs.joinmastodon.org/methods/accounts/domain_blocks/) - [`DELETE /api/v1/domain_blocks`](https://docs.joinmastodon.org/methods/accounts/domain_blocks/)
- [`GET /api/v1/endorsements`](https://docs.joinmastodon.org/methods/accounts/endorsements/)
- [`GET /api/v1/featured_tags`](https://docs.joinmastodon.org/methods/accounts/featured_tags/) - [`GET /api/v1/featured_tags`](https://docs.joinmastodon.org/methods/accounts/featured_tags/)
- [`POST /api/v1/featured_tags`](https://docs.joinmastodon.org/methods/accounts/featured_tags/) - [`POST /api/v1/featured_tags`](https://docs.joinmastodon.org/methods/accounts/featured_tags/)
- [`DELETE /api/v1/featured_tags/:id`](https://docs.joinmastodon.org/methods/accounts/featured_tags/) - [`DELETE /api/v1/featured_tags/:id`](https://docs.joinmastodon.org/methods/accounts/featured_tags/)
- [`GET /api/v1/featured_tags/suggestions`](https://docs.joinmastodon.org/methods/accounts/featured_tags/) - [`GET /api/v1/featured_tags/suggestions`](https://docs.joinmastodon.org/methods/accounts/featured_tags/)
- [`GET /api/v1/filters`](https://docs.joinmastodon.org/methods/accounts/filters/)
- [`GET /api/v1/filters/:id`](https://docs.joinmastodon.org/methods/accounts/filters/) - [`GET /api/v1/filters/:id`](https://docs.joinmastodon.org/methods/accounts/filters/)
- [`POST /api/v1/filters/:id`](https://docs.joinmastodon.org/methods/accounts/filters/) - [`POST /api/v1/filters/:id`](https://docs.joinmastodon.org/methods/accounts/filters/)
- [`PUT /api/v1/filters/:id`](https://docs.joinmastodon.org/methods/accounts/filters/) - [`PUT /api/v1/filters/:id`](https://docs.joinmastodon.org/methods/accounts/filters/)
- [`DELETE /api/v1/filters/:id`](https://docs.joinmastodon.org/methods/accounts/filters/) - [`DELETE /api/v1/filters/:id`](https://docs.joinmastodon.org/methods/accounts/filters/)
- [`GET /api/v1/markers`](https://docs.joinmastodon.org/methods/timelines/markers/)
- [`POST /api/v1/markers`](https://docs.joinmastodon.org/methods/timelines/markers/) - [`POST /api/v1/markers`](https://docs.joinmastodon.org/methods/timelines/markers/)
- [`GET /api/v1/polls/:id`](https://docs.joinmastodon.org/methods/statuses/polls/) - [`GET /api/v1/polls/:id`](https://docs.joinmastodon.org/methods/statuses/polls/)
- [`POST /api/v1/polls/:id/votes`](https://docs.joinmastodon.org/methods/statuses/polls/) - [`POST /api/v1/polls/:id/votes`](https://docs.joinmastodon.org/methods/statuses/polls/)
- [`POST /api/v1/reports`](https://docs.joinmastodon.org/methods/accounts/reports/) - [`POST /api/v1/reports`](https://docs.joinmastodon.org/methods/accounts/reports/)
- [`GET /api/v1/scheduled_statuses`](https://docs.joinmastodon.org/methods/statuses/scheduled_statuses/)
- [`GET /api/v1/scheduled_statuses/:id`](https://docs.joinmastodon.org/methods/statuses/scheduled_statuses/) - [`GET /api/v1/scheduled_statuses/:id`](https://docs.joinmastodon.org/methods/statuses/scheduled_statuses/)
- [`PUT /api/v1/scheduled_statuses/:id`](https://docs.joinmastodon.org/methods/statuses/scheduled_statuses/) - [`PUT /api/v1/scheduled_statuses/:id`](https://docs.joinmastodon.org/methods/statuses/scheduled_statuses/)
- [`DELETE /api/v1/scheduled_statuses/:id`](https://docs.joinmastodon.org/methods/statuses/scheduled_statuses/) - [`DELETE /api/v1/scheduled_statuses/:id`](https://docs.joinmastodon.org/methods/statuses/scheduled_statuses/)

View file

@ -50,7 +50,7 @@ use Friendica\Util\XML;
class BBCode class BBCode
{ {
// Update this value to the current date whenever changes are made to BBCode::convert // Update this value to the current date whenever changes are made to BBCode::convert
const VERSION = '2021-05-01'; const VERSION = '2021-05-21';
const INTERNAL = 0; const INTERNAL = 0;
const EXTERNAL = 1; const EXTERNAL = 1;
@ -1039,7 +1039,9 @@ class BBCode
switch ($simplehtml) { switch ($simplehtml) {
case self::API: case self::API:
$text = ($is_quote_share? '<br>' : '') . '<p>' . html_entity_decode('&#x2672; ', ENT_QUOTES, 'UTF-8') . ' ' . $author_contact['addr'] . ': </p>' . "\n" . $content; $text = ($is_quote_share? '<br>' : '') .
'<p><b><a href="' . $attributes['link'] . '">' . html_entity_decode('&#x2672; ', ENT_QUOTES, 'UTF-8') . ' ' . $author_contact['addr'] . "</a>:</b> </p>\n" .
'<blockquote class="shared_content">' . $content . '</blockquote>';
break; break;
case self::DIASPORA: case self::DIASPORA:
if (stripos(Strings::normaliseLink($attributes['link']), 'http://twitter.com/') === 0) { if (stripos(Strings::normaliseLink($attributes['link']), 'http://twitter.com/') === 0) {
@ -1721,7 +1723,7 @@ class BBCode
$text); $text);
} elseif (!$simple_html) { } elseif (!$simple_html) {
$text = preg_replace("/([@!])\[url\=(.*?)\](.*?)\[\/url\]/ism", $text = preg_replace("/([@!])\[url\=(.*?)\](.*?)\[\/url\]/ism",
'$1<a href="$2" class="userinfo mention" title="$3"><bdi>$3</bdi></a>', '<bdi>$1<a href="$2" class="userinfo mention" title="$3">$3</a></bdi>',
$text); $text);
} }

View file

@ -136,7 +136,9 @@ class Status extends BaseFactory
$account = DI::mstdnAccount()->createFromContactId($item['author-id']); $account = DI::mstdnAccount()->createFromContactId($item['author-id']);
$counts = new \Friendica\Object\Api\Mastodon\Status\Counts(0, 0, 0); $replies = DBA::count('mail', ['thr-parent-id' => $item['uri-id'], 'reply' => true]);
$counts = new \Friendica\Object\Api\Mastodon\Status\Counts($replies, 0, 0);
$userAttributes = new \Friendica\Object\Api\Mastodon\Status\UserAttributes(false, false, false, false, false); $userAttributes = new \Friendica\Object\Api\Mastodon\Status\UserAttributes(false, false, false, false, false);

View file

@ -1941,6 +1941,11 @@ class Contact
return false; return false;
} }
if (Contact::isLocal($ret['url'])) {
Logger::info('Local contacts are not updated here.');
return true;
}
if (!empty($ret['account-type']) && $ret['account-type'] == User::ACCOUNT_TYPE_DELETED) { if (!empty($ret['account-type']) && $ret['account-type'] == User::ACCOUNT_TYPE_DELETED) {
Logger::info('Deleted account', ['id' => $id, 'url' => $ret['url'], 'ret' => $ret]); Logger::info('Deleted account', ['id' => $id, 'url' => $ret['url'], 'ret' => $ret]);
self::remove($id); self::remove($id);

View file

@ -71,6 +71,20 @@ class Mail
return false; return false;
} }
$msg['author-id'] = Contact::getIdForURL($msg['from-url'], 0, false);
$msg['uri-id'] = ItemURI::insert(['uri' => $msg['uri'], 'guid' => $msg['guid']]);
$msg['parent-uri-id'] = ItemURI::getIdByURI($msg['parent-uri']);
if ($msg['reply']) {
$reply = DBA::selectFirst('mail', ['uri', 'uri-id'], ['parent-uri' => $mail['parent-uri'], 'reply' => false]);
$msg['thr-parent'] = $reply['uri'];
$msg['thr-parent-id'] = $reply['uri-id'];
} else {
$msg['thr-parent'] = $msg['uri'];
$msg['thr-parent-id'] = $msg['uri-id'];
}
DBA::insert('mail', $msg); DBA::insert('mail', $msg);
$msg['id'] = DBA::lastInsertId(); $msg['id'] = DBA::lastInsertId();

View file

@ -145,7 +145,7 @@ class Profile
*/ */
public static function load(App $a, $nickname, array $profiledata = [], $show_connect = true) public static function load(App $a, $nickname, array $profiledata = [], $show_connect = true)
{ {
$user = DBA::selectFirst('user', ['uid'], ['nickname' => $nickname, 'account_removed' => false]); $user = User::getByNickname($nickname);
if (!DBA::isResult($user) && empty($profiledata)) { if (!DBA::isResult($user) && empty($profiledata)) {
Logger::log('profile error: ' . DI::args()->getQueryString(), Logger::DEBUG); Logger::log('profile error: ' . DI::args()->getQueryString(), Logger::DEBUG);

View file

@ -425,8 +425,8 @@ class Tag
$item['body'] = str_replace($orig_tag, $tag['url'], $item['body']); $item['body'] = str_replace($orig_tag, $tag['url'], $item['body']);
} }
$return['hashtags'][] = $prefix . '<a href="' . $tag['url'] . '" target="_blank" rel="noopener noreferrer">' . htmlspecialchars($tag['name']) . '</a>'; $return['hashtags'][] = '<bdi>' . $prefix . '<a href="' . $tag['url'] . '" target="_blank" rel="noopener noreferrer">' . htmlspecialchars($tag['name']) . '</a></bdi>';
$return['tags'][] = $prefix . '<a href="' . $tag['url'] . '" target="_blank" rel="noopener noreferrer">' . htmlspecialchars($tag['name']) . '</a>'; $return['tags'][] = '<bdi>' . $prefix . '<a href="' . $tag['url'] . '" target="_blank" rel="noopener noreferrer">' . htmlspecialchars($tag['name']) . '</a></bdi>';
break; break;
case self::MENTION: case self::MENTION:
case self::EXCLUSIVE_MENTION: case self::EXCLUSIVE_MENTION:
@ -435,8 +435,8 @@ class Tag
} else { } else {
$tag['url'] = Contact::magicLink($tag['url']); $tag['url'] = Contact::magicLink($tag['url']);
} }
$return['mentions'][] = $prefix . '<a href="' . $tag['url'] . '" target="_blank" rel="noopener noreferrer">' . htmlspecialchars($tag['name']) . '</a>'; $return['mentions'][] = '<bdi>' . $prefix . '<a href="' . $tag['url'] . '" target="_blank" rel="noopener noreferrer">' . htmlspecialchars($tag['name']) . '</a></bdi>';
$return['tags'][] = $prefix . '<a href="' . $tag['url'] . '" target="_blank" rel="noopener noreferrer">' . htmlspecialchars($tag['name']) . '</a>'; $return['tags'][] = '<bdi>' . $prefix . '<a href="' . $tag['url'] . '" target="_blank" rel="noopener noreferrer">' . htmlspecialchars($tag['name']) . '</a></bdi>';
break; break;
case self::IMPLICIT_MENTION: case self::IMPLICIT_MENTION:
$return['implicit_mentions'][] = $prefix . $tag['name']; $return['implicit_mentions'][] = $prefix . $tag['name'];

View file

@ -515,7 +515,27 @@ class User
*/ */
public static function getIdFromPasswordAuthentication($user_info, $password, $third_party = false) public static function getIdFromPasswordAuthentication($user_info, $password, $third_party = false)
{ {
// Addons registered with the "authenticate" hook may create the user on the
// fly. `getAuthenticationInfo` will fail if the user doesn't exist yet. If
// the user doesn't exist, we should give the addons a chance to create the
// user in our database, if applicable, before re-throwing the exception if
// they fail.
try {
$user = self::getAuthenticationInfo($user_info); $user = self::getAuthenticationInfo($user_info);
} catch (Exception $e) {
$username = (is_string($user_info) ? $user_info : $user_info['nickname'] ?? '');
// Addons can create users, and since this 'catch' branch should only
// execute if getAuthenticationInfo can't find an existing user, that's
// exactly what will happen here. Creating a numeric username would create
// abiguity with user IDs, possibly opening up an attack vector.
// So let's be very careful about that.
if (empty($username) || is_numeric($username)) {
throw $e;
}
return self::getIdFromAuthenticateHooks($username, $password);
}
if ($third_party && DI::pConfig()->get($user['uid'], '2fa', 'verified')) { if ($third_party && DI::pConfig()->get($user['uid'], '2fa', 'verified')) {
// Third-party apps can't verify two-factor authentication, we use app-specific passwords instead // Third-party apps can't verify two-factor authentication, we use app-specific passwords instead
@ -545,8 +565,26 @@ class User
return $user['uid']; return $user['uid'];
} else { } else {
return self::getIdFromAuthenticateHooks($user['nickname'], $password); // throws
}
throw new HTTPException\ForbiddenException(DI::l10n()->t('Login failed'));
}
/**
* Try to obtain a user ID via "authenticate" hook addons
*
* Returns the user id associated with a successful password authentication
*
* @param string $username
* @param string $password
* @return int User Id if authentication is successful
* @throws HTTPException\ForbiddenException
*/
public static function getIdFromAuthenticateHooks($username, $password)
{
$addon_auth = [ $addon_auth = [
'username' => $user['nickname'], 'username' => $username,
'password' => $password, 'password' => $password,
'authenticated' => 0, 'authenticated' => 0,
'user_record' => null 'user_record' => null
@ -560,8 +598,7 @@ class User
Hook::callAll('authenticate', $addon_auth); Hook::callAll('authenticate', $addon_auth);
if ($addon_auth['authenticated'] && $addon_auth['user_record']) { if ($addon_auth['authenticated'] && $addon_auth['user_record']) {
return $user['uid']; return $addon_auth['user_record']['uid'];
}
} }
throw new HTTPException\ForbiddenException(DI::l10n()->t('Login failed')); throw new HTTPException\ForbiddenException(DI::l10n()->t('Login failed'));

View file

@ -29,7 +29,7 @@ use Friendica\Module\BaseApi;
/** /**
* @see https://docs.joinmastodon.org/methods/timelines/conversations/ * @see https://docs.joinmastodon.org/methods/timelines/conversations/
*/ */
class Conversation extends BaseApi class Conversations extends BaseApi
{ {
public static function delete(array $parameters = []) public static function delete(array $parameters = [])
{ {

View file

@ -19,7 +19,7 @@
* *
*/ */
namespace Friendica\Module\Api\Mastodon\Conversation; namespace Friendica\Module\Api\Mastodon\Conversations;
use Friendica\Core\System; use Friendica\Core\System;
use Friendica\Database\DBA; use Friendica\Database\DBA;

View file

@ -48,22 +48,22 @@ class Direct extends BaseApi
'limit' => 20, // Maximum number of results to return. Defaults to 20. 'limit' => 20, // Maximum number of results to return. Defaults to 20.
]); ]);
$params = ['order' => ['id' => true], 'limit' => $request['limit']]; $params = ['order' => ['uri-id' => true], 'limit' => $request['limit']];
$condition = ['uid' => $uid]; $condition = ['uid' => $uid];
if (!empty($request['max_id'])) { if (!empty($request['max_id'])) {
$condition = DBA::mergeConditions($condition, ["`id` < ?", $request['max_id']]); $condition = DBA::mergeConditions($condition, ["`uri-id` < ?", $request['max_id']]);
} }
if (!empty($request['since_id'])) { if (!empty($request['since_id'])) {
$condition = DBA::mergeConditions($condition, ["`id` > ?", $request['since_id']]); $condition = DBA::mergeConditions($condition, ["`uri-id` > ?", $request['since_id']]);
} }
if (!empty($request['min_id'])) { if (!empty($request['min_id'])) {
$condition = DBA::mergeConditions($condition, ["`id` > ?", $request['min_id']]); $condition = DBA::mergeConditions($condition, ["`uri-id` > ?", $request['min_id']]);
$params['order'] = ['id']; $params['order'] = ['uri-id'];
} }
$mails = DBA::select('mail', ['id'], $condition, $params); $mails = DBA::select('mail', ['id'], $condition, $params);

View file

@ -50,20 +50,20 @@ class NoScrape extends BaseModule
System::jsonError(403, 'Authentication required'); System::jsonError(403, 'Authentication required');
} }
Profile::load($a, $which); $profile = Profile::getByNickname($which, local_user());
if (empty($a->profile['uid'])) { if (empty($profile['uid'])) {
System::jsonError(404, 'Profile not found'); System::jsonError(404, 'Profile not found');
} }
$json_info = [ $json_info = [
'addr' => $a->profile['addr'], 'addr' => $profile['addr'],
'nick' => $which, 'nick' => $which,
'guid' => $a->profile['guid'], 'guid' => $profile['guid'],
'key' => $a->profile['upubkey'], 'key' => $profile['upubkey'],
'homepage' => DI::baseUrl() . "/profile/{$which}", 'homepage' => DI::baseUrl() . "/profile/{$which}",
'comm' => ($a->profile['account-type'] == User::ACCOUNT_TYPE_COMMUNITY), 'comm' => ($profile['account-type'] == User::ACCOUNT_TYPE_COMMUNITY),
'account-type' => $a->profile['account-type'], 'account-type' => $profile['account-type'],
]; ];
$dfrn_pages = ['request', 'confirm', 'notify', 'poll']; $dfrn_pages = ['request', 'confirm', 'notify', 'poll'];
@ -71,30 +71,30 @@ class NoScrape extends BaseModule
$json_info["dfrn-{$dfrn}"] = DI::baseUrl() . "/dfrn_{$dfrn}/{$which}"; $json_info["dfrn-{$dfrn}"] = DI::baseUrl() . "/dfrn_{$dfrn}/{$which}";
} }
if (!$a->profile['net-publish']) { if (!$profile['net-publish']) {
$json_info['hide'] = true; $json_info['hide'] = true;
System::jsonExit($json_info); System::jsonExit($json_info);
} }
$keywords = $a->profile['pub_keywords'] ?? ''; $keywords = $profile['pub_keywords'] ?? '';
$keywords = str_replace(['#', ',', ' ', ',,'], ['', ' ', ',', ','], $keywords); $keywords = str_replace(['#', ',', ' ', ',,'], ['', ' ', ',', ','], $keywords);
$keywords = explode(',', $keywords); $keywords = explode(',', $keywords);
$contactPhoto = DBA::selectFirst('contact', ['photo'], ['self' => true, 'uid' => $a->profile['uid']]); $contactPhoto = DBA::selectFirst('contact', ['photo'], ['self' => true, 'uid' => $profile['uid']]);
$json_info['fn'] = $a->profile['name']; $json_info['fn'] = $profile['name'];
$json_info['photo'] = $contactPhoto["photo"]; $json_info['photo'] = $contactPhoto["photo"];
$json_info['tags'] = $keywords; $json_info['tags'] = $keywords;
$json_info['language'] = $a->profile['language']; $json_info['language'] = $profile['language'];
if (!empty($a->profile['last-item'])) { if (!empty($profile['last-item'])) {
$json_info['updated'] = date("c", strtotime($a->profile['last-item'])); $json_info['updated'] = date("c", strtotime($profile['last-item']));
} }
if (!($a->profile['hide-friends'] ?? false)) { if (!($profile['hide-friends'] ?? false)) {
$json_info['contacts'] = DBA::count('contact', $json_info['contacts'] = DBA::count('contact',
[ [
'uid' => $a->profile['uid'], 'uid' => $profile['uid'],
'self' => 0, 'self' => 0,
'blocked' => 0, 'blocked' => 0,
'pending' => 0, 'pending' => 0,
@ -106,13 +106,13 @@ class NoScrape extends BaseModule
// We display the last activity (post or login), reduced to year and week number // We display the last activity (post or login), reduced to year and week number
$last_active = 0; $last_active = 0;
$condition = ['uid' => $a->profile['uid'], 'self' => true]; $condition = ['uid' => $profile['uid'], 'self' => true];
$contact = DBA::selectFirst('contact', ['last-item'], $condition); $contact = DBA::selectFirst('contact', ['last-item'], $condition);
if (DBA::isResult($contact)) { if (DBA::isResult($contact)) {
$last_active = strtotime($contact['last-item']); $last_active = strtotime($contact['last-item']);
} }
$condition = ['uid' => $a->profile['uid']]; $condition = ['uid' => $profile['uid']];
$user = DBA::selectFirst('user', ['login_date'], $condition); $user = DBA::selectFirst('user', ['login_date'], $condition);
if (DBA::isResult($user)) { if (DBA::isResult($user)) {
if ($last_active < strtotime($user['login_date'])) { if ($last_active < strtotime($user['login_date'])) {
@ -124,8 +124,8 @@ class NoScrape extends BaseModule
//These are optional fields. //These are optional fields.
$profile_fields = ['about', 'locality', 'region', 'postal-code', 'country-name']; $profile_fields = ['about', 'locality', 'region', 'postal-code', 'country-name'];
foreach ($profile_fields as $field) { foreach ($profile_fields as $field) {
if (!empty($a->profile[$field])) { if (!empty($profile[$field])) {
$json_info["$field"] = $a->profile[$field]; $json_info["$field"] = $profile[$field];
} }
} }

View file

@ -63,9 +63,9 @@ class Authorize extends BaseApi
// @todo Compare the application scope and requested scope // @todo Compare the application scope and requested scope
$request = $_REQUEST; $redirect_request = $_REQUEST;
unset($request['pagename']); unset($redirect_request['pagename']);
$redirect = 'oauth/authorize?' . http_build_query($request); $redirect = 'oauth/authorize?' . http_build_query($redirect_request);
$uid = local_user(); $uid = local_user();
if (empty($uid)) { if (empty($uid)) {

View file

@ -868,24 +868,19 @@ class Transmitter
return []; return [];
} }
$mail['uri-id'] = ItemURI::insert(['uri' => $mail['uri'], 'guid' => $mail['guid']]); $reply = DBA::selectFirst('mail', ['uri', 'uri-id', 'from-url'], ['parent-uri' => $mail['parent-uri'], 'reply' => false]);
$reply = DBA::selectFirst('mail', ['uri', 'from-url', 'guid'], ['parent-uri' => $mail['parent-uri'], 'reply' => false]);
// Making the post more compatible for Mastodon by: // Making the post more compatible for Mastodon by:
// - Making it a note and not an article (no title) // - Making it a note and not an article (no title)
// - Moving the title into the "summary" field that is used as a "content warning" // - Moving the title into the "summary" field that is used as a "content warning"
if ($use_title) { if (!$use_title) {
$mail['body'] = $mail['body'];
$mail['title'] = $mail['title'];
} else {
$mail['body'] = '[abstract]' . $mail['title'] . "[/abstract]\n" . $mail['body']; $mail['body'] = '[abstract]' . $mail['title'] . "[/abstract]\n" . $mail['body'];
$mail['title'] = ''; $mail['title'] = '';
} }
$mail['author-link'] = $mail['owner-link'] = $mail['from-url']; $mail['author-link'] = $mail['owner-link'] = $mail['from-url'];
$mail['author-id'] = Contact::getIdForURL($mail['author-link'], 0, false); $mail['owner-id'] = $mail['author-id'];
$mail['allow_cid'] = '<'.$mail['contact-id'].'>'; $mail['allow_cid'] = '<'.$mail['contact-id'].'>';
$mail['allow_gid'] = ''; $mail['allow_gid'] = '';
$mail['deny_cid'] = ''; $mail['deny_cid'] = '';
@ -893,9 +888,9 @@ class Transmitter
$mail['private'] = Item::PRIVATE; $mail['private'] = Item::PRIVATE;
$mail['deleted'] = false; $mail['deleted'] = false;
$mail['edited'] = $mail['created']; $mail['edited'] = $mail['created'];
$mail['plink'] = $mail['uri']; $mail['plink'] = DI::baseUrl() . '/message/' . $mail['id'];
$mail['thr-parent'] = $reply['uri']; $mail['parent-uri'] = $reply['uri'];
$mail['thr-parent-id'] = ItemURI::insert(['uri' => $reply['uri'], 'guid' => $reply['guid']]); $mail['parent-uri-id'] = $reply['uri-id'];
$mail['parent-author-id'] = Contact::getIdForURL($reply['from-url'], 0, false); $mail['parent-author-id'] = Contact::getIdForURL($reply['from-url'], 0, false);
$mail['gravity'] = ($mail['reply'] ? GRAVITY_COMMENT: GRAVITY_PARENT); $mail['gravity'] = ($mail['reply'] ? GRAVITY_COMMENT: GRAVITY_PARENT);
$mail['event-type'] = ''; $mail['event-type'] = '';
@ -1530,12 +1525,21 @@ class Transmitter
if ($type == 'Note') { if ($type == 'Note') {
$body = $item['raw-body'] ?? self::removePictures($body); $body = $item['raw-body'] ?? self::removePictures($body);
} elseif (($type == 'Article') && empty($data['summary'])) {
$regexp = "/[@!]\[url\=([^\[\]]*)\].*?\[\/url\]/ism";
$summary = preg_replace_callback($regexp, ['self', 'mentionAddrCallback'], $body);
$data['summary'] = BBCode::toPlaintext(Plaintext::shorten(self::removePictures($summary), 1000));
} }
/**
* @todo Improve the automated summary
* This part is currently deactivated. The automated summary seems to be more
* confusing than helping. But possibly we will find a better way.
* So the code is left here for now as a reminder
*
* } elseif (($type == 'Article') && empty($data['summary'])) {
* $regexp = "/[@!]\[url\=([^\[\]]*)\].*?\[\/url\]/ism";
* $summary = preg_replace_callback($regexp, ['self', 'mentionAddrCallback'], $body);
* $data['summary'] = BBCode::toPlaintext(Plaintext::shorten(self::removePictures($summary), 1000));
* }
*/
if (empty($item['uid']) || !Feature::isEnabled($item['uid'], 'explicit_mentions')) { if (empty($item['uid']) || !Feature::isEnabled($item['uid'], 'explicit_mentions')) {
$body = self::prependMentions($body, $item['uri-id'], $item['author-link']); $body = self::prependMentions($body, $item['uri-id'], $item['author-link']);
} }

View file

@ -558,8 +558,10 @@ class HTTPSignature
if (!empty($key['url']) && !empty($key['type']) && ($key['type'] == 'Tombstone')) { if (!empty($key['url']) && !empty($key['type']) && ($key['type'] == 'Tombstone')) {
Logger::info('Actor is a tombstone', ['key' => $key]); Logger::info('Actor is a tombstone', ['key' => $key]);
if (!Contact::isLocal($key['url'])) {
// We now delete everything that we possibly knew from this actor // We now delete everything that we possibly knew from this actor
Contact::deleteContactByUrl($key['url']); Contact::deleteContactByUrl($key['url']);
}
return null; return null;
} }

View file

@ -181,7 +181,10 @@ class ExpirePosts
AND NOT EXISTS(SELECT `uri-id` FROM `post-user` WHERE `uri-id` = `item-uri`.`id`) AND NOT EXISTS(SELECT `uri-id` FROM `post-user` WHERE `uri-id` = `item-uri`.`id`)
AND NOT EXISTS(SELECT `parent-uri-id` FROM `post-user` WHERE `parent-uri-id` = `item-uri`.`id`) AND NOT EXISTS(SELECT `parent-uri-id` FROM `post-user` WHERE `parent-uri-id` = `item-uri`.`id`)
AND NOT EXISTS(SELECT `thr-parent-id` FROM `post-user` WHERE `thr-parent-id` = `item-uri`.`id`) AND NOT EXISTS(SELECT `thr-parent-id` FROM `post-user` WHERE `thr-parent-id` = `item-uri`.`id`)
AND NOT EXISTS(SELECT `external-id` FROM `post-user` WHERE `external-id` = `item-uri`.`id`)", $item['uri-id']]); AND NOT EXISTS(SELECT `external-id` FROM `post-user` WHERE `external-id` = `item-uri`.`id`)
AND NOT EXISTS(SELECT `uri-id` FROM `mail` WHERE `uri-id` = `item-uri`.`id`)
AND NOT EXISTS(SELECT `parent-uri-id` FROM `mail` WHERE `parent-uri-id` = `item-uri`.`id`)
AND NOT EXISTS(SELECT `thr-parent-id` FROM `mail` WHERE `thr-parent-id` = `item-uri`.`id`)", $item['uri-id']]);
Logger::notice('Start deleting orphaned URI-ID', ['last-id' => $item['uri-id']]); Logger::notice('Start deleting orphaned URI-ID', ['last-id' => $item['uri-id']]);
$affected_count = 0; $affected_count = 0;

View file

@ -55,6 +55,7 @@ class RemoveContact {
} }
DBA::delete('mail', ['contact-id' => $id]); DBA::delete('mail', ['contact-id' => $id]);
DBA::delete('mail', ['author-id' => $id]);
Post\ThreadUser::delete(['author-id' => $id]); Post\ThreadUser::delete(['author-id' => $id]);
Post\ThreadUser::delete(['owner-id' => $id]); Post\ThreadUser::delete(['owner-id' => $id]);

View file

@ -55,7 +55,7 @@
use Friendica\Database\DBA; use Friendica\Database\DBA;
if (!defined('DB_UPDATE_VERSION')) { if (!defined('DB_UPDATE_VERSION')) {
define('DB_UPDATE_VERSION', 1418); define('DB_UPDATE_VERSION', 1419);
} }
return [ return [
@ -818,6 +818,7 @@ return [
"from-photo" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "contact photo link of the sender"], "from-photo" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "contact photo link of the sender"],
"from-url" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "profile linke of the sender"], "from-url" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "profile linke of the sender"],
"contact-id" => ["type" => "varchar(255)", "relation" => ["contact" => "id"], "comment" => "contact.id"], "contact-id" => ["type" => "varchar(255)", "relation" => ["contact" => "id"], "comment" => "contact.id"],
"author-id" => ["type" => "int unsigned", "foreign" => ["contact" => "id", "on delete" => "restrict"], "comment" => "Link to the contact table with uid=0 of the author of the mail"],
"convid" => ["type" => "int unsigned", "relation" => ["conv" => "id"], "comment" => "conv.id"], "convid" => ["type" => "int unsigned", "relation" => ["conv" => "id"], "comment" => "conv.id"],
"title" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""], "title" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
"body" => ["type" => "mediumtext", "comment" => ""], "body" => ["type" => "mediumtext", "comment" => ""],
@ -826,7 +827,11 @@ return [
"replied" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""], "replied" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""],
"unknown" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "if sender not in the contact table this is 1"], "unknown" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "if sender not in the contact table this is 1"],
"uri" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""], "uri" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
"uri-id" => ["type" => "int unsigned", "foreign" => ["item-uri" => "id"], "comment" => "Item-uri id of the related mail"],
"parent-uri" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""], "parent-uri" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
"parent-uri-id" => ["type" => "int unsigned", "foreign" => ["item-uri" => "id"], "comment" => "Item-uri id of the parent of the related mail"],
"thr-parent" => ["type" => "varchar(255)", "comment" => ""],
"thr-parent-id" => ["type" => "int unsigned", "foreign" => ["item-uri" => "id"], "comment" => "Id of the item-uri table that contains the thread parent uri"],
"created" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "creation time of the private message"], "created" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "creation time of the private message"],
], ],
"indexes" => [ "indexes" => [
@ -836,6 +841,10 @@ return [
"uri" => ["uri(64)"], "uri" => ["uri(64)"],
"parent-uri" => ["parent-uri(64)"], "parent-uri" => ["parent-uri(64)"],
"contactid" => ["contact-id(32)"], "contactid" => ["contact-id(32)"],
"author-id" => ["author-id"],
"uri-id" => ["uri-id"],
"parent-uri-id" => ["parent-uri-id"],
"thr-parent-id" => ["thr-parent-id"],
] ]
], ],
"mailacct" => [ "mailacct" => [

View file

@ -90,9 +90,9 @@ return [
'/apps/verify_credentials' => [Module\Api\Mastodon\Apps\VerifyCredentials::class, [R::GET ]], '/apps/verify_credentials' => [Module\Api\Mastodon\Apps\VerifyCredentials::class, [R::GET ]],
'/blocks' => [Module\Api\Mastodon\Blocks::class, [R::GET ]], '/blocks' => [Module\Api\Mastodon\Blocks::class, [R::GET ]],
'/bookmarks' => [Module\Api\Mastodon\Bookmarks::class, [R::GET ]], '/bookmarks' => [Module\Api\Mastodon\Bookmarks::class, [R::GET ]],
'/conversations' => [Module\Api\Mastodon\Conversation::class, [R::GET ]], '/conversations' => [Module\Api\Mastodon\Conversations::class, [R::GET ]],
'/conversations/{id:\d+}' => [Module\Api\Mastodon\Conversation::class, [R::DELETE ]], '/conversations/{id:\d+}' => [Module\Api\Mastodon\Conversations::class, [R::DELETE ]],
'/conversations/{id:\d+}/read' => [Module\Api\Mastodon\Conversation\Read::class, [R::POST ]], '/conversations/{id:\d+}/read' => [Module\Api\Mastodon\Conversations\Read::class, [R::POST ]],
'/custom_emojis' => [Module\Api\Mastodon\CustomEmojis::class, [R::GET ]], '/custom_emojis' => [Module\Api\Mastodon\CustomEmojis::class, [R::GET ]],
'/domain_blocks' => [Module\Api\Mastodon\Unimplemented::class, [R::GET, R::POST, R::DELETE]], // not supported '/domain_blocks' => [Module\Api\Mastodon\Unimplemented::class, [R::GET, R::POST, R::DELETE]], // not supported
'/directory' => [Module\Api\Mastodon\Directory::class, [R::GET ]], '/directory' => [Module\Api\Mastodon\Directory::class, [R::GET ]],

View file

@ -49,6 +49,7 @@ use Friendica\Database\DBStructure;
use Friendica\DI; use Friendica\DI;
use Friendica\Model\Contact; use Friendica\Model\Contact;
use Friendica\Model\Item; use Friendica\Model\Item;
use Friendica\Model\ItemURI;
use Friendica\Model\Notification; use Friendica\Model\Notification;
use Friendica\Model\Photo; use Friendica\Model\Photo;
use Friendica\Model\Post; use Friendica\Model\Post;
@ -912,3 +913,31 @@ function update_1413()
return Update::FAILED; return Update::FAILED;
} }
} }
function update_1419()
{
$mails = DBA::select('mail', ['id', 'from-url', 'uri', 'parent-uri', 'guid'], [], ['order' => ['id']]);
while ($mail = DBA::fetch($mails)) {
$fields = [];
$fields['author-id'] = Contact::getIdForURL($mail['from-url'], 0, false);
if (empty($fields['author-id'])) {
continue;
}
$fields['uri-id'] = ItemURI::insert(['uri' => $mail['uri'], 'guid' => $mail['guid']]);
$fields['parent-uri-id'] = ItemURI::getIdByURI($mail['parent-uri']);
$reply = DBA::selectFirst('mail', ['uri', 'uri-id', 'guid'], ['parent-uri' => $mail['parent-uri'], 'reply' => false]);
if (!empty($reply)) {
$fields['thr-parent'] = $reply['uri'];
if (!empty($reply['uri-id'])) {
$fields['thr-parent-id'] = $reply['uri-id'];
} else {
$fields['thr-parent-id'] = ItemURI::insert(['uri' => $reply['uri'], 'guid' => $reply['guid']]);
}
}
DBA::update('mail', $fields, ['id' => $mail['id']]);
}
return Update::SUCCESS;
}

View file

@ -6,9 +6,9 @@
#, fuzzy #, fuzzy
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: 2021.06-dev\n" "Project-Id-Version: 2021.06-rc\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-05-16 07:41+0000\n" "POT-Creation-Date: 2021-05-21 18:18+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
@ -39,8 +39,8 @@ msgstr ""
#: include/api.php:4528 mod/photos.php:107 mod/photos.php:211 #: include/api.php:4528 mod/photos.php:107 mod/photos.php:211
#: mod/photos.php:639 mod/photos.php:1043 mod/photos.php:1060 #: mod/photos.php:639 mod/photos.php:1043 mod/photos.php:1060
#: mod/photos.php:1609 src/Model/User.php:1045 src/Model/User.php:1053 #: mod/photos.php:1609 src/Model/User.php:1100 src/Model/User.php:1108
#: src/Model/User.php:1061 src/Module/Settings/Profile/Photo/Crop.php:97 #: src/Model/User.php:1116 src/Module/Settings/Profile/Photo/Crop.php:97
#: src/Module/Settings/Profile/Photo/Crop.php:113 #: src/Module/Settings/Profile/Photo/Crop.php:113
#: src/Module/Settings/Profile/Photo/Crop.php:129 #: src/Module/Settings/Profile/Photo/Crop.php:129
#: src/Module/Settings/Profile/Photo/Crop.php:178 #: src/Module/Settings/Profile/Photo/Crop.php:178
@ -54,7 +54,7 @@ msgstr ""
msgid "%1$s poked %2$s" msgid "%1$s poked %2$s"
msgstr "" msgstr ""
#: include/conversation.php:227 src/Model/Item.php:2523 #: include/conversation.php:227 src/Model/Item.php:2534
msgid "event" msgid "event"
msgstr "" msgstr ""
@ -62,7 +62,7 @@ msgstr ""
msgid "status" msgid "status"
msgstr "" msgstr ""
#: include/conversation.php:235 mod/tagger.php:90 src/Model/Item.php:2525 #: include/conversation.php:235 mod/tagger.php:90 src/Model/Item.php:2536
msgid "photo" msgid "photo"
msgstr "" msgstr ""
@ -951,7 +951,7 @@ msgstr ""
msgid "list" msgid "list"
msgstr "" msgstr ""
#: mod/cal.php:297 src/Console/User.php:182 src/Model/User.php:607 #: mod/cal.php:297 src/Console/User.php:182 src/Model/User.php:662
#: src/Module/Admin/Users/Active.php:73 src/Module/Admin/Users/Blocked.php:74 #: src/Module/Admin/Users/Active.php:73 src/Module/Admin/Users/Blocked.php:74
#: src/Module/Admin/Users/Index.php:80 src/Module/Admin/Users/Pending.php:71 #: src/Module/Admin/Users/Index.php:80 src/Module/Admin/Users/Pending.php:71
#: src/Module/Api/Twitter/ContactEndpoint.php:73 #: src/Module/Api/Twitter/ContactEndpoint.php:73
@ -2966,7 +2966,7 @@ msgstr ""
msgid "File upload failed." msgid "File upload failed."
msgstr "" msgstr ""
#: mod/wall_upload.php:233 #: mod/wall_upload.php:233 src/Model/Photo.php:953
msgid "Wall Photos" msgid "Wall Photos"
msgstr "" msgstr ""
@ -3636,39 +3636,39 @@ msgstr ""
msgid "last" msgid "last"
msgstr "" msgstr ""
#: src/Content/Text/BBCode.php:942 src/Content/Text/BBCode.php:1605 #: src/Content/Text/BBCode.php:942 src/Content/Text/BBCode.php:1607
#: src/Content/Text/BBCode.php:1606 #: src/Content/Text/BBCode.php:1608
msgid "Image/photo" msgid "Image/photo"
msgstr "" msgstr ""
#: src/Content/Text/BBCode.php:1064 #: src/Content/Text/BBCode.php:1066
#, php-format #, php-format
msgid "" msgid ""
"<a href=\"%1$s\" target=\"_blank\" rel=\"noopener noreferrer\">%2$s</a> %3$s" "<a href=\"%1$s\" target=\"_blank\" rel=\"noopener noreferrer\">%2$s</a> %3$s"
msgstr "" msgstr ""
#: src/Content/Text/BBCode.php:1089 src/Model/Item.php:3024 #: src/Content/Text/BBCode.php:1091 src/Model/Item.php:3035
#: src/Model/Item.php:3030 src/Model/Item.php:3031 #: src/Model/Item.php:3041 src/Model/Item.php:3042
msgid "Link to source" msgid "Link to source"
msgstr "" msgstr ""
#: src/Content/Text/BBCode.php:1523 src/Content/Text/HTML.php:951 #: src/Content/Text/BBCode.php:1525 src/Content/Text/HTML.php:951
msgid "Click to open/close" msgid "Click to open/close"
msgstr "" msgstr ""
#: src/Content/Text/BBCode.php:1554 #: src/Content/Text/BBCode.php:1556
msgid "$1 wrote:" msgid "$1 wrote:"
msgstr "" msgstr ""
#: src/Content/Text/BBCode.php:1608 src/Content/Text/BBCode.php:1609 #: src/Content/Text/BBCode.php:1610 src/Content/Text/BBCode.php:1611
msgid "Encrypted content" msgid "Encrypted content"
msgstr "" msgstr ""
#: src/Content/Text/BBCode.php:1822 #: src/Content/Text/BBCode.php:1824
msgid "Invalid source protocol" msgid "Invalid source protocol"
msgstr "" msgstr ""
#: src/Content/Text/BBCode.php:1837 #: src/Content/Text/BBCode.php:1839
msgid "Invalid link protocol" msgid "Invalid link protocol"
msgstr "" msgstr ""
@ -4542,25 +4542,25 @@ msgstr ""
msgid "%s: updating %s table." msgid "%s: updating %s table."
msgstr "" msgstr ""
#: src/Factory/Api/Mastodon/Error.php:32 #: src/Factory/Api/Mastodon/Error.php:38
msgid "Record not found" msgid "Record not found"
msgstr "" msgstr ""
#: src/Factory/Api/Mastodon/Error.php:41 #: src/Factory/Api/Mastodon/Error.php:48
msgid "Unprocessable Entity" msgid "Unprocessable Entity"
msgstr "" msgstr ""
#: src/Factory/Api/Mastodon/Error.php:50 #: src/Factory/Api/Mastodon/Error.php:58
#: src/Module/Special/HTTPException.php:50 #: src/Module/Special/HTTPException.php:50
msgid "Unauthorized" msgid "Unauthorized"
msgstr "" msgstr ""
#: src/Factory/Api/Mastodon/Error.php:59 #: src/Factory/Api/Mastodon/Error.php:68
msgid "" msgid ""
"Token is not authorized with a valid user or is missing a required scope" "Token is not authorized with a valid user or is missing a required scope"
msgstr "" msgstr ""
#: src/Factory/Api/Mastodon/Error.php:68 #: src/Factory/Api/Mastodon/Error.php:78
#: src/Module/Special/HTTPException.php:53 #: src/Module/Special/HTTPException.php:53
msgid "Internal Server Error" msgid "Internal Server Error"
msgstr "" msgstr ""
@ -4815,33 +4815,33 @@ msgstr ""
msgid "Edit groups" msgid "Edit groups"
msgstr "" msgstr ""
#: src/Model/Item.php:1582 #: src/Model/Item.php:1600
#, php-format #, php-format
msgid "Detected languages in this post:\\n%s" msgid "Detected languages in this post:\\n%s"
msgstr "" msgstr ""
#: src/Model/Item.php:2527 #: src/Model/Item.php:2538
msgid "activity" msgid "activity"
msgstr "" msgstr ""
#: src/Model/Item.php:2529 #: src/Model/Item.php:2540
msgid "comment" msgid "comment"
msgstr "" msgstr ""
#: src/Model/Item.php:2532 #: src/Model/Item.php:2543
msgid "post" msgid "post"
msgstr "" msgstr ""
#: src/Model/Item.php:2646 #: src/Model/Item.php:2657
#, php-format #, php-format
msgid "Content warning: %s" msgid "Content warning: %s"
msgstr "" msgstr ""
#: src/Model/Item.php:2989 #: src/Model/Item.php:3000
msgid "bytes" msgid "bytes"
msgstr "" msgstr ""
#: src/Model/Item.php:3018 src/Model/Item.php:3019 #: src/Model/Item.php:3029 src/Model/Item.php:3030
msgid "View on separate page" msgid "View on separate page"
msgstr "" msgstr ""
@ -4959,138 +4959,138 @@ msgstr ""
msgid "Enter a valid existing folder" msgid "Enter a valid existing folder"
msgstr "" msgstr ""
#: src/Model/User.php:186 src/Model/User.php:931 #: src/Model/User.php:186 src/Model/User.php:986
msgid "SERIOUS ERROR: Generation of security keys failed." msgid "SERIOUS ERROR: Generation of security keys failed."
msgstr "" msgstr ""
#: src/Model/User.php:549 #: src/Model/User.php:571 src/Model/User.php:604
msgid "Login failed" msgid "Login failed"
msgstr "" msgstr ""
#: src/Model/User.php:581 #: src/Model/User.php:636
msgid "Not enough information to authenticate" msgid "Not enough information to authenticate"
msgstr "" msgstr ""
#: src/Model/User.php:676 #: src/Model/User.php:731
msgid "Password can't be empty" msgid "Password can't be empty"
msgstr "" msgstr ""
#: src/Model/User.php:695 #: src/Model/User.php:750
msgid "Empty passwords are not allowed." msgid "Empty passwords are not allowed."
msgstr "" msgstr ""
#: src/Model/User.php:699 #: src/Model/User.php:754
msgid "" msgid ""
"The new password has been exposed in a public data dump, please choose " "The new password has been exposed in a public data dump, please choose "
"another." "another."
msgstr "" msgstr ""
#: src/Model/User.php:705 #: src/Model/User.php:760
msgid "" msgid ""
"The password can't contain accentuated letters, white spaces or colons (:)" "The password can't contain accentuated letters, white spaces or colons (:)"
msgstr "" msgstr ""
#: src/Model/User.php:811 #: src/Model/User.php:866
msgid "Passwords do not match. Password unchanged." msgid "Passwords do not match. Password unchanged."
msgstr "" msgstr ""
#: src/Model/User.php:818 #: src/Model/User.php:873
msgid "An invitation is required." msgid "An invitation is required."
msgstr "" msgstr ""
#: src/Model/User.php:822 #: src/Model/User.php:877
msgid "Invitation could not be verified." msgid "Invitation could not be verified."
msgstr "" msgstr ""
#: src/Model/User.php:830 #: src/Model/User.php:885
msgid "Invalid OpenID url" msgid "Invalid OpenID url"
msgstr "" msgstr ""
#: src/Model/User.php:843 src/Security/Authentication.php:224 #: src/Model/User.php:898 src/Security/Authentication.php:224
msgid "" msgid ""
"We encountered a problem while logging in with the OpenID you provided. " "We encountered a problem while logging in with the OpenID you provided. "
"Please check the correct spelling of the ID." "Please check the correct spelling of the ID."
msgstr "" msgstr ""
#: src/Model/User.php:843 src/Security/Authentication.php:224 #: src/Model/User.php:898 src/Security/Authentication.php:224
msgid "The error message was:" msgid "The error message was:"
msgstr "" msgstr ""
#: src/Model/User.php:849 #: src/Model/User.php:904
msgid "Please enter the required information." msgid "Please enter the required information."
msgstr "" msgstr ""
#: src/Model/User.php:863 #: src/Model/User.php:918
#, php-format #, php-format
msgid "" msgid ""
"system.username_min_length (%s) and system.username_max_length (%s) are " "system.username_min_length (%s) and system.username_max_length (%s) are "
"excluding each other, swapping values." "excluding each other, swapping values."
msgstr "" msgstr ""
#: src/Model/User.php:870 #: src/Model/User.php:925
#, php-format #, php-format
msgid "Username should be at least %s character." msgid "Username should be at least %s character."
msgid_plural "Username should be at least %s characters." msgid_plural "Username should be at least %s characters."
msgstr[0] "" msgstr[0] ""
msgstr[1] "" msgstr[1] ""
#: src/Model/User.php:874 #: src/Model/User.php:929
#, php-format #, php-format
msgid "Username should be at most %s character." msgid "Username should be at most %s character."
msgid_plural "Username should be at most %s characters." msgid_plural "Username should be at most %s characters."
msgstr[0] "" msgstr[0] ""
msgstr[1] "" msgstr[1] ""
#: src/Model/User.php:882 #: src/Model/User.php:937
msgid "That doesn't appear to be your full (First Last) name." msgid "That doesn't appear to be your full (First Last) name."
msgstr "" msgstr ""
#: src/Model/User.php:887 #: src/Model/User.php:942
msgid "Your email domain is not among those allowed on this site." msgid "Your email domain is not among those allowed on this site."
msgstr "" msgstr ""
#: src/Model/User.php:891 #: src/Model/User.php:946
msgid "Not a valid email address." msgid "Not a valid email address."
msgstr "" msgstr ""
#: src/Model/User.php:894 #: src/Model/User.php:949
msgid "The nickname was blocked from registration by the nodes admin." msgid "The nickname was blocked from registration by the nodes admin."
msgstr "" msgstr ""
#: src/Model/User.php:898 src/Model/User.php:906 #: src/Model/User.php:953 src/Model/User.php:961
msgid "Cannot use that email." msgid "Cannot use that email."
msgstr "" msgstr ""
#: src/Model/User.php:913 #: src/Model/User.php:968
msgid "Your nickname can only contain a-z, 0-9 and _." msgid "Your nickname can only contain a-z, 0-9 and _."
msgstr "" msgstr ""
#: src/Model/User.php:921 src/Model/User.php:978 #: src/Model/User.php:976 src/Model/User.php:1033
msgid "Nickname is already registered. Please choose another." msgid "Nickname is already registered. Please choose another."
msgstr "" msgstr ""
#: src/Model/User.php:965 src/Model/User.php:969 #: src/Model/User.php:1020 src/Model/User.php:1024
msgid "An error occurred during registration. Please try again." msgid "An error occurred during registration. Please try again."
msgstr "" msgstr ""
#: src/Model/User.php:992 #: src/Model/User.php:1047
msgid "An error occurred creating your default profile. Please try again." msgid "An error occurred creating your default profile. Please try again."
msgstr "" msgstr ""
#: src/Model/User.php:999 #: src/Model/User.php:1054
msgid "An error occurred creating your self contact. Please try again." msgid "An error occurred creating your self contact. Please try again."
msgstr "" msgstr ""
#: src/Model/User.php:1004 #: src/Model/User.php:1059
msgid "Friends" msgid "Friends"
msgstr "" msgstr ""
#: src/Model/User.php:1008 #: src/Model/User.php:1063
msgid "" msgid ""
"An error occurred creating your default contact group. Please try again." "An error occurred creating your default contact group. Please try again."
msgstr "" msgstr ""
#: src/Model/User.php:1199 #: src/Model/User.php:1254
#, php-format #, php-format
msgid "" msgid ""
"\n" "\n"
@ -5098,7 +5098,7 @@ msgid ""
"\t\t\tthe administrator of %2$s has set up an account for you." "\t\t\tthe administrator of %2$s has set up an account for you."
msgstr "" msgstr ""
#: src/Model/User.php:1202 #: src/Model/User.php:1257
#, php-format #, php-format
msgid "" msgid ""
"\n" "\n"
@ -5135,12 +5135,12 @@ msgid ""
"\t\tThank you and welcome to %4$s." "\t\tThank you and welcome to %4$s."
msgstr "" msgstr ""
#: src/Model/User.php:1235 src/Model/User.php:1342 #: src/Model/User.php:1290 src/Model/User.php:1397
#, php-format #, php-format
msgid "Registration details for %s" msgid "Registration details for %s"
msgstr "" msgstr ""
#: src/Model/User.php:1255 #: src/Model/User.php:1310
#, php-format #, php-format
msgid "" msgid ""
"\n" "\n"
@ -5156,12 +5156,12 @@ msgid ""
"\t\t" "\t\t"
msgstr "" msgstr ""
#: src/Model/User.php:1274 #: src/Model/User.php:1329
#, php-format #, php-format
msgid "Registration at %s" msgid "Registration at %s"
msgstr "" msgstr ""
#: src/Model/User.php:1298 #: src/Model/User.php:1353
#, php-format #, php-format
msgid "" msgid ""
"\n" "\n"
@ -5170,7 +5170,7 @@ msgid ""
"\t\t\t" "\t\t\t"
msgstr "" msgstr ""
#: src/Model/User.php:1306 #: src/Model/User.php:1361
#, php-format #, php-format
msgid "" msgid ""
"\n" "\n"
@ -7201,7 +7201,7 @@ msgstr ""
msgid "Deny" msgid "Deny"
msgstr "" msgstr ""
#: src/Module/Api/Mastodon/Apps.php:47 src/Module/Api/Mastodon/Apps.php:58 #: src/Module/Api/Mastodon/Apps.php:58
msgid "Missing parameters" msgid "Missing parameters"
msgstr "" msgstr ""
@ -8882,15 +8882,15 @@ msgstr ""
msgid "Show all" msgid "Show all"
msgstr "" msgstr ""
#: src/Module/OAuth/Authorize.php:49 #: src/Module/OAuth/Authorize.php:51
msgid "Unsupported or missing response type" msgid "Unsupported or missing response type"
msgstr "" msgstr ""
#: src/Module/OAuth/Authorize.php:54 src/Module/OAuth/Token.php:55 #: src/Module/OAuth/Authorize.php:56 src/Module/OAuth/Token.php:57
msgid "Incomplete request data" msgid "Incomplete request data"
msgstr "" msgstr ""
#: src/Module/OAuth/Token.php:79 #: src/Module/OAuth/Token.php:81
msgid "Unsupported or missing grant type" msgid "Unsupported or missing grant type"
msgstr "" msgstr ""
@ -10585,20 +10585,20 @@ msgstr ""
msgid "Contact information and Social Networks" msgid "Contact information and Social Networks"
msgstr "" msgstr ""
#: src/Security/Authentication.php:210 src/Security/Authentication.php:262 #: src/Security/Authentication.php:210
msgid "Login failed." msgid "Login failed."
msgstr "" msgstr ""
#: src/Security/Authentication.php:273 #: src/Security/Authentication.php:251
msgid "Login failed. Please check your credentials." msgid "Login failed. Please check your credentials."
msgstr "" msgstr ""
#: src/Security/Authentication.php:392 #: src/Security/Authentication.php:370
#, php-format #, php-format
msgid "Welcome %s" msgid "Welcome %s"
msgstr "" msgstr ""
#: src/Security/Authentication.php:393 #: src/Security/Authentication.php:371
msgid "Please upload a profile photo." msgid "Please upload a profile photo."
msgstr "" msgstr ""

View file

@ -15,7 +15,7 @@
<a class="comment-edit-photo-link" href="{{$mylink}}" title="{{$mytitle}}"><img class="my-comment-photo" src="{{$myphoto}}" alt="{{$mytitle}}" title="{{$mytitle}}" /></a> <a class="comment-edit-photo-link" href="{{$mylink}}" title="{{$mytitle}}"><img class="my-comment-photo" src="{{$myphoto}}" alt="{{$mytitle}}" title="{{$mytitle}}" /></a>
</div> </div>
<div class="comment-edit-photo-end"></div> <div class="comment-edit-photo-end"></div>
<textarea id="comment-edit-text-{{$id}}" class="comment-edit-text-empty" name="body" placeholder="{{$comment}}" onFocus="commentOpen(this,{{$id}});" onBlur="commentClose(this,{{$id}});">{{if $threaded != false}}{{$default}}{{/if}}</textarea> <textarea id="comment-edit-text-{{$id}}" class="comment-edit-text-empty" name="body" placeholder="{{$comment}}" onFocus="commentOpen(this,{{$id}});" onBlur="commentClose(this,{{$id}});" dir="auto">{{if $threaded != false}}{{$default}}{{/if}}</textarea>
{{if $qcomment}} {{if $qcomment}}
<select id="qcomment-select-{{$id}}" name="qcomment-{{$id}}" class="qcomment" onchange="qCommentInsert(this,{{$id}});"> <select id="qcomment-select-{{$id}}" name="qcomment-{{$id}}" class="qcomment" onchange="qCommentInsert(this,{{$id}});">
<option value=""></option> <option value=""></option>

View file

@ -1,7 +1,7 @@
<div class="field input" id="wrapper_{{$field.0}}"> <div class="field input" id="wrapper_{{$field.0}}">
<label for="id_{{$field.0}}">{{$field.1}}{{if $field.4}} <span class="required" title="{{$field.4}}">*</span>{{/if}}</label> <label for="id_{{$field.0}}">{{$field.1}}{{if $field.4}} <span class="required" title="{{$field.4}}">*</span>{{/if}}</label>
<input type="{{$field.6|default:'text'}}" name="{{$field.0}}" id="id_{{$field.0}}" value="{{$field.2}}"{{if $field.4}} required{{/if}}{{if $field.5 eq "autofocus"}} autofocus{{elseif $field.5}} {{$field.5 nofilter}}{{/if}} aria-describedby="{{$field.0}}_tip"> <input type="{{$field.6|default:'text'}}" name="{{$field.0}}" id="id_{{$field.0}}" value="{{$field.2}}"{{if $field.4}} required{{/if}}{{if $field.5 eq "autofocus"}} autofocus{{elseif $field.5}} {{$field.5 nofilter}}{{/if}} aria-describedby="{{$field.0}}_tip" dir="auto">
{{if $field.3}} {{if $field.3}}
<span class="field_help" role="tooltip" id="{{$field.0}}_tip">{{$field.3 nofilter}}</span> <span class="field_help" role="tooltip" id="{{$field.0}}_tip">{{$field.3 nofilter}}</span>
{{/if}} {{/if}}

View file

@ -1,9 +1,9 @@
<div class='field select'> <div class="field select">
<label for='id_{{$field.0}}'>{{$field.1}}</label> <label for="id_{{$field.0}}">{{$field.1}}</label>
<select name='{{$field.0}}' id='id_{{$field.0}}' aria-describedby='{{$field.0}}_tip'> <select name="{{$field.0}}" id="id_{{$field.0}}" aria-describedby="{{$field.0}}_tip">
{{foreach $field.4 as $opt=>$val}} {{foreach $field.4 as $opt=>$val}}
<option value="{{$opt}}" {{if $opt==$field.2}}selected="selected"{{/if}}>{{$val}}</option> <option value="{{$opt}}" dir="auto"{{if $opt==$field.2}} selected="selected"{{/if}}>{{$val}}</option>
{{/foreach}} {{/foreach}}
</select> </select>
{{if $field.3}} {{if $field.3}}

View file

@ -1,7 +1,7 @@
<div class="field textarea"> <div class="field textarea">
<label for="id_{{$field.0}}">{{$field.1}}{{if $field.4}} <span class="required" title="{{$field.4}}">*</span>{{/if}}</label> <label for="id_{{$field.0}}">{{$field.1}}{{if $field.4}} <span class="required" title="{{$field.4}}">*</span>{{/if}}</label>
<textarea name="{{$field.0}}" id="id_{{$field.0}}"{{if $field.4}} required{{/if}} aria-describedby="{{$field.0}}_tip">{{$field.2}}</textarea> <textarea name="{{$field.0}}" id="id_{{$field.0}}"{{if $field.4}} required{{/if}} aria-describedby="{{$field.0}}_tip" dir="auto">{{$field.2}}</textarea>
{{if $field.3}} {{if $field.3}}
<span class="field_help" role="tooltip" id="{{$field.0}}_tip">{{$field.3 nofilter}}</span> <span class="field_help" role="tooltip" id="{{$field.0}}_tip">{{$field.3 nofilter}}</span>
{{/if}} {{/if}}

View file

@ -6,7 +6,7 @@
<label for="id_{{$field.0}}">{{$field.1}}</label> <label for="id_{{$field.0}}">{{$field.1}}</label>
<select name="{{$field.0}}" id="id_{{$field.0}}" {{if $field.5}}onchange="previewTheme(this);"{{/if}} aria-describedby="{{$field.0}}_tip"> <select name="{{$field.0}}" id="id_{{$field.0}}" {{if $field.5}}onchange="previewTheme(this);"{{/if}} aria-describedby="{{$field.0}}_tip">
{{foreach $field.4 as $opt=>$val}} {{foreach $field.4 as $opt=>$val}}
<option value="{{$opt}}" {{if $opt==$field.2}}selected="selected"{{/if}}>{{$val}}</option> <option value="{{$opt}}" dir="auto"{{if $opt==$field.2}} selected="selected"{{/if}}>{{$val}}</option>
{{/foreach}} {{/foreach}}
</select> </select>
{{if $field.3}} {{if $field.3}}

View file

@ -8,11 +8,11 @@
<input type="hidden" name="wall" value="{{$wall}}" /> <input type="hidden" name="wall" value="{{$wall}}" />
<div id="jot-title-wrap"> <div id="jot-title-wrap">
<input type="text" name="title" id="jot-title" class="jothidden jotforms form-control" placeholder="{{$placeholdertitle}}" title="{{$placeholdertitle}}" value="{{$title}}" tabindex="1"/> <input type="text" name="title" id="jot-title" class="jothidden jotforms form-control" placeholder="{{$placeholdertitle}}" title="{{$placeholdertitle}}" value="{{$title}}" tabindex="1" dir="auto" />
</div> </div>
{{if $placeholdercategory}} {{if $placeholdercategory}}
<div id="jot-category-wrap"> <div id="jot-category-wrap">
<input name="category" id="jot-category" class="jothidden jotforms form-control" type="text" placeholder="{{$placeholdercategory}}" title="{{$placeholdercategory}}" value="{{$category}}" tabindex="2"/> <input name="category" id="jot-category" class="jothidden jotforms form-control" type="text" placeholder="{{$placeholdercategory}}" title="{{$placeholdercategory}}" value="{{$category}}" tabindex="2" dir="auto" />
</div> </div>
{{/if}} {{/if}}
@ -44,7 +44,7 @@
</span> </span>
</p> </p>
<p> <p>
<textarea id="comment-edit-text-{{$id}}" class="comment-edit-text form-control text-autosize" name="body" placeholder="{{$default}}" rows="7" tabindex="3">{{$body}}</textarea> <textarea id="comment-edit-text-{{$id}}" class="comment-edit-text form-control text-autosize" name="body" placeholder="{{$default}}" rows="7" tabindex="3" dir="auto" dir="auto">{{$body}}</textarea>
</p> </p>
<p class="comment-edit-submit-wrapper"> <p class="comment-edit-submit-wrapper">

View file

@ -18,13 +18,13 @@
{{if $notes_cid}} {{if $notes_cid}}
<input type="hidden" name="contact_allow[]" value="<{{$notes_cid}}>" /> <input type="hidden" name="contact_allow[]" value="<{{$notes_cid}}>" />
{{/if}} {{/if}}
<div id="jot-title-wrap"><input name="title" id="jot-title" type="text" placeholder="{{$placeholdertitle}}" value="{{$title}}" class="jothidden" style="display:none"></div> <div id="jot-title-wrap"><input name="title" id="jot-title" type="text" placeholder="{{$placeholdertitle}}" value="{{$title}}" class="jothidden" style="display:none" dir="auto"></div>
{{if $placeholdercategory}} {{if $placeholdercategory}}
<div id="jot-category-wrap"><input name="category" id="jot-category" type="text" placeholder="{{$placeholdercategory}}" value="{{$category}}" class="jothidden" style="display:none" /></div> <div id="jot-category-wrap"><input name="category" id="jot-category" type="text" placeholder="{{$placeholdercategory}}" value="{{$category}}" class="jothidden" style="display:none" dir="auto"></div>
{{/if}} {{/if}}
<div id="jot-text-wrap"> <div id="jot-text-wrap">
<img id="profile-jot-text-loading" src="images/rotator.gif" alt="{{$wait}}" title="{{$wait}}" style="display: none;" /> <img id="profile-jot-text-loading" src="images/rotator.gif" alt="{{$wait}}" title="{{$wait}}" style="display: none;" />
<textarea rows="5" cols="64" class="profile-jot-text" id="profile-jot-text" name="body" placeholder="{{$share}}">{{if $content}}{{$content nofilter}}{{/if}}</textarea> <textarea rows="5" cols="64" class="profile-jot-text" id="profile-jot-text" name="body" placeholder="{{$share}}" dir="auto">{{if $content}}{{$content nofilter}}{{/if}}</textarea>
</div> </div>
<div id="profile-jot-submit-wrapper" class="jothidden"> <div id="profile-jot-submit-wrapper" class="jothidden">

View file

@ -1,4 +1,4 @@
<a class="embed_video" href="{{$embedurl}}" onclick='this.innerHTML=window.atob("{{$escapedhtml}}"); this.classList.add("active"); return false;'> <a class="embed_video" href="{{$embedurl}}" onclick="this.innerHTML=window.atob('{{$escapedhtml}}'); this.classList.add('active'); return false;">
<img width='{{$tw}}' height='{{$th}}' src='{{$turl}}' > <img width="{{$tw}}" height="{{$th}}" src="{{$turl}}">
<div style='width: {{$tw}}px; height: {{$th}}px;'></div> <div style="width: {{$tw}}px; height: {{$th}}px;"></div>
</a> </a>

View file

@ -15,7 +15,7 @@
<div class="photo-album-image-wrapper" id="photo-album-image-wrapper-{{$photo.id}}"> <div class="photo-album-image-wrapper" id="photo-album-image-wrapper-{{$photo.id}}">
<a href="{{$photo.link}}" class="photo-album-photo-link" id="photo-album-photo-link-{{$photo.id}}" title="{{$photo.title}}"> <a href="{{$photo.link}}" class="photo-album-photo-link" id="photo-album-photo-link-{{$photo.id}}" title="{{$photo.title}}">
<img src="{{$photo.src}}" alt="{{if $photo.album.name}}{{$photo.album.name}}{{elseif $photo.desc}}{{$photo.desc}}{{elseif $photo.alt}}{{$photo.alt}}{{else}}{{$photo.unknown}}{{/if}}" title="{{$photo.title}}" class="photo-album-photo lframe resize{{$photo.twist}}" id="photo-album-photo-{{$photo.id}}" /> <img src="{{$photo.src}}" alt="{{if $photo.album.name}}{{$photo.album.name}}{{elseif $photo.desc}}{{$photo.desc}}{{elseif $photo.alt}}{{$photo.alt}}{{else}}{{$photo.unknown}}{{/if}}" title="{{$photo.title}}" class="photo-album-photo lframe resize{{$photo.twist}}" id="photo-album-photo-{{$photo.id}}" />
<p class='caption'>{{$photo.desc}}</p> <p class="caption" dir="auto">{{$photo.desc}}</p>
</a> </a>
</div> </div>
<div class="photo-album-image-wrapper-end"></div> <div class="photo-album-image-wrapper-end"></div>

View file

@ -32,7 +32,7 @@
</div> </div>
<div class="wall-item-content" id="wall-item-content-{{$item.id}}"> <div class="wall-item-content" id="wall-item-content-{{$item.id}}">
<div class="wall-item-title" id="wall-item-title-{{$item.id}}">{{$item.title}}</div> <div class="wall-item-title" id="wall-item-title-{{$item.id}}" dir="auto">{{$item.title}}</div>
<div class="wall-item-title-end"></div> <div class="wall-item-title-end"></div>
<div class="wall-item-body" id="wall-item-body-{{$item.id}}" dir="auto">{{$item.body_html nofilter}}</div> <div class="wall-item-body" id="wall-item-body-{{$item.id}}" dir="auto">{{$item.body_html nofilter}}</div>
{{if $item.has_cats}} {{if $item.has_cats}}
@ -56,9 +56,9 @@
<div class="wall-item-wrapper-end"></div> <div class="wall-item-wrapper-end"></div>
<div class="wall-item-conv" id="wall-item-conv-{{$item.id}}"> <div class="wall-item-conv" id="wall-item-conv-{{$item.id}}" dir="auto">
{{if $item.conv}} {{if $item.conv}}
<a href='{{$item.conv.href}}' id='context-{{$item.id}}' title='{{$item.conv.title}}'>{{$item.conv.title}}</a> <a href="{{$item.conv.href}}" id="context-{{$item.id}}" title="{{$item.conv.title}}">{{$item.conv.title}}</a>
{{/if}} {{/if}}
</div> </div>

View file

@ -56,7 +56,7 @@
<div class="wall-item-ago" id="wall-item-ago-{{$item.id}}" title="{{$item.localtime}}"><time class="dt-published" datetime="{{$item.localtime}}">{{$item.ago}}</time><span class="pinned">{{$item.pinned}}</span></div> <div class="wall-item-ago" id="wall-item-ago-{{$item.id}}" title="{{$item.localtime}}"><time class="dt-published" datetime="{{$item.localtime}}">{{$item.ago}}</time><span class="pinned">{{$item.pinned}}</span></div>
</div> </div>
<div class="wall-item-content" id="wall-item-content-{{$item.id}}"> <div class="wall-item-content" id="wall-item-content-{{$item.id}}">
<div class="wall-item-title p-name" id="wall-item-title-{{$item.id}}">{{$item.title}}</div> <div class="wall-item-title p-name" id="wall-item-title-{{$item.id}}" dir="auto">{{$item.title}}</div>
<div class="wall-item-title-end"></div> <div class="wall-item-title-end"></div>
<div class="wall-item-body" id="wall-item-body-{{$item.id}}"> <div class="wall-item-body" id="wall-item-body-{{$item.id}}">
<span class="e-content" dir="auto">{{$item.body_html nofilter}}<span> <span class="e-content" dir="auto">{{$item.body_html nofilter}}<span>

View file

@ -42,7 +42,7 @@
data-role="insert-formatting" data-bbcode="video" data-id="{{$id}}"></a></li> data-role="insert-formatting" data-bbcode="video" data-id="{{$id}}"></a></li>
</ul> </ul>
<div class="comment-edit-bb-end"></div> <div class="comment-edit-bb-end"></div>
<textarea id="comment-edit-text-{{$id}}" class="comment-edit-text-empty" name="body" placeholder="{{$comment}}" onFocus="commentOpen(this,{{$id}});cmtBbOpen(this, {{$id}});" onBlur="commentClose(this,{{$id}});cmtBbClose(this,{{$id}});">{{if $threaded != false}}{{$default}}{{/if}}</textarea> <textarea id="comment-edit-text-{{$id}}" class="comment-edit-text-empty" name="body" placeholder="{{$comment}}" onFocus="commentOpen(this,{{$id}});cmtBbOpen(this, {{$id}});" onBlur="commentClose(this,{{$id}});cmtBbClose(this,{{$id}});" dir="auto">{{if $threaded != false}}{{$default}}{{/if}}</textarea>
{{if $qcomment}} {{if $qcomment}}
<select id="qcomment-select-{{$id}}" name="qcomment-{{$id}}" class="qcomment" onchange="qCommentInsert(this,{{$id}});"> <select id="qcomment-select-{{$id}}" name="qcomment-{{$id}}" class="qcomment" onchange="qCommentInsert(this,{{$id}});">
<option value=""></option> <option value=""></option>

View file

@ -39,7 +39,7 @@
</span> </span>
</p> </p>
<p> <p>
<textarea id="comment-edit-text-{{$id}}" class="comment-edit-text-empty form-control text-autosize" name="body" placeholder="{{$comment}}" rows="3" data-default="{{$default}}">{{$default}}</textarea> <textarea id="comment-edit-text-{{$id}}" class="comment-edit-text-empty form-control text-autosize" name="body" placeholder="{{$comment}}" rows="3" data-default="{{$default}}" dir="auto">{{$default}}</textarea>
</p> </p>
{{if $qcomment}} {{if $qcomment}}
<p> <p>

View file

@ -75,7 +75,7 @@
{{* The textarea for the event description *}} {{* The textarea for the event description *}}
<div class="form-group"> <div class="form-group">
<div id="event-desc-text"><b>{{$d_text}}</b></div> <div id="event-desc-text"><b>{{$d_text}}</b></div>
<textarea id="comment-edit-text-desc" class="form-control text-autosize" name="desc" >{{$d_orig}}</textarea> <textarea id="comment-edit-text-desc" class="form-control text-autosize" name="desc" dir="auto">{{$d_orig}}</textarea>
<ul id="event-desc-text-edit-bb" class="comment-edit-bb comment-icon-list nav nav-pills hidden-xs pull-left"> <ul id="event-desc-text-edit-bb" class="comment-edit-bb comment-icon-list nav nav-pills hidden-xs pull-left">
{{* commented out because it isn't implemented yet {{* commented out because it isn't implemented yet
<li> <li>
@ -122,7 +122,7 @@
{{* The textarea for the event location *}} {{* The textarea for the event location *}}
<div class="form-group"> <div class="form-group">
<div id="event-location-text"><b>{{$l_text}}</b></div> <div id="event-location-text"><b>{{$l_text}}</b></div>
<textarea id="comment-edit-text-loc" class="form-control text-autosize" name="location">{{$l_orig}}</textarea> <textarea id="comment-edit-text-loc" class="form-control text-autosize" name="location" dir="auto">{{$l_orig}}</textarea>
<ul id="comment-tools-loc" class="comment-edit-bb comment-icon-list nav nav-pills hidden-xs pull-left"> <ul id="comment-tools-loc" class="comment-edit-bb comment-icon-list nav nav-pills hidden-xs pull-left">
{{* commented out because it isn't implemented yet {{* commented out because it isn't implemented yet
<li> <li>

View file

@ -93,14 +93,14 @@
{{if $notes_cid}} {{if $notes_cid}}
<input type="hidden" name="contact_allow[]" value="<{{$notes_cid}}>" /> <input type="hidden" name="contact_allow[]" value="<{{$notes_cid}}>" />
{{/if}} {{/if}}
<div id="jot-title-wrap"><input name="title" id="jot-title" class="jothidden jotforms form-control" type="text" placeholder="{{$placeholdertitle}}" title="{{$placeholdertitle}}" value="{{$title}}" style="display:block;" /></div> <div id="jot-title-wrap"><input name="title" id="jot-title" class="jothidden jotforms form-control" type="text" placeholder="{{$placeholdertitle}}" title="{{$placeholdertitle}}" value="{{$title}}" style="display:block;" dir="auto" /></div>
{{if $placeholdercategory}} {{if $placeholdercategory}}
<div id="jot-category-wrap"><input name="category" id="jot-category" class="jothidden jotforms form-control" type="text" placeholder="{{$placeholdercategory}}" title="{{$placeholdercategory}}" value="{{$category}}" /></div> <div id="jot-category-wrap"><input name="category" id="jot-category" class="jothidden jotforms form-control" type="text" placeholder="{{$placeholdercategory}}" title="{{$placeholdercategory}}" value="{{$category}}" dir="auto" /></div>
{{/if}} {{/if}}
{{* The jot text field in which the post text is inserted *}} {{* The jot text field in which the post text is inserted *}}
<div id="jot-text-wrap"> <div id="jot-text-wrap">
<textarea rows="2" cols="64" class="profile-jot-text form-control text-autosize" id="profile-jot-text" name="body" placeholder="{{$share}}" onFocus="jotTextOpenUI(this);" onBlur="jotTextCloseUI(this);" style="min-width:100%; max-width:100%;">{{if $content}}{{$content nofilter}}{{/if}}</textarea> <textarea rows="2" cols="64" class="profile-jot-text form-control text-autosize" id="profile-jot-text" name="body" placeholder="{{$share}}" onFocus="jotTextOpenUI(this);" onBlur="jotTextCloseUI(this);" style="min-width:100%; max-width:100%;" dir="auto">{{if $content}}{{$content nofilter}}{{/if}}</textarea>
</div> </div>
<ul id="profile-jot-submit-wrapper" class="jothidden nav nav-pills"> <ul id="profile-jot-submit-wrapper" class="jothidden nav nav-pills">

View file

@ -19,7 +19,7 @@
{{* The message input field which contains the message text *}} {{* The message input field which contains the message text *}}
<div id="prvmail-message-label" class="form-group"> <div id="prvmail-message-label" class="form-group">
<label for="comment-edit-text-input">{{$yourmessage}}</label> <label for="comment-edit-text-input">{{$yourmessage}}</label>
<textarea rows="8" cols="72" class="prvmail-text form-control text-autosize" id="comment-edit-text-input" name="body" tabindex="12">{{$text}}</textarea> <textarea rows="8" cols="72" class="prvmail-text form-control text-autosize" id="comment-edit-text-input" name="body" tabindex="12" dir="auto">{{$text}}</textarea>
</div> </div>
<ul id="prvmail-text-edit-bb" class="comment-edit-bb comment-icon-list nav nav-pills hidden-xs pull-left"> <ul id="prvmail-text-edit-bb" class="comment-edit-bb comment-icon-list nav nav-pills hidden-xs pull-left">

View file

@ -97,7 +97,7 @@
{{* item content *}} {{* item content *}}
<div class="wall-item-content {{$item.type}}" id="wall-item-content-{{$item.id}}"> <div class="wall-item-content {{$item.type}}" id="wall-item-content-{{$item.id}}">
{{if $item.title}} {{if $item.title}}
<span class="wall-item-title" id="wall-item-title-{{$item.id}}"><h4 class="media-heading"><a href="{{$item.plink.href}}" class="{{$item.sparkle}}">{{$item.title}}</a></h4><br /></span> <span class="wall-item-title" id="wall-item-title-{{$item.id}}"><h4 class="media-heading" dir="auto"><a href="{{$item.plink.href}}" class="{{$item.sparkle}}">{{$item.title}}</a></h4><br /></span>
{{/if}} {{/if}}
<div class="wall-item-body" id="wall-item-body-{{$item.id}}" dir="auto">{{$item.body_html nofilter}}</div> <div class="wall-item-body" id="wall-item-body-{{$item.id}}" dir="auto">{{$item.body_html nofilter}}</div>
@ -278,7 +278,7 @@
</div> </div>
{{/if}} {{/if}}
<div class="wall-item-conv" id="wall-item-conv-{{$item.id}}"> <div class="wall-item-conv" id="wall-item-conv-{{$item.id}}" dir="auto">
{{if $item.conv}} {{if $item.conv}}
<a href="{{$item.conv.href}}" id="context-{{$item.id}}" title="{{$item.conv.title}}">{{$item.conv.title}}</a> <a href="{{$item.conv.href}}" id="context-{{$item.id}}" title="{{$item.conv.title}}">{{$item.conv.title}}</a>
{{/if}} {{/if}}

View file

@ -243,7 +243,7 @@ as the value of $top_child_total (this is done at the end of this file)
{{* item content *}} {{* item content *}}
<div class="wall-item-content {{$item.type}}" id="wall-item-content-{{$item.id}}"> <div class="wall-item-content {{$item.type}}" id="wall-item-content-{{$item.id}}">
{{if $item.title}} {{if $item.title}}
<span class="wall-item-title" id="wall-item-title-{{$item.id}}"><h4 class="media-heading"><a href="{{$item.plink.href}}" class="{{$item.sparkle}} p-name">{{$item.title}}</a></h4><br /></span> <span class="wall-item-title" id="wall-item-title-{{$item.id}}"><h4 class="media-heading" dir="auto"><a href="{{$item.plink.href}}" class="{{$item.sparkle}} p-name">{{$item.title}}</a></h4><br /></span>
{{/if}} {{/if}}
<div class="wall-item-body e-content {{if !$item.title}}p-name{{/if}}" id="wall-item-body-{{$item.id}}" dir="auto">{{$item.body_html nofilter}}</div> <div class="wall-item-body e-content {{if !$item.title}}p-name{{/if}}" id="wall-item-body-{{$item.id}}" dir="auto">{{$item.body_html nofilter}}</div>

View file

@ -40,7 +40,8 @@
class="comment-edit-text-empty" class="comment-edit-text-empty"
name="body" name="body"
placeholder="{{$comment}}" placeholder="{{$comment}}"
onFocus="commentOpen(this,{{$id}}) && cmtBbOpen({{$id}});">{{if $threaded != false}}{{$default}}{{/if}}</textarea> onFocus="commentOpen(this,{{$id}}) && cmtBbOpen({{$id}});"
dir="auto">{{if $threaded != false}}{{$default}}{{/if}}</textarea>
{{if $qcomment}} {{if $qcomment}}
<select id="qcomment-select-{{$id}}" name="qcomment-{{$id}}" class="qcomment" onchange="qCommentInsert(this,{{$id}});"> <select id="qcomment-select-{{$id}}" name="qcomment-{{$id}}" class="qcomment" onchange="qCommentInsert(this,{{$id}});">
<option value=""></option> <option value=""></option>

View file

@ -1,9 +1,9 @@
<form id="profile-jot-form" action="{{$action}}" method="post"> <form id="profile-jot-form" action="{{$action}}" method="post">
<div id="jot"> <div id="jot">
<div id="profile-jot-desc" class="jothidden">&nbsp;</div> <div id="profile-jot-desc" class="jothidden">&nbsp;</div>
<input name="title" id="jot-title" type="text" placeholder="{{$placeholdertitle}}" title="{{$placeholdertitle}}" value="{{$title}}" class="jothidden" style="display:none" /> <input name="title" id="jot-title" type="text" placeholder="{{$placeholdertitle}}" title="{{$placeholdertitle}}" value="{{$title}}" class="jothidden" style="display:none" dir="auto" />
{{if $placeholdercategory}} {{if $placeholdercategory}}
<input name="category" id="jot-category" type="text" placeholder="{{$placeholdercategory}}" title="{{$placeholdercategory}}" value="{{$category}}" class="jothidden" style="display:none" /> <input name="category" id="jot-category" type="text" placeholder="{{$placeholdercategory}}" title="{{$placeholdercategory}}" value="{{$category}}" class="jothidden" style="display:none" dir="auto" />
{{/if}} {{/if}}
<div id="character-counter" class="grey jothidden"></div> <div id="character-counter" class="grey jothidden"></div>
<input type="hidden" name="wall" value="{{$wall}}" /> <input type="hidden" name="wall" value="{{$wall}}" />
@ -19,7 +19,7 @@
<input type="hidden" name="contact_allow[]" value="<{{$notes_cid}}>" /> <input type="hidden" name="contact_allow[]" value="<{{$notes_cid}}>" />
{{/if}} {{/if}}
<textarea rows="5" cols="64" class="profile-jot-text" id="profile-jot-text" name="body" placeholder="{{$share}}">{{if $content}}{{$content nofilter}}{{/if}}</textarea> <textarea rows="5" cols="64" class="profile-jot-text" id="profile-jot-text" name="body" placeholder="{{$share}}" dir="auto">{{if $content}}{{$content nofilter}}{{/if}}</textarea>
<ul id="jot-tools" class="jothidden" style="display:none"> <ul id="jot-tools" class="jothidden" style="display:none">
<li><a href="#" onclick="return false;" id="wall-image-upload" title="{{$upload}}">{{$shortupload}}</a></a></li> <li><a href="#" onclick="return false;" id="wall-image-upload" title="{{$upload}}">{{$shortupload}}</a></a></li>

View file

@ -68,8 +68,8 @@
<div class="wall-item-like" id="wall-item-like-{{$id}}">{{$like nofilter}}</div> <div class="wall-item-like" id="wall-item-like-{{$id}}">{{$like nofilter}}</div>
<div class="wall-item-dislike" id="wall-item-dislike-{{$id}}">{{$dislike nofilter}}</div> <div class="wall-item-dislike" id="wall-item-dislike-{{$id}}">{{$dislike nofilter}}</div>
{{if $conv}} {{if $conv}}
<div class="wall-item-conv" id="wall-item-conv-{{$id}}" > <div class="wall-item-conv" id="wall-item-conv-{{$id}}" dir="auto">
<a href='{{$conv.href}}' id='context-{{$id}}' title='{{$conv.title}}'>{{$conv.title}}</a> <a href="{{$conv.href}}" id="context-{{$id}}" title="{{$conv.title}}">{{$conv.title}}</a>
</div> </div>
{{/if}} {{/if}}
</div> </div>

View file

@ -26,7 +26,7 @@
<div class="wall-item-location">{{$item.location_html nofilter}}</div> <div class="wall-item-location">{{$item.location_html nofilter}}</div>
</div> </div>
<div class="wall-item-content"> <div class="wall-item-content">
{{if $item.title}}<h2><a href="{{$item.plink.href}}">{{$item.title}}</a></h2>{{/if}} {{if $item.title}}<h2 dir="auto"><a href="{{$item.plink.href}}">{{$item.title}}</a></h2>{{/if}}
<div class="wall-item-body" dir="auto">{{$item.body_html nofilter}}</div> <div class="wall-item-body" dir="auto">{{$item.body_html nofilter}}</div>
</div> </div>
</div> </div>
@ -89,8 +89,8 @@
<div class="wall-item-like" id="wall-item-like-{{$item.id}}">{{$item.like_html nofilter}}</div> <div class="wall-item-like" id="wall-item-like-{{$item.id}}">{{$item.like_html nofilter}}</div>
<div class="wall-item-dislike" id="wall-item-dislike-{{$item.id}}">{{$item.dislike_html nofilter}}</div> <div class="wall-item-dislike" id="wall-item-dislike-{{$item.id}}">{{$item.dislike_html nofilter}}</div>
{{if $item.conv}} {{if $item.conv}}
<div class="wall-item-conv" id="wall-item-conv-{{$item.id}}"> <div class="wall-item-conv" id="wall-item-conv-{{$item.id}}" dir="auto">
<a href='{{$item.conv.href}}' id='context-{{$item.id}}' title='{{$item.conv.title}}'>{{$item.conv.title}}</a> <a href="{{$item.conv.href}}" id="context-{{$item.id}}" title="{{$item.conv.title}}">{{$item.conv.title}}</a>
</div> </div>
{{/if}} {{/if}}
</div> </div>

View file

@ -53,7 +53,7 @@
<div class="wall-item-location">{{$item.location_html nofilter}}</div> <div class="wall-item-location">{{$item.location_html nofilter}}</div>
</div> </div>
<div class="wall-item-content"> <div class="wall-item-content">
{{if $item.title}}<h2><a href="{{$item.plink.href}}" class="{{$item.sparkle}} p-name">{{$item.title}}</a></h2>{{/if}} {{if $item.title}}<h2 dir="auto"><a href="{{$item.plink.href}}" class="{{$item.sparkle}} p-name">{{$item.title}}</a></h2>{{/if}}
<div class="wall-item-body e-content {{if !$item.title}}p-name{{/if}}" dir="auto">{{$item.body_html nofilter}}</div> <div class="wall-item-body e-content {{if !$item.title}}p-name{{/if}}" dir="auto">{{$item.body_html nofilter}}</div>
</div> </div>
</div> </div>

View file

@ -16,16 +16,16 @@
<input type="hidden" name="preview" id="jot-preview" value="0" /> <input type="hidden" name="preview" id="jot-preview" value="0" />
<input type="hidden" name="post_id_random" value="{{$rand_num}}" /> <input type="hidden" name="post_id_random" value="{{$rand_num}}" />
<div id="jot-title-wrap"> <div id="jot-title-wrap">
<input name="title" id="jot-title" type="text" placeholder="{{$placeholdertitle}}" value="{{$title}}" class="jothidden" style="display:none"> <input name="title" id="jot-title" type="text" placeholder="{{$placeholdertitle}}" value="{{$title}}" class="jothidden" style="display:none" dir="auto">
</div> </div>
{{if $placeholdercategory}} {{if $placeholdercategory}}
<div id="jot-category-wrap"> <div id="jot-category-wrap">
<input name="category" id="jot-category" type="text" placeholder="{{$placeholdercategory}}" value="{{$category}}" class="jothidden" style="display:none" /> <input name="category" id="jot-category" type="text" placeholder="{{$placeholdercategory}}" value="{{$category}}" class="jothidden" style="display:none" dir="auto" />
</div> </div>
{{/if}} {{/if}}
<div id="jot-text-wrap"> <div id="jot-text-wrap">
<img id="profile-jot-text-loading" src="images/rotator.gif" alt="{{$wait}}" title="{{$wait}}" style="display: none;" /><br> <img id="profile-jot-text-loading" src="images/rotator.gif" alt="{{$wait}}" title="{{$wait}}" style="display: none;" /><br>
<textarea rows="5" cols="80" class="profile-jot-text" id="profile-jot-text" name="body" placeholder="{{$share}}"> <textarea rows="5" cols="80" class="profile-jot-text" id="profile-jot-text" name="body" placeholder="{{$share}}" dir="auto">
{{if $content}}{{$content nofilter}}{{/if}} {{if $content}}{{$content nofilter}}{{/if}}
</textarea> </textarea>
</div> </div>

View file

@ -46,9 +46,9 @@
<div class="wall-item-wrapper-end"></div> <div class="wall-item-wrapper-end"></div>
<div class="wall-item-conv" id="wall-item-conv-{{$item.id}}"> <div class="wall-item-conv" id="wall-item-conv-{{$item.id}}" dir="auto">
{{if $item.conv}} {{if $item.conv}}
<a href='{{$item.conv.href}}' id='context-{{$item.id}}' title='{{$item.conv.title}}'>{{$item.conv.title}}</a> <a href="{{$item.conv.href}}" id="context-{{$item.id}}" title="{{$item.conv.title}}">{{$item.conv.title}}</a>
{{/if}} {{/if}}
</div> </div>
<div class="wall-item-wrapper-end"></div> <div class="wall-item-wrapper-end"></div>

View file

@ -60,7 +60,7 @@
<div> <div>
<hr class="line-dots"> <hr class="line-dots">
</div> </div>
<div class="wall-item-title p-name" id="wall-item-title-{{$item.id}}">{{$item.title}}</div> <div class="wall-item-title p-name" id="wall-item-title-{{$item.id}}" dir="auto">{{$item.title}}</div>
<div class="wall-item-title-end"></div> <div class="wall-item-title-end"></div>
<div class="wall-item-body" id="wall-item-body-{{$item.id}}"> <div class="wall-item-body" id="wall-item-body-{{$item.id}}">
<span class="e-content" dir="auto">{{$item.body_html nofilter}}</span> <span class="e-content" dir="auto">{{$item.body_html nofilter}}</span>

View file

@ -15,7 +15,7 @@
<a class="comment-edit-photo-link" href="{{$mylink}}" title="{{$mytitle}}"><img class="my-comment-photo" src="{{$myphoto}}" alt="{{$mytitle}}" title="{{$mytitle}}" /></a> <a class="comment-edit-photo-link" href="{{$mylink}}" title="{{$mytitle}}"><img class="my-comment-photo" src="{{$myphoto}}" alt="{{$mytitle}}" title="{{$mytitle}}" /></a>
</div> </div>
<div class="comment-edit-photo-end"></div> <div class="comment-edit-photo-end"></div>
<textarea id="comment-edit-text-{{$id}}" class="comment-edit-text-empty" name="body" placeholder="{{$comment}}" onFocus="commentOpen(this,{{$id}});">{{if $threaded != false}}{{$default}}{{/if}}</textarea> <textarea id="comment-edit-text-{{$id}}" class="comment-edit-text-empty" name="body" placeholder="{{$comment}}" onFocus="commentOpen(this,{{$id}});" dir="auto">{{if $threaded != false}}{{$default}}{{/if}}</textarea>
{{if $qcomment}} {{if $qcomment}}
<select id="qcomment-select-{{$id}}" name="qcomment-{{$id}}" class="qcomment" onchange="qCommentInsert(this,{{$id}});"> <select id="qcomment-select-{{$id}}" name="qcomment-{{$id}}" class="qcomment" onchange="qCommentInsert(this,{{$id}});">
<option value=""></option> <option value=""></option>

View file

@ -25,7 +25,7 @@
<div id="event-desc-text">{{$d_text}}</div> <div id="event-desc-text">{{$d_text}}</div>
<textarea id="comment-edit-text-desc" rows="8" cols="64" name="desc" autocomplete="off">{{$d_orig}}</textarea> <textarea id="comment-edit-text-desc" rows="8" cols="64" name="desc" autocomplete="off" dir="auto">{{$d_orig}}</textarea>
<div id="event-desc-text-edit-bb" class="comment-edit-bb"> <div id="event-desc-text-edit-bb" class="comment-edit-bb">
<a title="{{$edimg}}" data-role="insert-formatting" data-bbcode="img" data-id="desc"><i class="icon-picture"></i></a> <a title="{{$edimg}}" data-role="insert-formatting" data-bbcode="img" data-id="desc"><i class="icon-picture"></i></a>
<a title="{{$edurl}}" data-role="insert-formatting" data-bbcode="url" data-id="desc"><i class="icon-link"></i></a> <a title="{{$edurl}}" data-role="insert-formatting" data-bbcode="url" data-id="desc"><i class="icon-link"></i></a>
@ -38,7 +38,7 @@
</div> </div>
<div id="event-location-text">{{$l_text}}</div> <div id="event-location-text">{{$l_text}}</div>
<textarea id="comment-edit-text-location" rows="4" cols="64" name="location">{{$l_orig}}</textarea> <textarea id="comment-edit-text-location" rows="4" cols="64" name="location" dir="auto">{{$l_orig}}</textarea>
<div id="event-location-text-edit-bb" class="comment-edit-bb"> <div id="event-location-text-edit-bb" class="comment-edit-bb">
<a title="{{$edimg}}" data-role="insert-formatting" data-bbcode="img" data-id="location"><i class="icon-picture"></i></a> <a title="{{$edimg}}" data-role="insert-formatting" data-bbcode="img" data-id="location"><i class="icon-picture"></i></a>
<a title="{{$edurl}}" data-role="insert-formatting" data-bbcode="url" data-id="location"><i class="icon-link"></i></a> <a title="{{$edurl}}" data-role="insert-formatting" data-bbcode="url" data-id="location"><i class="icon-link"></i></a>

View file

@ -81,7 +81,7 @@
<a accesskey="u" title="{{$sitelocation}}"><img src="{{$userinfo.icon}}" alt="{{$userinfo.name}}"><span id="nav-user-linklabel">{{$userinfo.name}}</span><span id="intro-update" class="nav-notification"></span></a> <a accesskey="u" title="{{$sitelocation}}"><img src="{{$userinfo.icon}}" alt="{{$userinfo.name}}"><span id="nav-user-linklabel">{{$userinfo.name}}</span><span id="intro-update" class="nav-notification"></span></a>
<ul id="nav-user-menu" class="menu-popup"> <ul id="nav-user-menu" class="menu-popup">
<li role="menuitem"> <a class="{{$nav.search.2}}" href="{{$nav.search.0}}" title="{{$nav.search.3}}">{{$nav.search.1}}</a> </li> <li role="menuitem"> <a class="{{$nav.search.2}}" href="{{$nav.search.0}}" title="{{$nav.search.3}}">{{$nav.search.1}}</a> </li>
{{if $nav.introductions}}<li role="menuitem"><a class="{{$nav.introductions.2}}" href="{{$nav.introductions.0}}" title="{{$nav.introductions.3}}" >{{$nav.introductions.1}}</a><span id="intro-update-li" class="nav-notification"></span></li>{{/if}} {{if $nav.introductions}}<li role="menuitem"><a class="{{$nav.introductions.2}}" href="{{$nav.introductions.0}}" title="{{$nav.introductions.3}}">{{$nav.introductions.1}}<span id="intro-update-li" class="nav-notification"></span></a></li>{{/if}}
{{if $nav.contacts}}<li role="menuitem"><a class="{{$nav.contacts.2}}" href="{{$nav.contacts.0}}" title="{{$nav.contacts.3}}">{{$nav.contacts.1}}</a></li>{{/if}} {{if $nav.contacts}}<li role="menuitem"><a class="{{$nav.contacts.2}}" href="{{$nav.contacts.0}}" title="{{$nav.contacts.3}}">{{$nav.contacts.1}}</a></li>{{/if}}
{{if $nav.messages}}<li role="menuitem"><a class="{{$nav.messages.2}}" href="{{$nav.messages.0}}" title="{{$nav.messages.3}}">{{$nav.messages.1}} <span id="mail-update-li" class="nav-notification"></span></a></li>{{/if}} {{if $nav.messages}}<li role="menuitem"><a class="{{$nav.messages.2}}" href="{{$nav.messages.0}}" title="{{$nav.messages.3}}">{{$nav.messages.1}} <span id="mail-update-li" class="nav-notification"></span></a></li>{{/if}}
{{if $nav.delegation}}<li role="menuitem"><a class="{{$nav.delegation.2}}" href="{{$nav.delegation.0}}" title="{{$nav.delegation.3}}">{{$nav.delegation.1}}</a></li>{{/if}} {{if $nav.delegation}}<li role="menuitem"><a class="{{$nav.delegation.2}}" href="{{$nav.delegation.0}}" title="{{$nav.delegation.3}}">{{$nav.delegation.1}}</a></li>{{/if}}

View file

@ -30,9 +30,8 @@
</div> </div>
</div> </div>
<div class="wall-item-bottom"> <div class="wall-item-bottom">
<div class=""> <div dir="auto">
<!-- {{if $plink}}<a title="{{$plink.title}}" href="{{$plink.href}}"><i class="icon-link icon-large"></i></a>{{/if}} --> {{if $conv}}<a href="{{$conv.href}}" id="context-{{$id}}" title="{{$conv.title}}"><i class="icon-link icon-large"></i></a>{{/if}}
{{if $conv}}<a href='{{$conv.href}}' id='context-{{$id}}' title='{{$conv.title}}'><i class="icon-link icon-large"></i></a>{{/if}}
</div> </div>
<div class="wall-item-actions"> <div class="wall-item-actions">

View file

@ -31,7 +31,7 @@
</span> </span>
</div> </div>
<div class="wall-item-content"> <div class="wall-item-content">
{{if $item.title}}<h2><a href="{{$item.plink.href}}">{{$item.title}}</a></h2>{{/if}} {{if $item.title}}<h2 dir="auto"><a href="{{$item.plink.href}}">{{$item.title}}</a></h2>{{/if}}
<div class="wall-item-body" dir="auto">{{$item.body_html nofilter}}</div> <div class="wall-item-body" dir="auto">{{$item.body_html nofilter}}</div>
</div> </div>
</div> </div>
@ -47,9 +47,8 @@
</div> </div>
</div> </div>
<div class="wall-item-bottom"> <div class="wall-item-bottom">
<div class=""> <div dir="auto">
<!-- {{if $item.plink}}<a title="{{$item.plink.title}}" href="{{$item.plink.href}}"><i class="icon-link icon-large"></i></a>{{/if}} --> {{if $item.conv}}<a href="{{$item.conv.href}}" id="context-{{$item.id}}" title="{{$item.conv.title}}"><i class="icon-link icon-large"></i></a>{{/if}}
{{if $item.conv}}<a href='{{$item.conv.href}}' id='context-{{$item.id}}' title='{{$item.conv.title}}'><i class="icon-link icon-large"></i></a>{{/if}}
</div> </div>
<div class="wall-item-actions"> <div class="wall-item-actions">

View file

@ -73,7 +73,7 @@
</div> </div>
<div itemprop="description" class="wall-item-content"> <div itemprop="description" class="wall-item-content">
{{if $item.title}}<h2><a href="{{$item.plink.href}}" class="{{$item.sparkle}} p-name">{{$item.title}}</a></h2>{{/if}} {{if $item.title}}<h2 dir="auto"><a href="{{$item.plink.href}}" class="{{$item.sparkle}} p-name" dir="auto">{{$item.title}}</a></h2>{{/if}}
<div class="wall-item-body e-content {{if !$item.title}}p-name{{/if}}" dir="auto">{{$item.body_html nofilter}}</div> <div class="wall-item-body e-content {{if !$item.title}}p-name{{/if}}" dir="auto">{{$item.body_html nofilter}}</div>
</div> </div>
</div> </div>