<?php
+
namespace Shaarli;
use DateTime;
$this->language = $confLanguage;
}
- if (! extension_loaded('gettext')
+ if (
+ ! extension_loaded('gettext')
|| in_array($this->conf->get('translation.mode', 'auto'), ['auto', 'php'])
) {
$this->initPhpTranslator();
$this->translator->loadDomain(self::DEFAULT_DOMAIN, 'inc/languages');
// Default extension translation from the current theme
- $themeTransFolder = rtrim($this->conf->get('raintpl_tpl'), '/') .'/'. $this->conf->get('theme') .'/language';
+ $themeTransFolder = rtrim($this->conf->get('raintpl_tpl'), '/') . '/' . $this->conf->get('theme') . '/language';
if (is_dir($themeTransFolder)) {
$this->translator->loadDomain($this->conf->get('theme'), $themeTransFolder, false);
}
$translations = new Translations();
// Core translations
try {
- $translations = $translations->addFromPoFile('inc/languages/'. $this->language .'/LC_MESSAGES/shaarli.po');
+ $translations = $translations->addFromPoFile('inc/languages/' . $this->language . '/LC_MESSAGES/shaarli.po');
$translations->setDomain('shaarli');
$this->translator->loadTranslations($translations);
} catch (\InvalidArgumentException $e) {
// Default extension translation from the current theme
$theme = $this->conf->get('theme');
- $themeTransFolder = rtrim($this->conf->get('raintpl_tpl'), '/') .'/'. $theme .'/language';
+ $themeTransFolder = rtrim($this->conf->get('raintpl_tpl'), '/') . '/' . $theme . '/language';
if (is_dir($themeTransFolder)) {
try {
$translations = Translations::fromPoFile(
- $themeTransFolder .'/'. $this->language .'/LC_MESSAGES/'. $theme .'.po'
+ $themeTransFolder . '/' . $this->language . '/LC_MESSAGES/' . $theme . '.po'
);
$translations->setDomain($theme);
$this->translator->loadTranslations($translations);
try {
$extension = Translations::fromPoFile(
- $translationPath . $this->language .'/LC_MESSAGES/'. $domain .'.po'
+ $translationPath . $this->language . '/LC_MESSAGES/' . $domain . '.po'
);
$extension->setDomain($domain);
$this->translator->loadTranslations($extension);
// TODO: create a proper error handling system able to catch exceptions...
die(t(
'php-gd extension must be loaded to use thumbnails. '
- .'Thumbnails are now disabled. Please reload the page.'
+ . 'Thumbnails are now disabled. Please reload the page.'
));
}
*/
public function get($url)
{
- if ($this->conf->get('thumbnails.mode') === self::MODE_COMMON
+ if (
+ $this->conf->get('thumbnails.mode') === self::MODE_COMMON
&& ! $this->isCommonMediaOrImage($url)
) {
return false;
<?php
+
/**
* Generates a list of available timezone continents and cities.
*
// Try to split the provided timezone
$spos = strpos($preselectedTimezone, '/');
$pcontinent = substr($preselectedTimezone, 0, $spos);
- $pcity = substr($preselectedTimezone, $spos+1);
+ $pcity = substr($preselectedTimezone, $spos + 1);
}
$continents = [];
}
$continent = substr($tz, 0, $spos);
- $city = substr($tz, $spos+1);
+ $city = substr($tz, $spos + 1);
$cities[] = ['continent' => $continent, 'city' => $city];
$continents[$continent] = true;
}
function isTimeZoneValid($continent, $city)
{
return in_array(
- $continent.'/'.$city,
+ $continent . '/' . $city,
timezone_identifiers_list()
);
}
<?php
+
/**
* Shaarli utilities
*/
}
if (is_array($input)) {
- $out = array();
+ $out = [];
foreach ($input as $key => $value) {
$out[escape($key)] = escape($value);
}
*
* @return string $referer - final referer.
*/
-function generateLocation($referer, $host, $loopTerms = array())
+function generateLocation($referer, $host, $loopTerms = [])
{
$finalReferer = './?';
function autoLocale($headerLocale)
{
// Default if browser does not send HTTP_ACCEPT_LANGUAGE
- $locales = array('en_US', 'en_US.utf8', 'en_US.UTF-8');
+ $locales = ['en_US', 'en_US.utf8', 'en_US.UTF-8'];
if (! empty($headerLocale)) {
if (preg_match_all('/([a-z]{2,3})[-_]?([a-z]{2})?,?/i', $headerLocale, $matches, PREG_SET_ORDER)) {
$attempts = [];
return $val;
}
$val = trim($val);
- $last = strtolower($val[strlen($val)-1]);
+ $last = strtolower($val[strlen($val) - 1]);
$val = intval(substr($val, 0, -1));
switch ($last) {
case 'g':
*/
function t($text, $nText = '', $nb = 1, $domain = 'shaarli', $variables = [], $fixCase = false)
{
- $postFunction = $fixCase ? 'ucfirst' : function ($input) { return $input; };
+ $postFunction = $fixCase ? 'ucfirst' : function ($input) {
+ return $input;
+ };
return $postFunction(dn__($domain, $text, $nText, $nb, $variables));
}
{
return $e->getMessage() . PHP_EOL . $e->getFile() . $e->getLine() . PHP_EOL . $e->getTraceAsString();
}
-
<?php
+
namespace Shaarli\Api;
use malkusch\lock\mutex\FlockMutex;
*/
protected function checkToken($request)
{
- if (!$request->hasHeader('Authorization')
+ if (
+ !$request->hasHeader('Authorization')
&& !isset($this->container->environment['REDIRECT_HTTP_AUTHORIZATION'])
) {
throw new ApiAuthorizationException('JWT token not provided');
<?php
+
namespace Shaarli\Api;
use Shaarli\Api\Exceptions\ApiAuthorizationException;
throw new ApiAuthorizationException('Malformed JWT token');
}
- $genSign = Base64Url::encode(hash_hmac('sha512', $parts[0] .'.'. $parts[1], $secret, true));
+ $genSign = Base64Url::encode(hash_hmac('sha512', $parts[0] . '.' . $parts[1], $secret, true));
if ($parts[2] != $genSign) {
throw new ApiAuthorizationException('Invalid JWT signature');
}
throw new ApiAuthorizationException('Invalid JWT payload');
}
- if (empty($payload->iat)
+ if (
+ empty($payload->iat)
|| $payload->iat > time()
|| time() - $payload->iat > ApiMiddleware::$TOKEN_DURATION
) {
<?php
-
namespace Shaarli\Api\Controllers;
use Shaarli\Api\Exceptions\ApiBadParametersException;
$info = [
'global_counter' => $this->bookmarkService->count(),
'private_counter' => $this->bookmarkService->count(BookmarkFilter::$PRIVATE),
- 'settings' => array(
+ 'settings' => [
'title' => $this->conf->get('general.title', 'Shaarli'),
'header_link' => $this->conf->get('general.header_link', '?'),
'timezone' => $this->conf->get('general.timezone', 'UTC'),
'enabled_plugins' => $this->conf->get('general.enabled_plugins', []),
'default_private_links' => $this->conf->get('privacy.default_private_links', false),
- ),
+ ],
];
return $response->withJson($info, 200, $this->jsonStyle);
$data = (array) ($request->getParsedBody() ?? []);
$bookmark = ApiUtils::buildBookmarkFromRequest($data, $this->conf->get('privacy.default_private_links'));
// duplicate by URL, return 409 Conflict
- if (! empty($bookmark->getUrl())
+ if (
+ ! empty($bookmark->getUrl())
&& ! empty($dup = $this->bookmarkService->findByUrl($bookmark->getUrl()))
) {
return $response->withJson(
$requestBookmark = ApiUtils::buildBookmarkFromRequest($data, $this->conf->get('privacy.default_private_links'));
// duplicate URL on a different link, return 409 Conflict
- if (! empty($requestBookmark->getUrl())
+ if (
+ ! empty($requestBookmark->getUrl())
&& ! empty($dup = $this->bookmarkService->findByUrl($requestBookmark->getUrl()))
&& $dup->getId() != $id
) {
*/
public function setMessage($message)
{
- $original = $this->debug === true ? ': '. $this->getMessage() : '';
+ $original = $this->debug === true ? ': ' . $this->getMessage() : '';
$this->message = $message . $original;
}
}
}
return [
'message' => $this->getMessage(),
- 'stacktrace' => get_class($this) .': '. $this->getTraceAsString()
+ 'stacktrace' => get_class($this) . ': ' . $this->getTraceAsString()
];
}
*/
public function validate(): void
{
- if ($this->id === null
+ if (
+ $this->id === null
|| ! is_int($this->id)
|| empty($this->shortUrl)
|| empty($this->created)
throw new InvalidBookmarkException($this);
}
if (empty($this->url)) {
- $this->url = '/shaare/'. $this->shortUrl;
+ $this->url = '/shaare/' . $this->shortUrl;
}
if (empty($this->title)) {
$this->title = $this->url;
*/
public function offsetSet($offset, $value)
{
- if (! $value instanceof Bookmark
+ if (
+ ! $value instanceof Bookmark
|| $value->getId() === null || empty($value->getUrl())
|| ($offset !== null && ! is_int($offset)) || ! is_int($value->getId())
|| $offset !== null && $offset !== $value->getId()
*/
public function getByUrl(string $url): ?Bookmark
{
- if (! empty($url)
+ if (
+ ! empty($url)
&& isset($this->urls[$url])
&& isset($this->bookmarks[$this->urls[$url]])
) {
} else {
try {
$this->bookmarks = $this->bookmarksIO->read();
- } catch (EmptyDataStoreException|DatastoreNotInitializedException $e) {
+ } catch (EmptyDataStoreException | DatastoreNotInitializedException $e) {
$this->bookmarks = new BookmarkArray();
if ($this->isLoggedIn) {
if (! $this->bookmarks instanceof BookmarkArray) {
$this->migrate();
exit(
- 'Your data store has been migrated, please reload the page.'. PHP_EOL .
+ 'Your data store has been migrated, please reload the page.' . PHP_EOL .
'If this message keeps showing up, please delete data/updates.txt file.'
);
}
$bookmark = $this->bookmarkFilter->filter(BookmarkFilter::$FILTER_HASH, $hash);
// PHP 7.3 introduced array_key_first() to avoid this hack
$first = reset($bookmark);
- if (!$this->isLoggedIn
+ if (
+ !$this->isLoggedIn
&& $first->isPrivate()
&& (empty($privateKey) || $privateKey !== $first->getAdditionalContentEntry('private_key'))
) {
}
$bookmark = $this->bookmarks[$id];
- if (($bookmark->isPrivate() && $visibility != 'all' && $visibility != 'private')
+ if (
+ ($bookmark->isPrivate() && $visibility != 'all' && $visibility != 'private')
|| (! $bookmark->isPrivate() && $visibility != 'all' && $visibility != 'public')
) {
throw new Exception('Unauthorized');
}
$bookmark = $this->bookmarks[$id];
- if (($bookmark->isPrivate() && $visibility != 'all' && $visibility != 'private')
+ if (
+ ($bookmark->isPrivate() && $visibility != 'all' && $visibility != 'private')
|| (! $bookmark->isPrivate() && $visibility != 'all' && $visibility != 'public')
) {
return false;
$caseMapping = [];
foreach ($bookmarks as $bookmark) {
foreach ($bookmark->getTags() as $tag) {
- if (empty($tag)
+ if (
+ empty($tag)
|| (! $this->isLoggedIn && startsWith($tag, '.'))
|| $tag === BookmarkMarkdownFormatter::NO_MD_TAG
|| in_array($tag, $filteringTags, true)
foreach ($this->search([], null, false, false, true) as $bookmark) {
if ($to < $bookmark->getCreated()) {
$next = $bookmark->getCreated();
- } else if ($from < $bookmark->getCreated() && $to > $bookmark->getCreated()) {
+ } elseif ($from < $bookmark->getCreated() && $to > $bookmark->getCreated()) {
$out[] = $bookmark;
} else {
if ($previous !== null) {
return $this->bookmarks;
}
- $out = array();
+ $out = [];
foreach ($this->bookmarks as $key => $value) {
if ($value->isPrivate() && $visibility === 'private') {
$out[$key] = $value;
$search = $link->getTagsString($tagsSeparator);
if (strlen(trim($link->getDescription())) && strpos($link->getDescription(), '#') !== false) {
// description given and at least one possible tag found
- $descTags = array();
+ $descTags = [];
// find all tags in the form of #tag in the description
preg_match_all(
'/(?<![' . self::$HASHTAG_CHARS . '])#([' . self::$HASHTAG_CHARS . ']+?)\b/sm',
protected function buildFullTextSearchableLink(Bookmark $link, array &$lengths): string
{
$tagString = $link->getTagsString($this->conf->get('general.tags_separator', ' '));
- $content = mb_convert_case($link->getTitle(), MB_CASE_LOWER, 'UTF-8') .'\\';
- $content .= mb_convert_case($link->getDescription(), MB_CASE_LOWER, 'UTF-8') .'\\';
- $content .= mb_convert_case($link->getUrl(), MB_CASE_LOWER, 'UTF-8') .'\\';
- $content .= mb_convert_case($tagString, MB_CASE_LOWER, 'UTF-8') .'\\';
+ $content = mb_convert_case($link->getTitle(), MB_CASE_LOWER, 'UTF-8') . '\\';
+ $content .= mb_convert_case($link->getDescription(), MB_CASE_LOWER, 'UTF-8') . '\\';
+ $content .= mb_convert_case($link->getUrl(), MB_CASE_LOWER, 'UTF-8') . '\\';
+ $content .= mb_convert_case($tagString, MB_CASE_LOWER, 'UTF-8') . '\\';
$lengths['title'] = ['start' => 0, 'end' => mb_strlen($link->getTitle())];
$nextField = $lengths['title']['end'] + 1;
if (is_file($this->datastore) && !is_writeable($this->datastore)) {
// The datastore exists but is not writeable
throw new NotWritableDataStoreException($this->datastore);
- } else if (!is_file($this->datastore) && !is_writeable(dirname($this->datastore))) {
+ } elseif (!is_file($this->datastore) && !is_writeable(dirname($this->datastore))) {
// The datastore does not exist and its parent directory is not writeable
throw new NotWritableDataStoreException(dirname($this->datastore));
}
- $data = self::$phpPrefix.base64_encode(gzdeflate(serialize($links))).self::$phpSuffix;
+ $data = self::$phpPrefix . base64_encode(gzdeflate(serialize($links))) . self::$phpSuffix;
$this->mutex->synchronized(function () use ($data) {
file_put_contents(
$bookmark->setTitle('Calm Jazz Music - YouTube ' . t('(private bookmark with thumbnail demo)'));
$bookmark->setUrl('https://www.youtube.com/watch?v=DVEUcbPkb-c');
$bookmark->setDescription(t(
-'Shaarli will automatically pick up the thumbnail for links to a variety of websites.
+ 'Shaarli will automatically pick up the thumbnail for links to a variety of websites.
Explore your new Shaarli instance by trying out controls and menus.
Visit the project on [Github](https://github.com/shaarli/Shaarli) or [the documentation](https://shaarli.readthedocs.io/en/master/) to learn more about Shaarli.
$bookmark = new Bookmark();
$bookmark->setTitle(t('Note: Shaare descriptions'));
$bookmark->setDescription(t(
-'Adding a shaare without entering a URL creates a text-only "note" post such as this one.
+ 'Adding a shaare without entering a URL creates a text-only "note" post such as this one.
This note is private, so you are the only one able to see it while logged in.
You can use this to keep notes, post articles, code snippets, and much more.
'Shaarli - ' . t('The personal, minimalist, super-fast, database free, bookmarking service')
);
$bookmark->setDescription(t(
-'Welcome to Shaarli!
+ 'Welcome to Shaarli!
Shaarli allows you to bookmark your favorite pages, and share them with others or store them privately.
You can add a description to your bookmarks, such as this one, and tag them.
$propertiesKey = ['property', 'name', 'itemprop'];
$properties = implode('|', $propertiesKey);
// We need a OR here to accept either 'property=og:noquote' or 'property="og:unrelated og:my-tag"'
- $orCondition = '["\']?(?:og:)?'. $tag .'["\']?|["\'][^\'"]*?(?:og:)?' . $tag . '[^\'"]*?[\'"]';
+ $orCondition = '["\']?(?:og:)?' . $tag . '["\']?|["\'][^\'"]*?(?:og:)?' . $tag . '[^\'"]*?[\'"]';
// Try to retrieve OpenGraph tag.
- $ogRegex = '#<meta[^>]+(?:'. $properties .')=(?:'. $orCondition .')[^>]*content=(["\'])([^\1]*?)\1.*?>#';
+ $ogRegex = '#<meta[^>]+(?:' . $properties . ')=(?:' . $orCondition . ')[^>]*content=(["\'])([^\1]*?)\1.*?>#';
// If the attributes are not in the order property => content (e.g. Github)
// New regex to keep this readable... more or less.
- $ogRegexReverse = '#<meta[^>]+content=(["\'])([^\1]*?)\1[^>]+(?:'. $properties .')=(?:'. $orCondition .').*?>#';
+ $ogRegexReverse = '#<meta[^>]+content=(["\'])([^\1]*?)\1[^>]+(?:' . $properties . ')=(?:' . $orCondition . ').*?>#';
- if (preg_match($ogRegex, $html, $matches) > 0
+ if (
+ preg_match($ogRegex, $html, $matches) > 0
|| preg_match($ogRegexReverse, $html, $matches) > 0
) {
return $matches[2];
* \p{Mn} - any non marking space (accents, umlauts, etc)
*/
$regex = '/(^|\s)#([\p{Pc}\p{N}\p{L}\p{Mn}]+)/mui';
- $replacement = '$1<a href="'. $indexUrl .'./add-tag/$2" title="Hashtag $2">#$2</a>';
+ $replacement = '$1<a href="' . $indexUrl . './add-tag/$2" title="Hashtag $2">#$2</a>';
return preg_replace($regex, $replacement, $description);
}
<?php
+
namespace Shaarli\Bookmark\Exception;
use Exception;
<?php
-
namespace Shaarli\Bookmark\Exception;
-
-class EmptyDataStoreException extends \Exception {}
+class EmptyDataStoreException extends \Exception
+{
+}
} else {
$created = 'Not a DateTime object';
}
- $this->message = 'This bookmark is not valid'. PHP_EOL;
- $this->message .= ' - ID: '. $bookmark->getId() . PHP_EOL;
- $this->message .= ' - Title: '. $bookmark->getTitle() . PHP_EOL;
- $this->message .= ' - Url: '. $bookmark->getUrl() . PHP_EOL;
- $this->message .= ' - ShortUrl: '. $bookmark->getShortUrl() . PHP_EOL;
- $this->message .= ' - Created: '. $created . PHP_EOL;
+ $this->message = 'This bookmark is not valid' . PHP_EOL;
+ $this->message .= ' - ID: ' . $bookmark->getId() . PHP_EOL;
+ $this->message .= ' - Title: ' . $bookmark->getTitle() . PHP_EOL;
+ $this->message .= ' - Url: ' . $bookmark->getUrl() . PHP_EOL;
+ $this->message .= ' - ShortUrl: ' . $bookmark->getShortUrl() . PHP_EOL;
+ $this->message .= ' - Created: ' . $created . PHP_EOL;
} else {
- $this->message = 'The provided data is not a bookmark'. PHP_EOL;
+ $this->message = 'The provided data is not a bookmark' . PHP_EOL;
$this->message .= var_export($bookmark, true);
}
}
<?php
-
namespace Shaarli\Bookmark\Exception;
-
class NotWritableDataStoreException extends \Exception
{
/**
*/
public function __construct($dataStore)
{
- $this->message = 'Couldn\'t load data from the data store file "'. $dataStore .'". '.
+ $this->message = 'Couldn\'t load data from the data store file "' . $dataStore . '". ' .
'Your data might be corrupted, or your file isn\'t readable.';
}
}
<?php
+
namespace Shaarli\Config;
/**
<?php
+
namespace Shaarli\Config;
use Shaarli\Config\Exception\MissingFieldConfigException;
*/
protected static $NOT_FOUND = 'NOT_FOUND';
- public static $DEFAULT_PLUGINS = array('qrcode');
+ public static $DEFAULT_PLUGINS = ['qrcode'];
/**
* @var string Config folder.
public function set($setting, $value, $write = false, $isLoggedIn = false)
{
if (empty($setting) || ! is_string($setting)) {
- throw new \Exception(t('Invalid setting key parameter. String expected, got: '). gettype($setting));
+ throw new \Exception(t('Invalid setting key parameter. String expected, got: ') . gettype($setting));
}
// During the ConfigIO transition, map legacy settings to the new ones.
public function remove($setting, $write = false, $isLoggedIn = false)
{
if (empty($setting) || ! is_string($setting)) {
- throw new \Exception(t('Invalid setting key parameter. String expected, got: '). gettype($setting));
+ throw new \Exception(t('Invalid setting key parameter. String expected, got: ') . gettype($setting));
}
// During the ConfigIO transition, map legacy settings to the new ones.
public function write($isLoggedIn)
{
// These fields are required in configuration.
- $mandatoryFields = array(
+ $mandatoryFields = [
'credentials.login',
'credentials.hash',
'credentials.salt',
'general.title',
'general.header_link',
'privacy.default_private_links',
- );
+ ];
// Only logged in user can alter config.
if (is_file($this->getConfigFileExt()) && !$isLoggedIn) {
$this->setEmpty('translation.mode', 'php');
$this->setEmpty('translation.extensions', []);
- $this->setEmpty('plugins', array());
+ $this->setEmpty('plugins', []);
$this->setEmpty('formatter', 'markdown');
}
<?php
+
namespace Shaarli\Config;
/**
/**
* @var array List of config key without group.
*/
- public static $ROOT_KEYS = array(
+ public static $ROOT_KEYS = [
'login',
'hash',
'salt',
'redirector',
'disablesessionprotection',
'privateLinkByDefault',
- );
+ ];
/**
* Map legacy config keys with the new ones.
*
* @var array current key => legacy key.
*/
- public static $LEGACY_KEYS_MAPPING = array(
+ public static $LEGACY_KEYS_MAPPING = [
'credentials.login' => 'login',
'credentials.hash' => 'hash',
'credentials.salt' => 'salt',
'privacy.hide_public_links' => 'config.HIDE_PUBLIC_LINKS',
'privacy.hide_timestamps' => 'config.HIDE_TIMESTAMPS',
'security.open_shaarli' => 'config.OPEN_SHAARLI',
- );
+ ];
/**
* @inheritdoc
public function read($filepath)
{
if (! file_exists($filepath) || ! is_readable($filepath)) {
- return array();
+ return [];
}
include $filepath;
- $out = array();
+ $out = [];
foreach (self::$ROOT_KEYS as $key) {
$out[$key] = isset($GLOBALS[$key]) ? $GLOBALS[$key] : '';
}
*/
public function write($filepath, $conf)
{
- $configStr = '<?php '. PHP_EOL;
+ $configStr = '<?php ' . PHP_EOL;
foreach (self::$ROOT_KEYS as $key) {
if (isset($conf[$key])) {
$configStr .= '$GLOBALS[\'' . $key . '\'] = ' . var_export($conf[$key], true) . ';' . PHP_EOL;
foreach ($conf['config'] as $key => $value) {
$configStr .= '$GLOBALS[\'config\'][\''
. $key
- .'\'] = '
- .var_export($conf['config'][$key], true).';'
+ . '\'] = '
+ . var_export($conf['config'][$key], true) . ';'
. PHP_EOL;
}
foreach ($conf['plugins'] as $key => $value) {
$configStr .= '$GLOBALS[\'plugins\'][\''
. $key
- .'\'] = '
- .var_export($conf['plugins'][$key], true).';'
+ . '\'] = '
+ . var_export($conf['plugins'][$key], true) . ';'
. PHP_EOL;
}
}
- if (!file_put_contents($filepath, $configStr)
+ if (
+ !file_put_contents($filepath, $configStr)
|| strcmp(file_get_contents($filepath), $configStr) != 0
) {
throw new \Shaarli\Exceptions\IOException(
$filepath,
- t('Shaarli could not create the config file. '.
+ t('Shaarli could not create the config file. ' .
'Please make sure Shaarli has the right to write in the folder is it installed in.')
);
}
throw new PluginConfigOrderException();
}
- $plugins = array();
- $newEnabledPlugins = array();
+ $plugins = [];
+ $newEnabledPlugins = [];
foreach ($formData as $key => $data) {
if (startsWith($key, 'order')) {
continue;
throw new PluginConfigOrderException();
}
- $finalPlugins = array();
+ $finalPlugins = [];
// Make plugins order continuous.
foreach ($plugins as $plugin) {
$finalPlugins[] = $plugin;
*/
function validate_plugin_order($formData)
{
- $orders = array();
+ $orders = [];
foreach ($formData as $key => $value) {
// No duplicate order allowed.
if (in_array($value, $orders, true)) {
<?php
-
namespace Shaarli\Config\Exception;
/**
<?php
-
namespace Shaarli\Config\Exception;
/**
<?php
+
namespace Shaarli\Exceptions;
use Exception;
<?php
+
namespace Shaarli\Feed;
use DateTime;
$nblinksToDisplay = $this->getNbLinks(count($linksToDisplay), $userInput);
// Can't use array_keys() because $link is a LinkDB instance and not a real array.
- $keys = array();
+ $keys = [];
foreach ($linksToDisplay as $key => $value) {
$keys[] = $key;
}
$pageaddr = escape(index_url($this->serverInfo));
$this->formatter->addContextData('index_url', $pageaddr);
- $linkDisplayed = array();
+ $linkDisplayed = [];
for ($i = 0; $i < $nblinksToDisplay && $i < count($keys); $i++) {
$linkDisplayed[$keys[$i]] = $this->buildItem($feedType, $linksToDisplay[$keys[$i]], $pageaddr);
}
$data = $this->formatter->format($link);
$data['guid'] = rtrim($pageaddr, '/') . '/shaare/' . $data['shorturl'];
if ($this->usePermalinks === true) {
- $permalink = '<a href="'. $data['url'] .'" title="'. t('Direct link') .'">'. t('Direct link') .'</a>';
+ $permalink = '<a href="' . $data['url'] . '" title="' . t('Direct link') . '">' . t('Direct link') . '</a>';
} else {
- $permalink = '<a href="'. $data['guid'] .'" title="'. t('Permalink') .'">'. t('Permalink') .'</a>';
+ $permalink = '<a href="' . $data['guid'] . '" title="' . t('Permalink') . '">' . t('Permalink') . '</a>';
}
$data['description'] .= PHP_EOL . PHP_EOL . '<br>— ' . $permalink;
$processedDescription = $this->replaceTokens($processedDescription);
if (!empty($processedDescription)) {
- $processedDescription = '<div class="markdown">'. $processedDescription . '</div>';
+ $processedDescription = '<div class="markdown">' . $processedDescription . '</div>';
}
return $processedDescription;
function ($match) use ($allowedProtocols, $indexUrl) {
$link = startsWith($match[1], '?') || startsWith($match[1], '/') ? $indexUrl : '';
$link .= whitelist_protocols($match[1], $allowedProtocols);
- return ']('. $link.')';
+ return '](' . $link . ')';
},
$description
);
* \p{Mn} - any non marking space (accents, umlauts, etc)
*/
$regex = '/(^|\s)#([\p{Pc}\p{N}\p{L}\p{Mn}]+)/mui';
- $replacement = '$1[#$2]('. $indexUrl .'./add-tag/$2)';
+ $replacement = '$1[#$2](' . $indexUrl . './add-tag/$2)';
$descriptionLines = explode(PHP_EOL, $description);
$descriptionOut = '';
*/
protected function sanitizeHtml($description)
{
- $escapeTags = array(
+ $escapeTags = [
'script',
'style',
'link',
'iframe',
'frameset',
'frame',
- );
+ ];
foreach ($escapeTags as $tag) {
$description = preg_replace_callback(
- '#<\s*'. $tag .'[^>]*>(.*</\s*'. $tag .'[^>]*>)?#is',
+ '#<\s*' . $tag . '[^>]*>(.*</\s*' . $tag . '[^>]*>)?#is',
function ($match) {
return escape($match[0]);
},
*
* @package Shaarli\Formatter
*/
-class BookmarkRawFormatter extends BookmarkFormatter {}
+class BookmarkRawFormatter extends BookmarkFormatter
+{
+}
public function getFormatter(string $type = null): BookmarkFormatter
{
$type = $type ? $type : $this->conf->get('formatter', 'default');
- $className = '\\Shaarli\\Formatter\\Bookmark'. ucfirst($type) .'Formatter';
+ $className = '\\Shaarli\\Formatter\\Bookmark' . ucfirst($type) . 'Formatter';
if (!class_exists($className)) {
$className = '\\Shaarli\\Formatter\\BookmarkDefaultFormatter';
}
$this->initBasePath($request);
try {
- if (!is_file($this->container->conf->getConfigFileExt())
+ if (
+ !is_file($this->container->conf->getConfigFileExt())
&& !in_array($next->getName(), ['displayInstall', 'saveInstall'], true)
) {
return $response->withRedirect($this->container->basePath . '/install');
*/
protected function checkOpenShaarli(Request $request, Response $response, callable $next): bool
{
- if (// if the user isn't logged in
+ if (
+// if the user isn't logged in
!$this->container->loginManager->isLoggedIn()
// and Shaarli doesn't have public content...
&& $this->container->conf->get('privacy.hide_public_links')
$this->assignView('languages', Languages::getAvailableLanguages());
$this->assignView('gd_enabled', extension_loaded('gd'));
$this->assignView('thumbnails_mode', $this->container->conf->get('thumbnails.mode', Thumbnailer::MODE_NONE));
- $this->assignView('pagetitle', t('Configure') .' - '. $this->container->conf->get('general.title', 'Shaarli'));
+ $this->assignView('pagetitle', t('Configure') . ' - ' . $this->container->conf->get('general.title', 'Shaarli'));
return $response->write($this->render(TemplatePage::CONFIGURE));
}
}
$thumbnailsMode = extension_loaded('gd') ? $request->getParam('enableThumbnails') : Thumbnailer::MODE_NONE;
- if ($thumbnailsMode !== Thumbnailer::MODE_NONE
+ if (
+ $thumbnailsMode !== Thumbnailer::MODE_NONE
&& $thumbnailsMode !== $this->container->conf->get('thumbnails.mode', Thumbnailer::MODE_NONE)
) {
$this->saveWarningMessage(
t('You have enabled or changed thumbnails mode.') .
- '<a href="'. $this->container->basePath .'/admin/thumbnails">' . t('Please synchronize them.') .'</a>'
+ '<a href="' . $this->container->basePath . '/admin/thumbnails">' . t('Please synchronize them.') . '</a>'
);
}
$this->container->conf->set('thumbnails.mode', $thumbnailsMode);
*/
public function index(Request $request, Response $response): Response
{
- $this->assignView('pagetitle', t('Export') .' - '. $this->container->conf->get('general.title', 'Shaarli'));
+ $this->assignView('pagetitle', t('Export') . ' - ' . $this->container->conf->get('general.title', 'Shaarli'));
return $response->write($this->render(TemplatePage::EXPORT));
}
$response = $response->withHeader('Content-Type', 'text/html; charset=utf-8');
$response = $response->withHeader(
'Content-disposition',
- 'attachment; filename=bookmarks_'.$selection.'_'.$now->format(Bookmark::LINK_DATE_FORMAT).'.html'
+ 'attachment; filename=bookmarks_' . $selection . '_' . $now->format(Bookmark::LINK_DATE_FORMAT) . '.html'
);
$this->assignView('date', $now->format(DateTime::RFC822));
true
)
);
- $this->assignView('pagetitle', t('Import') .' - '. $this->container->conf->get('general.title', 'Shaarli'));
+ $this->assignView('pagetitle', t('Import') . ' - ' . $this->container->conf->get('general.title', 'Shaarli'));
return $response->write($this->render(TemplatePage::IMPORT));
}
$msg = sprintf(
t(
'The file you are trying to upload is probably bigger than what this webserver can accept'
- .' (%s). Please upload in smaller chunks.'
+ . ' (%s). Please upload in smaller chunks.'
),
get_max_upload_size(ini_get('post_max_size'), ini_get('upload_max_filesize'))
);
$this->assignView('tags_separator', $separator);
$this->assignView(
'pagetitle',
- t('Manage tags') .' - '. $this->container->conf->get('general.title', 'Shaarli')
+ t('Manage tags') . ' - ' . $this->container->conf->get('general.title', 'Shaarli')
);
return $response->write($this->render(TemplatePage::CHANGE_TAG));
$this->saveSuccessMessage($alert);
- $redirect = true === $isDelete ? '/admin/tags' : '/?searchtags='. urlencode($toTag);
+ $redirect = true === $isDelete ? '/admin/tags' : '/?searchtags=' . urlencode($toTag);
return $this->redirect($response, $redirect);
}
$this->assignView(
'pagetitle',
- t('Change password') .' - '. $this->container->conf->get('general.title', 'Shaarli')
+ t('Change password') . ' - ' . $this->container->conf->get('general.title', 'Shaarli')
);
}
// Save new password
// Salt renders rainbow-tables attacks useless.
- $this->container->conf->set('credentials.salt', sha1(uniqid('', true) .'_'. mt_rand()));
+ $this->container->conf->set('credentials.salt', sha1(uniqid('', true) . '_' . mt_rand()));
$this->container->conf->set(
'credentials.hash',
sha1(
$this->assignView('disabledPlugins', $disabledPlugins);
$this->assignView(
'pagetitle',
- t('Plugin Administration') .' - '. $this->container->conf->get('general.title', 'Shaarli')
+ t('Plugin Administration') . ' - ' . $this->container->conf->get('general.title', 'Shaarli')
);
return $response->write($this->render(TemplatePage::PLUGINS_ADMIN));
unset($parameters['parameters_form']);
unset($parameters['token']);
foreach ($parameters as $param => $value) {
- $this->container->conf->set('plugins.'. $param, escape($value));
+ $this->container->conf->set('plugins.' . $param, escape($value));
}
} else {
$this->container->conf->set('general.enabled_plugins', save_plugin_config($parameters));
$this->saveWarningMessage(
t('Thumbnails cache has been cleared.') . ' ' .
- '<a href="'. $this->container->basePath .'/admin/thumbnails">' . t('Please synchronize them.') .'</a>'
+ '<a href="' . $this->container->basePath . '/admin/thumbnails">' . t('Please synchronize them.') . '</a>'
);
} else {
$folders = [
return $this->redirectFromReferer($request, $response, ['visibility']);
}
-
-
}
$this->assignView(
'pagetitle',
- t('Shaare a new link') .' - '. $this->container->conf->get('general.title', 'Shaarli')
+ t('Shaare a new link') . ' - ' . $this->container->conf->get('general.title', 'Shaarli')
);
$this->assignView('tags', $tags);
$this->assignView('default_private_links', $this->container->conf->get('privacy.default_private_links', false));
$data = $formatter->format($bookmark);
$this->executePageHooks('delete_link', $data);
$this->container->bookmarkService->remove($bookmark, false);
- ++ $count;
+ ++$count;
}
if ($count > 0) {
$this->container->conf->get('general.tags_separator', ' ')
);
- if ($this->container->conf->get('thumbnails.mode', Thumbnailer::MODE_NONE) !== Thumbnailer::MODE_NONE
+ if (
+ $this->container->conf->get('thumbnails.mode', Thumbnailer::MODE_NONE) !== Thumbnailer::MODE_NONE
&& true !== $this->container->conf->get('general.enable_async_metadata', true)
&& $bookmark->shouldUpdateThumbnail()
) {
return $this->redirectFromReferer(
$request,
$response,
- ['/admin/add-shaare', '/admin/shaare'], ['addlink', 'post', 'edit_link'],
+ ['/admin/add-shaare', '/admin/shaare'],
+ ['addlink', 'post', 'edit_link'],
$bookmark->getShortUrl()
);
}
$this->assignView($key, $value);
}
- $editLabel = false === $isNew ? t('Edit') .' ' : '';
+ $editLabel = false === $isNew ? t('Edit') . ' ' : '';
$this->assignView(
'pagetitle',
- $editLabel . t('Shaare') .' - '. $this->container->conf->get('general.title', 'Shaarli')
+ $editLabel . t('Shaare') . ' - ' . $this->container->conf->get('general.title', 'Shaarli')
);
return $response->write($this->render(TemplatePage::EDIT_LINK));
// If this is an HTTP(S) link, we try go get the page to extract
// the title (otherwise we will to straight to the edit form.)
- if (true !== $this->container->conf->get('general.enable_async_metadata', true)
+ if (
+ true !== $this->container->conf->get('general.enable_async_metadata', true)
&& empty($title)
&& strpos(get_url_scheme($url) ?: '', 'http') !== false
) {
$this->assignView('ids', $ids);
$this->assignView(
'pagetitle',
- t('Thumbnails update') .' - '. $this->container->conf->get('general.title', 'Shaarli')
+ t('Thumbnails update') . ' - ' . $this->container->conf->get('general.title', 'Shaarli')
);
return $response->write($this->render(TemplatePage::THUMBNAILS));
$this->assignView($key, $value);
}
- $this->assignView('pagetitle', t('Tools') .' - '. $this->container->conf->get('general.title', 'Shaarli'));
+ $this->assignView('pagetitle', t('Tools') . ' - ' . $this->container->conf->get('general.title', 'Shaarli'));
return $response->write($this->render(TemplatePage::TOOLS));
}
$formatter->addContextData('base_path', $this->container->basePath);
$searchTags = normalize_spaces($request->getParam('searchtags') ?? '');
- $searchTerm = escape(normalize_spaces($request->getParam('searchterm') ?? ''));;
+ $searchTerm = escape(normalize_spaces($request->getParam('searchterm') ?? ''));
+ ;
// Filter bookmarks according search parameters.
$visibility = $this->container->sessionManager->getSessionParameter('visibility');
$data = array_merge(
$this->initializeTemplateVars(),
[
- 'pagetitle' => $bookmark->getTitle() .' - '. $this->container->conf->get('general.title', 'Shaarli'),
+ 'pagetitle' => $bookmark->getTitle() . ' - ' . $this->container->conf->get('general.title', 'Shaarli'),
'links' => [$formatter->format($bookmark)],
]
);
$bookmark->setThumbnail(null);
// Requires an update, not async retrieval, thumbnails enabled
- if ($bookmark->shouldUpdateThumbnail()
+ if (
+ $bookmark->shouldUpdateThumbnail()
&& true !== $this->container->conf->get('general.enable_async_metadata', true)
&& $this->container->conf->get('thumbnails.mode', Thumbnailer::MODE_NONE) !== Thumbnailer::MODE_NONE
) {
'date' => $endDateTime,
'date_rss' => $endDateTime->format(DateTime::RSS),
'date_human' => DailyPageHelper::getDescriptionByType($type, $dayDateTime),
- 'absolute_url' => $indexUrl . 'daily?'. $type .'=' . $day,
+ 'absolute_url' => $indexUrl . 'daily?' . $type . '=' . $day,
'links' => [],
];
protected function processRequest(string $feedType, Request $request, Response $response): Response
{
- $response = $response->withHeader('Content-Type', 'application/'. $feedType .'+xml; charset=utf-8');
+ $response = $response->withHeader('Content-Type', 'application/' . $feedType . '+xml; charset=utf-8');
$pageUrl = page_url($this->container->environment);
$cache = $this->container->pageCacheManager->getCachePage($pageUrl);
// Before installation, we'll make sure that permissions are set properly, and sessions are working.
$this->checkPermissions();
- if (static::SESSION_TEST_VALUE
+ if (
+ static::SESSION_TEST_VALUE
!== $this->container->sessionManager->getSessionParameter(static::SESSION_TEST_KEY)
) {
$this->container->sessionManager->setSessionParameter(static::SESSION_TEST_KEY, static::SESSION_TEST_VALUE);
// This part makes sure sessions works correctly.
// (Because on some hosts, session.save_path may not be set correctly,
// or we may not have write access to it.)
- if (static::SESSION_TEST_VALUE
+ if (
+ static::SESSION_TEST_VALUE
!== $this->container->sessionManager->getSessionParameter(static::SESSION_TEST_KEY)
) {
// Step 2: Check if data in session is correct.
$msg = t(
- '<pre>Sessions do not seem to work correctly on your server.<br>'.
- 'Make sure the variable "session.save_path" is set correctly in your PHP config, '.
- 'and that you have write access to it.<br>'.
- 'It currently points to %s.<br>'.
- 'On some browsers, accessing your server via a hostname like \'localhost\' '.
- 'or any custom hostname without a dot causes cookie storage to fail. '.
+ '<pre>Sessions do not seem to work correctly on your server.<br>' .
+ 'Make sure the variable "session.save_path" is set correctly in your PHP config, ' .
+ 'and that you have write access to it.<br>' .
+ 'It currently points to %s.<br>' .
+ 'On some browsers, accessing your server via a hostname like \'localhost\' ' .
+ 'or any custom hostname without a dot causes cookie storage to fail. ' .
'We recommend accessing your server via it\'s IP address or Fully Qualified Domain Name.<br>'
);
$msg = sprintf($msg, $this->container->sessionManager->getSavePath());
public function save(Request $request, Response $response): Response
{
$timezone = 'UTC';
- if (!empty($request->getParam('continent'))
+ if (
+ !empty($request->getParam('continent'))
&& !empty($request->getParam('city'))
&& isTimeZoneValid($request->getParam('continent'), $request->getParam('city'))
) {
$login = $request->getParam('setlogin');
$this->container->conf->set('credentials.login', $login);
- $salt = sha1(uniqid('', true) .'_'. mt_rand());
+ $salt = sha1(uniqid('', true) . '_' . mt_rand());
$this->container->conf->set('credentials.salt', $salt);
$this->container->conf->set('credentials.hash', sha1($request->getParam('setpassword') . $login . $salt));
} else {
$this->container->conf->set(
'general.title',
- 'Shared bookmarks on '.escape(index_url($this->container->environment))
+ 'Shared bookmarks on ' . escape(index_url($this->container->environment))
);
}
$this
->assignView('returnurl', escape($returnUrl))
->assignView('remember_user_default', $this->container->conf->get('privacy.remember_user_default', true))
- ->assignView('pagetitle', t('Login') .' - '. $this->container->conf->get('general.title', 'Shaarli'))
+ ->assignView('pagetitle', t('Login') . ' - ' . $this->container->conf->get('general.title', 'Shaarli'))
;
return $response->write($this->render(TemplatePage::LOGIN));
return $this->redirect($response, '/');
}
- if (!$this->container->loginManager->checkCredentials(
+ if (
+ !$this->container->loginManager->checkCredentials(
client_ip_id($this->container->environment),
$request->getParam('login'),
$request->getParam('password')
*/
protected function checkLoginState(): bool
{
- if ($this->container->loginManager->isLoggedIn()
+ if (
+ $this->container->loginManager->isLoggedIn()
|| $this->container->conf->get('security.open_shaarli', false)
) {
throw new CantLoginException();
$this->assignView(
'pagetitle',
- t('Picture wall') .' - '. $this->container->conf->get('general.title', 'Shaarli')
+ t('Picture wall') . ' - ' . $this->container->conf->get('general.title', 'Shaarli')
);
// Optionally filter the results:
if (null !== $referer) {
$currentUrl = parse_url($referer);
// If the referer is not related to Shaarli instance, redirect to default
- if (isset($currentUrl['host'])
+ if (
+ isset($currentUrl['host'])
&& strpos(index_url($this->container->environment), $currentUrl['host']) === false
) {
return $response->withRedirect($defaultPath);
}
}
- $queryString = count($params) > 0 ? '?'. http_build_query($params) : '';
+ $queryString = count($params) > 0 ? '?' . http_build_query($params) : '';
$anchor = $anchor ? '#' . $anchor : '';
return $response->withRedirect($path . $queryString . $anchor);
$this->executePageHooks('render_tag' . $type, $data, 'tag.' . $type);
$this->assignAllView($data);
- $searchTags = !empty($searchTags) ? trim(str_replace($tagsSeparator, ' ', $searchTags)) .' - ' : '';
+ $searchTags = !empty($searchTags) ? trim(str_replace($tagsSeparator, ' ', $searchTags)) . ' - ' : '';
$this->assignView(
'pagetitle',
- $searchTags . t('Tag '. $type) .' - '. $this->container->conf->get('general.title', 'Shaarli')
+ $searchTags . t('Tag ' . $type) . ' - ' . $this->container->conf->get('general.title', 'Shaarli')
);
return $response->write($this->render('tag.' . $type));
// In case browser does not send HTTP_REFERER, we search a single tag
if (null === $referer) {
if (null !== $newTag) {
- return $this->redirect($response, '/?searchtags='. urlencode($newTag));
+ return $this->redirect($response, '/?searchtags=' . urlencode($newTag));
}
return $this->redirect($response, '/');
parse_str($currentUrl['query'] ?? '', $params);
if (null === $newTag) {
- return $response->withRedirect(($currentUrl['path'] ?? './') .'?'. http_build_query($params));
+ return $response->withRedirect(($currentUrl['path'] ?? './') . '?' . http_build_query($params));
}
// Prevent redirection loop
// We also remove page (keeping the same page has no sense, since the results are different)
unset($params['page']);
- return $response->withRedirect(($currentUrl['path'] ?? './') .'?'. http_build_query($params));
+ return $response->withRedirect(($currentUrl['path'] ?? './') . '?' . http_build_query($params));
}
/**
parse_str($currentUrl['query'] ?? '', $params);
if (null === $tagToRemove) {
- return $response->withRedirect(($currentUrl['path'] ?? './') .'?'. http_build_query($params));
+ return $response->withRedirect(($currentUrl['path'] ?? './') . '?' . http_build_query($params));
}
// Prevent redirection loop
<?php
+
namespace Shaarli\Helper;
use Exception;
public static $GITHUB_URL = 'https://github.com/shaarli/Shaarli';
public static $GIT_RAW_URL = 'https://raw.githubusercontent.com/shaarli/Shaarli';
- public static $GIT_BRANCHES = array('latest', 'stable');
+ public static $GIT_BRANCHES = ['latest', 'stable'];
private static $VERSION_START_TAG = '<?php /* ';
private static $VERSION_END_TAG = ' */ ?>';
}
return str_replace(
- array(self::$VERSION_START_TAG, self::$VERSION_END_TAG, PHP_EOL),
- array('', '', ''),
+ [self::$VERSION_START_TAG, self::$VERSION_END_TAG, PHP_EOL],
+ ['', '', ''],
$data
);
}
$rainTplDir = rtrim($conf->get('resource.raintpl_tpl'), '/');
// Check script and template directories are readable
- foreach ([
- 'application',
- 'inc',
- 'plugins',
- $rainTplDir,
- $rainTplDir . '/' . $conf->get('resource.theme'),
- ] as $path) {
+ foreach (
+ [
+ 'application',
+ 'inc',
+ 'plugins',
+ $rainTplDir,
+ $rainTplDir . '/' . $conf->get('resource.theme'),
+ ] as $path
+ ) {
if (!is_readable(realpath($path))) {
$errors[] = '"' . $path . '" ' . t('directory is not readable');
}
];
} else {
$folders = [
- $conf->get('resource.thumbnails_cache'),
- $conf->get('resource.data_dir'),
- $conf->get('resource.page_cache'),
- $conf->get('resource.raintpl_tmp'),
+ $conf->get('resource.thumbnails_cache'),
+ $conf->get('resource.data_dir'),
+ $conf->get('resource.page_cache'),
+ $conf->get('resource.raintpl_tmp'),
];
}
}
// Check configuration files are readable and writable
- foreach (array(
- $conf->getConfigFileExt(),
- $conf->get('resource.datastore'),
- $conf->get('resource.ban_file'),
- $conf->get('resource.log'),
- $conf->get('resource.update_check'),
- ) as $path) {
+ foreach (
+ [
+ $conf->getConfigFileExt(),
+ $conf->get('resource.datastore'),
+ $conf->get('resource.ban_file'),
+ $conf->get('resource.log'),
+ $conf->get('resource.update_check'),
+ ] as $path
+ ) {
if (!is_file(realpath($path))) {
# the file may not exist yet
continue;
}
foreach (new \DirectoryIterator($path) as $file) {
- if($file->isDot()) {
+ if ($file->isDot()) {
continue;
}
if ($file->isFile()) {
unlink($file->getPathname());
- } elseif($file->isDir()) {
+ } elseif ($file->isDir()) {
$skipped = static::clearFolder($file->getRealPath(), true, $exclude) || $skipped;
}
}
$cleanUrl = $urlObj->idnToAscii();
if (!filter_var($cleanUrl, FILTER_VALIDATE_URL) || !$urlObj->isHttp()) {
- return array(array(0 => 'Invalid HTTP UrlUtils'), false);
+ return [[0 => 'Invalid HTTP UrlUtils'], false];
}
$userAgent =
$ch = curl_init($cleanUrl);
if ($ch === false) {
- return array(array(0 => 'curl_init() error'), false);
+ return [[0 => 'curl_init() error'], false];
}
// General cURL settings
curl_setopt(
$ch,
CURLOPT_HTTPHEADER,
- array('Accept-Language: ' . $acceptLanguage)
+ ['Accept-Language: ' . $acceptLanguage]
);
curl_setopt($ch, CURLOPT_MAXREDIRS, $maxRedirs);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_USERAGENT, $userAgent);
// Max download size management
- curl_setopt($ch, CURLOPT_BUFFERSIZE, 1024*16);
+ curl_setopt($ch, CURLOPT_BUFFERSIZE, 1024 * 16);
curl_setopt($ch, CURLOPT_NOPROGRESS, false);
if (is_callable($curlHeaderFunction)) {
curl_setopt($ch, CURLOPT_HEADERFUNCTION, $curlHeaderFunction);
* Removing this would require updating
* GetHttpUrlTest::testGetInvalidRemoteUrl()
*/
- return array(false, false);
+ return [false, false];
}
- return array(array(0 => 'curl_exec() error: ' . $errorStr), false);
+ return [[0 => 'curl_exec() error: ' . $errorStr], false];
}
// Formatting output like the fallback method
$rawHeadersLastRedir = end($rawHeadersArrayRedirs);
$content = substr($response, $headSize);
- $headers = array();
+ $headers = [];
foreach (preg_split('~[\r\n]+~', $rawHeadersLastRedir) as $line) {
if (empty($line) || ctype_space($line)) {
continue;
$value = $splitLine[1];
if (array_key_exists($key, $headers)) {
if (!is_array($headers[$key])) {
- $headers[$key] = array(0 => $headers[$key]);
+ $headers[$key] = [0 => $headers[$key]];
}
$headers[$key][] = $value;
} else {
}
}
- return array($headers, $content);
+ return [$headers, $content];
}
/**
$acceptLanguage,
$maxRedr
) {
- $options = array(
- 'http' => array(
+ $options = [
+ 'http' => [
'method' => 'GET',
'timeout' => $timeout,
'user_agent' => $userAgent,
'header' => "Accept: */*\r\n"
. 'Accept-Language: ' . $acceptLanguage
- )
- );
+ ]
+ ];
stream_context_set_default($options);
list($headers, $finalUrl) = get_redirected_headers($cleanUrl, $maxRedr);
}
if (! $headers) {
- return array($headers, false);
+ return [$headers, false];
}
try {
$context = stream_context_create($options);
$content = file_get_contents($finalUrl, false, $context, -1, $maxBytes);
} catch (Exception $exc) {
- return array(array(0 => 'HTTP Error'), $exc->getMessage());
+ return [[0 => 'HTTP Error'], $exc->getMessage()];
}
- return array($headers, $content);
+ return [$headers, $content];
}
/**
}
// Headers found, redirection found, and limit not reached.
- if ($redirectionLimit-- > 0
+ if (
+ $redirectionLimit-- > 0
&& !empty($headers)
&& (strpos($headers[0], '301') !== false || strpos($headers[0], '302') !== false)
- && !empty($headers['Location'])) {
+ && !empty($headers['Location'])
+ ) {
$redirection = is_array($headers['Location']) ? end($headers['Location']) : $headers['Location'];
if ($redirection != $url) {
$redirection = getAbsoluteUrl($url, $redirection);
}
}
- return array($headers, $url);
+ return [$headers, $url];
}
/**
}
$parts = parse_url($originalUrl);
- $final = $parts['scheme'] .'://'. $parts['host'];
+ $final = $parts['scheme'] . '://' . $parts['host'];
$final .= (!empty($parts['port'])) ? $parts['port'] : '';
$final .= '/';
if ($newUrl[0] != '/') {
$scheme = 'https';
}
- if (($scheme == 'http' && $port != '80')
+ if (
+ ($scheme == 'http' && $port != '80')
|| ($scheme == 'https' && $port != '443')
) {
$port = ':' . $port;
$host = $server['SERVER_NAME'];
}
- return $scheme.'://'.$host.$port;
+ return $scheme . '://' . $host . $port;
}
// SSL detection
- if ((! empty($server['HTTPS']) && strtolower($server['HTTPS']) == 'on')
- || (isset($server['SERVER_PORT']) && $server['SERVER_PORT'] == '443')) {
+ if (
+ (! empty($server['HTTPS']) && strtolower($server['HTTPS']) == 'on')
+ || (isset($server['SERVER_PORT']) && $server['SERVER_PORT'] == '443')
+ ) {
$scheme = 'https';
}
// Do not append standard port values
- if (($scheme == 'http' && $server['SERVER_PORT'] != '80')
- || ($scheme == 'https' && $server['SERVER_PORT'] != '443')) {
- $port = ':'.$server['SERVER_PORT'];
+ if (
+ ($scheme == 'http' && $server['SERVER_PORT'] != '80')
+ || ($scheme == 'https' && $server['SERVER_PORT'] != '443')
+ ) {
+ $port = ':' . $server['SERVER_PORT'];
}
- return $scheme.'://'.$server['SERVER_NAME'].$port;
+ return $scheme . '://' . $server['SERVER_NAME'] . $port;
}
/**
*
* @return int|bool length of $data or false if we need to stop the download
*/
- return function ($ch, $data) use (
+ return function (
+ $ch,
+ $data
+ ) use (
$retrieveDescription,
$tagsSeparator,
&$charset,
$foundChunk = $currentChunk;
// Keywords use the format tag1, tag2 multiple words, tag
// So we split the result with `,`, then if a tag contains the separator we replace it by `-`.
- $keywords = tags_array2str(array_map(function(string $keyword) use ($tagsSeparator): string {
+ $keywords = tags_array2str(array_map(function (string $keyword) use ($tagsSeparator): string {
return tags_array2str(tags_str2array($keyword, $tagsSeparator), '-');
}, tags_str2array($keywords, ',')), $tagsSeparator);
}
// If we already found either the title, description or keywords,
// it's highly unlikely that we'll found the other metas further than
// in the same chunk of data or the next one. So we also stop the download after that.
- if ((!empty($responseCode) && !empty($contentType) && !empty($charset)) && $foundChunk !== null
+ if (
+ (!empty($responseCode) && !empty($contentType) && !empty($charset)) && $foundChunk !== null
&& (! $retrieveDescription
|| $foundChunk < $currentChunk
|| (!empty($title) && !empty($description) && !empty($keywords))
*/
class Url
{
- private static $annoyingQueryParams = array(
+ private static $annoyingQueryParams = [
// Facebook
'action_object_map=',
'action_ref_map=',
// Other
'campaign_'
- );
+ ];
- private static $annoyingFragments = array(
+ private static $annoyingFragments = [
// ATInternet
'xtor=RSS-',
// Misc.
'tk.rss_all'
- );
+ ];
/*
* URL parts represented as an array
foreach (self::$annoyingQueryParams as $annoying) {
foreach ($queryParams as $param) {
if (startsWith($param, $annoying)) {
- $queryParams = array_diff($queryParams, array($param));
+ $queryParams = array_diff($queryParams, [$param]);
continue;
}
}
<?php
+
/**
* Converts an array-represented URL to a string
*
*/
function unparse_url($parsedUrl)
{
- $scheme = isset($parsedUrl['scheme']) ? $parsedUrl['scheme'].'://' : '';
+ $scheme = isset($parsedUrl['scheme']) ? $parsedUrl['scheme'] . '://' : '';
$host = isset($parsedUrl['host']) ? $parsedUrl['host'] : '';
- $port = isset($parsedUrl['port']) ? ':'.$parsedUrl['port'] : '';
+ $port = isset($parsedUrl['port']) ? ':' . $parsedUrl['port'] : '';
$user = isset($parsedUrl['user']) ? $parsedUrl['user'] : '';
- $pass = isset($parsedUrl['pass']) ? ':'.$parsedUrl['pass'] : '';
+ $pass = isset($parsedUrl['pass']) ? ':' . $parsedUrl['pass'] : '';
$pass = ($user || $pass) ? "$pass@" : '';
$path = isset($parsedUrl['path']) ? $parsedUrl['path'] : '';
- $query = isset($parsedUrl['query']) ? '?'.$parsedUrl['query'] : '';
- $fragment = isset($parsedUrl['fragment']) ? '#'.$parsedUrl['fragment'] : '';
+ $query = isset($parsedUrl['query']) ? '?' . $parsedUrl['query'] : '';
+ $fragment = isset($parsedUrl['fragment']) ? '#' . $parsedUrl['fragment'] : '';
return "$scheme$user$pass$host$port$path$query$fragment";
}
if (!$this->container->loginManager->isLoggedIn()) {
$parameters = $buildParameters($request->getQueryParams(), true);
- return $this->redirect($response, '/login?returnurl='. $this->getBasePath() . $route . $parameters);
+ return $this->redirect($response, '/login?returnurl=' . $this->getBasePath() . $route . $parameters);
}
$parameters = $buildParameters($request->getQueryParams(), false);
}
// Create a dummy database for example
- $this->links = array();
- $link = array(
+ $this->links = [];
+ $link = [
'id' => 1,
'title' => t('The personal, minimalist, super-fast, database free, bookmarking service'),
'url' => 'https://shaarli.readthedocs.io',
'created' => new DateTime(),
'tags' => 'opensource software',
'sticky' => false,
- );
+ ];
$link['shorturl'] = link_small_hash($link['created'], $link['id']);
$this->links[1] = $link;
- $link = array(
+ $link = [
'id' => 0,
'title' => t('My secret stuff... - Pastebin.com'),
'url' => 'http://sebsauvage.net/paste/?8434b27936c09649#bR7XsXhoTiLcqCpQbmOpBi3rq2zzQUC5hBI7ZT1O3x8=',
'created' => new DateTime('1 minute ago'),
'tags' => 'secretstuff',
'sticky' => false,
- );
+ ];
$link['shorturl'] = link_small_hash($link['created'], $link['id']);
$this->links[0] = $link;
{
// Public bookmarks are hidden and user not logged in => nothing to show
if ($this->hidePublicLinks && !$this->loggedIn) {
- $this->links = array();
+ $this->links = [];
return;
}
$this->ids = [];
$this->links = FileUtils::readFlatDB($this->datastore, []);
- $toremove = array();
+ $toremove = [];
foreach ($this->links as $key => &$link) {
if (!$this->loggedIn && $link['private'] != 0) {
// Transition for not upgraded databases.
* @return array filtered bookmarks, all bookmarks if no suitable filter was provided.
*/
public function filterSearch(
- $filterRequest = array(),
+ $filterRequest = [],
$casesensitive = false,
$visibility = 'all',
$untaggedonly = false
*/
public function days()
{
- $linkDays = array();
+ $linkDays = [];
foreach ($this->links as $link) {
$linkDays[$link['created']->format('Ymd')] = 0;
}
return $this->links;
}
- $out = array();
+ $out = [];
foreach ($this->links as $key => $value) {
if ($value['private'] && $visibility === 'private') {
$out[$key] = $value;
*/
private function filterSmallHash($smallHash)
{
- $filtered = array();
+ $filtered = [];
foreach ($this->links as $key => $l) {
if ($smallHash == $l['shorturl']) {
// Yes, this is ugly and slow
return $this->noFilter($visibility);
}
- $filtered = array();
+ $filtered = [];
$search = mb_convert_case(html_entity_decode($searchterms), MB_CASE_LOWER, 'UTF-8');
$exactRegex = '/"([^"]+)"/';
// Retrieve exact search terms.
$explodedSearchAnd = array_values(array_filter($explodedSearchAnd));
// Filter excluding terms and update andSearch.
- $excludeSearch = array();
- $andSearch = array();
+ $excludeSearch = [];
+ $andSearch = [];
foreach ($explodedSearchAnd as $needle) {
if ($needle[0] == '-' && strlen($needle) > 1) {
$excludeSearch[] = substr($needle, 1);
}
}
- $keys = array('title', 'description', 'url', 'tags');
+ $keys = ['title', 'description', 'url', 'tags'];
// Iterate over every stored link.
foreach ($this->links as $id => $link) {
}
// create resulting array
- $filtered = array();
+ $filtered = [];
// iterate over each link
foreach ($this->links as $key => $link) {
$search = $link['tags']; // build search string, start with tags of current link
if (strlen(trim($link['description'])) && strpos($link['description'], '#') !== false) {
// description given and at least one possible tag found
- $descTags = array();
+ $descTags = [];
// find all tags in the form of #tag in the description
preg_match_all(
'/(?<![' . self::$HASHTAG_CHARS . '])#([' . self::$HASHTAG_CHARS . ']+?)\b/sm',
throw new Exception('Invalid date format');
}
- $filtered = array();
+ $filtered = [];
foreach ($this->links as $key => $l) {
if ($l['created']->format('Ymd') == $day) {
$filtered[$key] = $l;
*/
public function update()
{
- $updatesRan = array();
+ $updatesRan = [];
// If the user isn't logged in, exit without updating.
if ($this->isLoggedIn !== true) {
foreach ($this->methods as $method) {
// Not an update method or already done, pass.
- if (!startsWith($method->getName(), 'updateMethod')
+ if (
+ !startsWith($method->getName(), 'updateMethod')
|| in_array($method->getName(), $this->doneUpdates)
) {
continue;
}
// Set sub config keys (config and plugins)
- $subConfig = array('config', 'plugins');
+ $subConfig = ['config', 'plugins'];
foreach ($subConfig as $sub) {
foreach ($oldConfig[$sub] as $key => $value) {
if (isset($legacyMap[$sub . '.' . $key])) {
$save = $this->conf->get('resource.data_dir') . '/datastore.' . date('YmdHis') . '.php';
copy($this->conf->get('resource.datastore'), $save);
- $links = array();
+ $links = [];
foreach ($this->linkDB as $offset => $value) {
$links[] = $value;
unset($this->linkDB[$offset]);
*/
public function updateMethodDownloadSizeAndTimeoutConf()
{
- if ($this->conf->exists('general.download_max_size')
+ if (
+ $this->conf->exists('general.download_max_size')
&& $this->conf->exists('general.download_timeout')
) {
return true;
$indexUrl
) {
// see tpl/export.html for possible values
- if (!in_array($selection, array('all', 'public', 'private'))) {
+ if (!in_array($selection, ['all', 'public', 'private'])) {
throw new Exception(t('Invalid export selection:') . ' "' . $selection . '"');
}
- $bookmarkLinks = array();
+ $bookmarkLinks = [];
foreach ($this->bookmarkService->search([], $selection) as $bookmark) {
$link = $formatter->format($bookmark);
$link['taglist'] = implode(',', $bookmark->getTags());
<?php
+
namespace Shaarli\Plugin;
use Shaarli\Config\ConfigManager;
*
* @var array $loadedPlugins
*/
- private $loadedPlugins = array();
+ private $loadedPlugins = [];
/**
* @var ConfigManager Configuration Manager instance.
public function __construct(&$conf)
{
$this->conf = $conf;
- $this->errors = array();
+ $this->errors = [];
}
/**
*
* @return void
*/
- public function executeHooks($hook, &$data, $params = array())
+ public function executeHooks($hook, &$data, $params = [])
{
$metadataParameters = [
'target' => '_PAGE_',
*/
public function getPluginsMeta()
{
- $metaData = array();
+ $metaData = [];
$dirs = glob(self::$PLUGINS_PATH . '/*', GLOB_ONLYDIR | GLOB_MARK);
// Browse all plugin directories.
if (isset($metaData[$plugin]['parameters'])) {
$params = explode(';', $metaData[$plugin]['parameters']);
} else {
- $params = array();
+ $params = [];
}
- $metaData[$plugin]['parameters'] = array();
+ $metaData[$plugin]['parameters'] = [];
foreach ($params as $param) {
if (empty($param)) {
continue;
<?php
+
namespace Shaarli\Plugin\Exception;
use Exception;
public static function getThemes($tplDir)
{
$tplDir = rtrim($tplDir, '/');
- $allTheme = glob($tplDir.'/*', GLOB_ONLYDIR);
+ $allTheme = glob($tplDir . '/*', GLOB_ONLYDIR);
$themes = [];
foreach ($allTheme as $value) {
- $themes[] = str_replace($tplDir.'/', '', $value);
+ $themes[] = str_replace($tplDir . '/', '', $value);
}
return $themes;
<?php
-
namespace Shaarli\Security;
use Psr\Log\LoggerInterface;
* @param string $banFile Path to the file containing IP bans and failures
* @param LoggerInterface $logger PSR-3 logger to save login attempts in log directory
*/
- public function __construct($trustedProxies, $nbAttempts, $banDuration, $banFile, LoggerInterface $logger) {
+ public function __construct($trustedProxies, $nbAttempts, $banDuration, $banFile, LoggerInterface $logger)
+ {
$this->trustedProxies = $trustedProxies;
$this->nbAttempts = $nbAttempts;
$this->banDuration = $banDuration;
if ($this->failures[$ip] >= $this->nbAttempts) {
$this->bans[$ip] = time() + $this->banDuration;
- $this->logger->info(format_log('IP address banned from login: '. $ip, $ip));
+ $this->logger->info(format_log('IP address banned from login: ' . $ip, $ip));
}
$this->writeBanFile();
}
unset($this->failures[$ip]);
}
unset($this->bans[$ip]);
- $this->logger->info(format_log('Ban lifted for: '. $ip, $ip));
+ $this->logger->info(format_log('Ban lifted for: ' . $ip, $ip));
$this->writeBanFile();
return false;
<?php
+
namespace Shaarli\Security;
use Exception;
// The user client has a valid stay-signed-in cookie
// Session information is updated with the current client information
$this->sessionManager->storeLoginInfo($clientIpId);
- } elseif ($this->sessionManager->hasSessionExpired()
+ } elseif (
+ $this->sessionManager->hasSessionExpired()
|| $this->sessionManager->hasClientIpChanged($clientIpId)
) {
$this->sessionManager->logout();
// Check credentials
try {
$useLdapLogin = !empty($this->configManager->get('ldap.host'));
- if ($login === $this->configManager->get('credentials.login')
+ if (
+ $login === $this->configManager->get('credentials.login')
&& (
(false === $useLdapLogin && $this->checkCredentialsFromLocalConfig($login, $password))
|| (true === $useLdapLogin && $this->checkCredentialsFromLdap($login, $password))
return true;
}
- } catch(Exception $exception) {
+ } catch (Exception $exception) {
$this->logger->info(format_log('Exception while checking credentials: ' . $exception, $clientIpId));
}
*
* @return bool true if the provided credentials are valid, false otherwise
*/
- public function checkCredentialsFromLocalConfig($login, $password) {
+ public function checkCredentialsFromLocalConfig($login, $password)
+ {
$hash = sha1($password . $login . $this->configManager->get('credentials.salt'));
return $login == $this->configManager->get('credentials.login')
*/
public function checkCredentialsFromLdap($login, $password, $connect = null, $bind = null)
{
- $connect = $connect ?? function($host) {
+ $connect = $connect ?? function ($host) {
$resource = ldap_connect($host);
ldap_set_option($resource, LDAP_OPT_PROTOCOL_VERSION, 3);
return $resource;
};
- $bind = $bind ?? function($handle, $dn, $password) {
+ $bind = $bind ?? function ($handle, $dn, $password) {
return ldap_bind($handle, $dn, $password);
};
<?php
+
namespace Shaarli\Security;
use Shaarli\Config\ConfigManager;
*/
public function generateToken()
{
- $token = sha1(uniqid('', true) .'_'. mt_rand() . $this->conf->get('credentials.salt'));
+ $token = sha1(uniqid('', true) . '_' . mt_rand() . $this->conf->get('credentials.salt'));
$this->session['tokens'][$token] = 1;
return $token;
}
foreach ($this->methods as $method) {
// Not an update method or already done, pass.
- if (! startsWith($method->getName(), 'updateMethod')
+ if (
+ ! startsWith($method->getName(), 'updateMethod')
|| in_array($method->getName(), $this->doneUpdates)
) {
continue;
$updated = false;
foreach ($this->bookmarkService->search() as $bookmark) {
- if ($bookmark->isNote()
+ if (
+ $bookmark->isNote()
&& startsWith($bookmark->getUrl(), '?')
&& 1 === preg_match('/^\?([a-zA-Z0-9-_@]{6})($|&|#)/', $bookmark->getUrl(), $match)
) {
return explode(';', $content);
}
}
- return array();
+ return [];
}
/**
$res = file_put_contents($updatesFilepath, implode(';', $updates));
if ($res === false) {
- throw new \Exception('Unable to write updates in '. $updatesFilepath . '.');
+ throw new \Exception('Unable to write updates in ' . $updatesFilepath . '.');
}
}
}
<?php
+
/**
* Shaarli - The personal, minimalist, super-fast, database free, bookmarking service.
*
new Languages(setlocale(LC_MESSAGES, 0), $conf);
$conf->setEmpty('general.timezone', date_default_timezone_get());
-$conf->setEmpty('general.title', t('Shared bookmarks on '). escape(index_url($_SERVER)));
+$conf->setEmpty('general.title', t('Shared bookmarks on ') . escape(index_url($_SERVER)));
-RainTPL::$tpl_dir = $conf->get('resource.raintpl_tpl').'/'.$conf->get('resource.theme').'/'; // template directory
+RainTPL::$tpl_dir = $conf->get('resource.raintpl_tpl') . '/' . $conf->get('resource.theme') . '/'; // template directory
RainTPL::$cache_dir = $conf->get('resource.raintpl_tmp'); // cache directory
date_default_timezone_set($conf->get('general.timezone', 'UTC'));
} catch (Throwable $e) {
die(nl2br(
'An unexpected error happened, and the error template could not be displayed.' . PHP_EOL . PHP_EOL .
- exception2text($e)
+ exception2text($e)
));
}
function hook_addlink_toolbar_render_header($data)
{
if ($data['_PAGE_'] == TemplatePage::LINKLIST && $data['_LOGGEDIN_'] === true) {
- $form = array(
- 'attr' => array(
+ $form = [
+ 'attr' => [
'method' => 'GET',
'action' => $data['_BASE_PATH_'] . '/admin/shaare',
'name' => 'addform',
'class' => 'addform',
- ),
- 'inputs' => array(
- array(
+ ],
+ 'inputs' => [
+ [
'type' => 'text',
'name' => 'post',
'placeholder' => t('URI'),
- ),
- array(
+ ],
+ [
'type' => 'submit',
'value' => t('Add link'),
'class' => 'bigbutton',
- ),
- ),
- );
+ ],
+ ],
+ ];
$data['fields_toolbar'][] = $form;
}
<?php
+
/**
* Plugin Archive.org.
*
{
$params = [];
foreach (DEFAULT_COLORS_PLACEHOLDERS as $placeholder) {
- $value = trim($conf->get('plugins.'. $placeholder, ''));
+ $value = trim($conf->get('plugins.' . $placeholder, ''));
if (strlen($value) > 0) {
$params[$placeholder] = $value;
}
}
if (empty($params)) {
- $error = t('Default colors plugin error: '.
+ $error = t('Default colors plugin error: ' .
'This plugin is active and no custom color is configured.');
return [$error];
}
function hook_default_colors_render_includes($data)
{
$file = PluginManager::$PLUGINS_PATH . '/default_colors/default_colors.css';
- if (file_exists($file )) {
+ if (file_exists($file)) {
$data['css_files'][] = $file ;
}
$content = '';
foreach (DEFAULT_COLORS_PLACEHOLDERS as $rule) {
$content .= !empty($params[$rule])
- ? default_colors_format_css_rule($params, $rule) .';'. PHP_EOL
+ ? default_colors_format_css_rule($params, $rule) . ';' . PHP_EOL
: '';
}
}
$key = str_replace('DEFAULT_COLORS_', '', $parameter);
- $key = str_replace('_', '-', strtolower($key)) .'-color';
- return ' --'. $key .': '. $data[$parameter];
+ $key = str_replace('_', '-', strtolower($key)) . '-color';
+ return ' --' . $key . ': ' . $data[$parameter];
}
<?php
+
/**
* Demo Plugin.
*
* A link is an array of its attributes (key="value"),
* and a mandatory `html` key, which contains its value.
*/
- $button = array(
- 'attr' => array (
+ $button = [
+ 'attr' => [
'href' => '#',
'class' => 'mybutton',
'title' => 'hover me',
- ),
+ ],
'html' => 'DEMO buttons toolbar',
- );
+ ];
$data['buttons_toolbar'][] = $button;
}
* <input input-2-attribute-1="input 2 attribute 1 value">
* </form>
*/
- $form = array(
- 'attr' => array(
+ $form = [
+ 'attr' => [
'method' => 'GET',
'action' => $data['_BASE_PATH_'] . '/',
'class' => 'addform',
- ),
- 'inputs' => array(
- array(
+ ],
+ 'inputs' => [
+ [
'type' => 'text',
'name' => 'demo',
'placeholder' => 'demo',
- )
- )
- );
+ ]
+ ]
+ ];
$data['fields_toolbar'][] = $form;
}
// Another button always displayed
- $button = array(
- 'attr' => array(
+ $button = [
+ 'attr' => [
'href' => '#',
- ),
+ ],
'html' => 'Demo',
- );
+ ];
$data['buttons_toolbar'][] = $button;
return $data;
function hook_demo_plugin_render_footer($data)
{
// Footer text
- $data['text'][] = '<br>'. demo_plugin_t('Shaarli is now enhanced by the awesome demo_plugin.');
+ $data['text'][] = '<br>' . demo_plugin_t('Shaarli is now enhanced by the awesome demo_plugin.');
// Free elements at the end of the page.
$data['endofpage'][] = '<marquee id="demo_marquee">' .
* and a mandatory `html` key, which contains its value.
* It's also recommended to add key 'on' or 'off' for theme rendering.
*/
- $action = array(
- 'attr' => array(
+ $action = [
+ 'attr' => [
'href' => '?up',
'title' => 'Uppercase!',
- ),
+ ],
'html' => '←',
- );
+ ];
if (isset($_GET['up'])) {
// Manipulate link data
function hook_demo_plugin_render_editlink($data)
{
// Load HTML into a string
- $html = file_get_contents(PluginManager::$PLUGINS_PATH .'/demo_plugin/field.html');
+ $html = file_get_contents(PluginManager::$PLUGINS_PATH . '/demo_plugin/field.html');
// Replace value in HTML if it exists in $data
if (!empty($data['link']['stuff'])) {
{
$issoUrl = $conf->get('plugins.ISSO_SERVER');
if (empty($issoUrl)) {
- $error = t('Isso plugin error: '.
+ $error = t('Isso plugin error: ' .
'Please define the "ISSO_SERVER" setting in the plugin administration page.');
- return array($error);
+ return [$error];
}
}
$isso = sprintf($issoHtml, $issoUrl, $issoUrl, $link['id'], $link['id']);
$data['plugin_end_zone'][] = $isso;
} else {
- $button = '<span><a href="'. ($data['_BASE_PATH_'] ?? '') . '/shaare/%s#isso-thread">';
+ $button = '<span><a href="' . ($data['_BASE_PATH_'] ?? '') . '/shaare/%s#isso-thread">';
// For the default theme we use a FontAwesome icon which is better than an image
if ($conf->get('resource.theme') === 'default') {
$button .= '<i class="linklist-plugin-icon fa fa-comment"></i>';
} else {
- $button .= '<img class="linklist-plugin-icon" src="'. $data['_ROOT_PATH_'].'/plugins/isso/comment.png" ';
+ $button .= '<img class="linklist-plugin-icon" src="' . $data['_ROOT_PATH_'] . '/plugins/isso/comment.png" ';
$button .= 'title="Comment on this shaare" alt="Comments" />';
}
$button .= '</a></span>';
<?php
+
/**
* Piwik plugin.
* Adds tracking code on each page.
if (empty($piwikUrl) || empty($piwikSiteid)) {
$error = t('Piwik plugin error: ' .
'Please define PIWIK_URL and PIWIK_SITEID in the plugin administration page.');
- return array($error);
+ return [$error];
}
}
<?php
+
/**
* Plugin PlayVideos
*
function hook_playvideos_render_header($data)
{
if ($data['_PAGE_'] == TemplatePage::LINKLIST) {
- $playvideo = array(
- 'attr' => array(
+ $playvideo = [
+ 'attr' => [
'href' => '#',
'title' => t('Video player'),
'id' => 'playvideos',
- ),
- 'html' => '► '. t('Play Videos')
- );
+ ],
+ 'html' => '► ' . t('Play Videos')
+ ];
$data['buttons_toolbar'][] = $playvideo;
}
function hook_pubsubhubbub_render_feed($data, $conf)
{
$feedType = $data['_PAGE_'] == TemplatePage::FEED_RSS ? FeedBuilder::$FEED_RSS : FeedBuilder::$FEED_ATOM;
- $template = file_get_contents(PluginManager::$PLUGINS_PATH . '/pubsubhubbub/hub.'. $feedType .'.xml');
+ $template = file_get_contents(PluginManager::$PLUGINS_PATH . '/pubsubhubbub/hub.' . $feedType . '.xml');
$data['feed_plugins_header'][] = sprintf($template, $conf->get('plugins.PUBSUBHUB_URL'));
return $data;
*/
function hook_pubsubhubbub_save_link($data, $conf)
{
- $feeds = array(
- index_url($_SERVER) .'feed/atom',
- index_url($_SERVER) .'feed/rss',
- );
+ $feeds = [
+ index_url($_SERVER) . 'feed/atom',
+ index_url($_SERVER) . 'feed/rss',
+ ];
$httpPost = function_exists('curl_version') ? false : 'nocurl_http_post';
try {
*/
function nocurl_http_post($url, $postString)
{
- $params = array('http' => array(
+ $params = ['http' => [
'method' => 'POST',
'content' => $postString,
'user_agent' => 'PubSubHubbub-Publisher-PHP/1.0',
- ));
+ ]];
$context = stream_context_create($params);
$fp = @fopen($url, 'rb', false, $context);
<?php
+
/**
* Plugin qrcode
* Add QRCode containing URL for each links.
<?php
+
namespace Shaarli\Plugin\Wallabag;
/**
* - key: version ID, must match plugin settings.
* - value: version name.
*/
- private static $wallabagVersions = array(
+ private static $wallabagVersions = [
1 => '1.x',
2 => '2.x',
- );
+ ];
/**
* @var array Static reference to WB endpoint according to the API version.
* - key: version name.
* - value: endpoint.
*/
- private static $wallabagEndpoints = array(
+ private static $wallabagEndpoints = [
'1.x' => '?plainurl=',
'2.x' => 'bookmarklet?url=',
- );
+ ];
/**
* @var string Wallabag user instance URL.
<?php
+
/**
* Wallabag plugin
*/
{
$wallabagUrl = $conf->get('plugins.WALLABAG_URL');
if (empty($wallabagUrl)) {
- $error = t('Wallabag plugin error: '.
+ $error = t('Wallabag plugin error: ' .
'Please define the "WALLABAG_URL" setting in the plugin administration page.');
- return array($error);
+ return [$error];
}
$conf->setEmpty('plugins.WALLABAG_URL', '2');
}