Fix plugin base path in core plugins
Also fix note check in archiveorg plugin, and regression on vintage template. Documentation regarding relative path has been added. Fixes #1548
This commit is contained in:
parent
0d930454a2
commit
76fe68d924
7 changed files with 61 additions and 27 deletions
|
@ -139,6 +139,20 @@ Each file contain two keys:
|
||||||
|
|
||||||
> Note: In PHP, `parse_ini_file()` seems to want strings to be between by quotes `"` in the ini file.
|
> Note: In PHP, `parse_ini_file()` seems to want strings to be between by quotes `"` in the ini file.
|
||||||
|
|
||||||
|
### Understanding relative paths
|
||||||
|
|
||||||
|
Because Shaarli is a self-hosted tool, an instance can either be installed at the root directory, or under a subfolder.
|
||||||
|
This means that you can *never* use absolute paths (eg `/plugins/mything/file.png`).
|
||||||
|
|
||||||
|
If a file needs to be included in server end, use simple relative path:
|
||||||
|
`PluginManager::$PLUGINS_PATH . '/mything/template.html'`.
|
||||||
|
|
||||||
|
If it needs to be included in front end side (e.g. an image),
|
||||||
|
the relative path must be prefixed with special data `_BASE_PATH_`:
|
||||||
|
`($data['_BASE_PATH_'] ?? '') . '/' . PluginManager::$PLUGINS_PATH . '/mything/picture.png`.
|
||||||
|
|
||||||
|
Note that special placeholders for CSS and JS files (respectively `css_files` and `js_files`) are already prefixed
|
||||||
|
with the base path in template files.
|
||||||
|
|
||||||
### It's not working!
|
### It's not working!
|
||||||
|
|
||||||
|
|
|
@ -20,10 +20,12 @@ function hook_archiveorg_render_linklist($data)
|
||||||
$path = ($data['_BASE_PATH_'] ?? '') . '/' . PluginManager::$PLUGINS_PATH;
|
$path = ($data['_BASE_PATH_'] ?? '') . '/' . PluginManager::$PLUGINS_PATH;
|
||||||
|
|
||||||
foreach ($data['links'] as &$value) {
|
foreach ($data['links'] as &$value) {
|
||||||
if ($value['private'] && preg_match('/^\?[a-zA-Z0-9-_@]{6}($|&|#)/', $value['real_url'])) {
|
$isNote = startsWith($value['real_url'], '/shaare/');
|
||||||
|
if ($value['private'] && $isNote) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
$archive = sprintf($archive_html, $value['url'], $path, t('View on archive.org'));
|
$url = $isNote ? rtrim(index_url($_SERVER), '/') . $value['real_url'] : $value['real_url'];
|
||||||
|
$archive = sprintf($archive_html, $url, $path, t('View on archive.org'));
|
||||||
$value['link_plugin'][] = $archive;
|
$value['link_plugin'][] = $archive;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -49,7 +49,7 @@ function hook_isso_render_linklist($data, $conf)
|
||||||
$isso = sprintf($issoHtml, $issoUrl, $issoUrl, $link['id'], $link['id']);
|
$isso = sprintf($issoHtml, $issoUrl, $issoUrl, $link['id'], $link['id']);
|
||||||
$data['plugin_end_zone'][] = $isso;
|
$data['plugin_end_zone'][] = $isso;
|
||||||
} else {
|
} else {
|
||||||
$button = '<span><a href="?%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
|
// For the default theme we use a FontAwesome icon which is better than an image
|
||||||
if ($conf->get('resource.theme') === 'default') {
|
if ($conf->get('resource.theme') === 'default') {
|
||||||
$button .= '<i class="linklist-plugin-icon fa fa-comment"></i>';
|
$button .= '<i class="linklist-plugin-icon fa fa-comment"></i>';
|
||||||
|
|
|
@ -42,7 +42,7 @@ function hook_qrcode_render_linklist($data)
|
||||||
function hook_qrcode_render_footer($data)
|
function hook_qrcode_render_footer($data)
|
||||||
{
|
{
|
||||||
if ($data['_PAGE_'] == TemplatePage::LINKLIST) {
|
if ($data['_PAGE_'] == TemplatePage::LINKLIST) {
|
||||||
$data['js_files'][] = ($data['_BASE_PATH_'] ?? '') . '/' . PluginManager::$PLUGINS_PATH . '/qrcode/shaarli-qrcode.js';
|
$data['js_files'][] = PluginManager::$PLUGINS_PATH . '/qrcode/shaarli-qrcode.js';
|
||||||
}
|
}
|
||||||
|
|
||||||
return $data;
|
return $data;
|
||||||
|
@ -58,7 +58,7 @@ function hook_qrcode_render_footer($data)
|
||||||
function hook_qrcode_render_includes($data)
|
function hook_qrcode_render_includes($data)
|
||||||
{
|
{
|
||||||
if ($data['_PAGE_'] == TemplatePage::LINKLIST) {
|
if ($data['_PAGE_'] == TemplatePage::LINKLIST) {
|
||||||
$data['css_files'][] = ($data['_BASE_PATH_'] ?? '') . '/' . PluginManager::$PLUGINS_PATH . '/qrcode/qrcode.css';
|
$data['css_files'][] = PluginManager::$PLUGINS_PATH . '/qrcode/qrcode.css';
|
||||||
}
|
}
|
||||||
|
|
||||||
return $data;
|
return $data;
|
||||||
|
|
|
@ -1,10 +1,12 @@
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
namespace Shaarli\Plugin\Archiveorg;
|
namespace Shaarli\Plugin\Archiveorg;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* PluginArchiveorgTest.php
|
* PluginArchiveorgTest.php
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
use PHPUnit\Framework\TestCase;
|
||||||
use Shaarli\Plugin\PluginManager;
|
use Shaarli\Plugin\PluginManager;
|
||||||
|
|
||||||
require_once 'plugins/archiveorg/archiveorg.php';
|
require_once 'plugins/archiveorg/archiveorg.php';
|
||||||
|
@ -13,20 +15,35 @@
|
||||||
* Class PluginArchiveorgTest
|
* Class PluginArchiveorgTest
|
||||||
* Unit test for the archiveorg plugin
|
* Unit test for the archiveorg plugin
|
||||||
*/
|
*/
|
||||||
class PluginArchiveorgTest extends \PHPUnit\Framework\TestCase
|
class PluginArchiveorgTest extends TestCase
|
||||||
{
|
{
|
||||||
|
protected $savedScriptName;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Reset plugin path
|
* Reset plugin path
|
||||||
*/
|
*/
|
||||||
public function setUp()
|
public function setUp(): void
|
||||||
{
|
{
|
||||||
PluginManager::$PLUGINS_PATH = 'plugins';
|
PluginManager::$PLUGINS_PATH = 'plugins';
|
||||||
|
|
||||||
|
// plugins manipulate global vars
|
||||||
|
$_SERVER['SERVER_PORT'] = '80';
|
||||||
|
$_SERVER['SERVER_NAME'] = 'shaarli.shaarli';
|
||||||
|
$this->savedScriptName = $_SERVER['SCRIPT_NAME'] ?? null;
|
||||||
|
$_SERVER['SCRIPT_NAME'] = '/index.php';
|
||||||
|
}
|
||||||
|
|
||||||
|
public function tearDown(): void
|
||||||
|
{
|
||||||
|
unset($_SERVER['SERVER_PORT']);
|
||||||
|
unset($_SERVER['SERVER_NAME']);
|
||||||
|
$_SERVER['SCRIPT_NAME'] = $this->savedScriptName;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Test render_linklist hook on external bookmarks.
|
* Test render_linklist hook on external bookmarks.
|
||||||
*/
|
*/
|
||||||
public function testArchiveorgLinklistOnExternalLinks()
|
public function testArchiveorgLinklistOnExternalLinks(): void
|
||||||
{
|
{
|
||||||
$str = 'http://randomstr.com/test';
|
$str = 'http://randomstr.com/test';
|
||||||
|
|
||||||
|
@ -56,16 +73,16 @@ public function testArchiveorgLinklistOnExternalLinks()
|
||||||
/**
|
/**
|
||||||
* Test render_linklist hook on internal bookmarks.
|
* Test render_linklist hook on internal bookmarks.
|
||||||
*/
|
*/
|
||||||
public function testArchiveorgLinklistOnInternalLinks()
|
public function testArchiveorgLinklistOnInternalLinks(): void
|
||||||
{
|
{
|
||||||
$internalLink1 = 'http://shaarli.shaarli/?qvMAqg';
|
$internalLink1 = 'http://shaarli.shaarli/shaare/qvMAqg';
|
||||||
$internalLinkRealURL1 = '?qvMAqg';
|
$internalLinkRealURL1 = '/shaare/qvMAqg';
|
||||||
|
|
||||||
$internalLink2 = 'http://shaarli.shaarli/?2_7zww';
|
$internalLink2 = 'http://shaarli.shaarli/shaare/2_7zww';
|
||||||
$internalLinkRealURL2 = '?2_7zww';
|
$internalLinkRealURL2 = '/shaare/2_7zww';
|
||||||
|
|
||||||
$internalLink3 = 'http://shaarli.shaarli/?z7u-_Q';
|
$internalLink3 = 'http://shaarli.shaarli/shaare/z7u-_Q';
|
||||||
$internalLinkRealURL3 = '?z7u-_Q';
|
$internalLinkRealURL3 = '/shaare/z7u-_Q';
|
||||||
|
|
||||||
$data = array(
|
$data = array(
|
||||||
'title' => $internalLink1,
|
'title' => $internalLink1,
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
namespace Shaarli\Plugin\Isso;
|
namespace Shaarli\Plugin\Isso;
|
||||||
|
|
||||||
use DateTime;
|
use DateTime;
|
||||||
|
use PHPUnit\Framework\TestCase;
|
||||||
use Shaarli\Bookmark\Bookmark;
|
use Shaarli\Bookmark\Bookmark;
|
||||||
use Shaarli\Config\ConfigManager;
|
use Shaarli\Config\ConfigManager;
|
||||||
use Shaarli\Plugin\PluginManager;
|
use Shaarli\Plugin\PluginManager;
|
||||||
|
@ -13,12 +14,12 @@
|
||||||
*
|
*
|
||||||
* Test the Isso plugin (comment system).
|
* Test the Isso plugin (comment system).
|
||||||
*/
|
*/
|
||||||
class PluginIssoTest extends \PHPUnit\Framework\TestCase
|
class PluginIssoTest extends TestCase
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
* Reset plugin path
|
* Reset plugin path
|
||||||
*/
|
*/
|
||||||
public function setUp()
|
public function setUp(): void
|
||||||
{
|
{
|
||||||
PluginManager::$PLUGINS_PATH = 'plugins';
|
PluginManager::$PLUGINS_PATH = 'plugins';
|
||||||
}
|
}
|
||||||
|
@ -26,7 +27,7 @@ public function setUp()
|
||||||
/**
|
/**
|
||||||
* Test Isso init without errors.
|
* Test Isso init without errors.
|
||||||
*/
|
*/
|
||||||
public function testIssoInitNoError()
|
public function testIssoInitNoError(): void
|
||||||
{
|
{
|
||||||
$conf = new ConfigManager('');
|
$conf = new ConfigManager('');
|
||||||
$conf->set('plugins.ISSO_SERVER', 'value');
|
$conf->set('plugins.ISSO_SERVER', 'value');
|
||||||
|
@ -37,7 +38,7 @@ public function testIssoInitNoError()
|
||||||
/**
|
/**
|
||||||
* Test Isso init with errors.
|
* Test Isso init with errors.
|
||||||
*/
|
*/
|
||||||
public function testIssoInitError()
|
public function testIssoInitError(): void
|
||||||
{
|
{
|
||||||
$conf = new ConfigManager('');
|
$conf = new ConfigManager('');
|
||||||
$errors = isso_init($conf);
|
$errors = isso_init($conf);
|
||||||
|
@ -47,7 +48,7 @@ public function testIssoInitError()
|
||||||
/**
|
/**
|
||||||
* Test render_linklist hook with valid settings to display the comment form.
|
* Test render_linklist hook with valid settings to display the comment form.
|
||||||
*/
|
*/
|
||||||
public function testIssoDisplayed()
|
public function testIssoDisplayed(): void
|
||||||
{
|
{
|
||||||
$conf = new ConfigManager('');
|
$conf = new ConfigManager('');
|
||||||
$conf->set('plugins.ISSO_SERVER', 'value');
|
$conf->set('plugins.ISSO_SERVER', 'value');
|
||||||
|
@ -87,7 +88,7 @@ public function testIssoDisplayed()
|
||||||
/**
|
/**
|
||||||
* Test isso plugin when multiple bookmarks are displayed (shouldn't be displayed).
|
* Test isso plugin when multiple bookmarks are displayed (shouldn't be displayed).
|
||||||
*/
|
*/
|
||||||
public function testIssoMultipleLinks()
|
public function testIssoMultipleLinks(): void
|
||||||
{
|
{
|
||||||
$conf = new ConfigManager('');
|
$conf = new ConfigManager('');
|
||||||
$conf->set('plugins.ISSO_SERVER', 'value');
|
$conf->set('plugins.ISSO_SERVER', 'value');
|
||||||
|
@ -115,14 +116,14 @@ public function testIssoMultipleLinks()
|
||||||
|
|
||||||
$processed = hook_isso_render_linklist($data, $conf);
|
$processed = hook_isso_render_linklist($data, $conf);
|
||||||
// link_plugin should be added for the icon
|
// link_plugin should be added for the icon
|
||||||
$this->assertContains('<a href="?'. $short1 .'#isso-thread">', $processed['links'][0]['link_plugin'][0]);
|
$this->assertContains('<a href="/shaare/'. $short1 .'#isso-thread">', $processed['links'][0]['link_plugin'][0]);
|
||||||
$this->assertContains('<a href="?'. $short2 .'#isso-thread">', $processed['links'][1]['link_plugin'][0]);
|
$this->assertContains('<a href="/shaare/'. $short2 .'#isso-thread">', $processed['links'][1]['link_plugin'][0]);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Test isso plugin when using search (shouldn't be displayed).
|
* Test isso plugin when using search (shouldn't be displayed).
|
||||||
*/
|
*/
|
||||||
public function testIssoNotDisplayedWhenSearch()
|
public function testIssoNotDisplayedWhenSearch(): void
|
||||||
{
|
{
|
||||||
$conf = new ConfigManager('');
|
$conf = new ConfigManager('');
|
||||||
$conf->set('plugins.ISSO_SERVER', 'value');
|
$conf->set('plugins.ISSO_SERVER', 'value');
|
||||||
|
@ -145,13 +146,13 @@ public function testIssoNotDisplayedWhenSearch()
|
||||||
$processed = hook_isso_render_linklist($data, $conf);
|
$processed = hook_isso_render_linklist($data, $conf);
|
||||||
|
|
||||||
// link_plugin should be added for the icon
|
// link_plugin should be added for the icon
|
||||||
$this->assertContains('<a href="?'. $short1 .'#isso-thread">', $processed['links'][0]['link_plugin'][0]);
|
$this->assertContains('<a href="/shaare/'. $short1 .'#isso-thread">', $processed['links'][0]['link_plugin'][0]);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Test isso plugin without server configuration (shouldn't be displayed).
|
* Test isso plugin without server configuration (shouldn't be displayed).
|
||||||
*/
|
*/
|
||||||
public function testIssoWithoutConf()
|
public function testIssoWithoutConf(): void
|
||||||
{
|
{
|
||||||
$data = 'abc';
|
$data = 'abc';
|
||||||
$conf = new ConfigManager('');
|
$conf = new ConfigManager('');
|
||||||
|
|
|
@ -32,6 +32,6 @@
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
{if="$previous_page_url"} <a href="{$previous_page_url}" class="paging_older">◄Older</a> {/if}
|
{if="$previous_page_url"} <a href="{$previous_page_url}" class="paging_older">◄Older</a> {/if}
|
||||||
<div class="paging_current">page {$page_current} / {$page_max} </div>
|
{if="$page_max>1"}<div class="paging_current">page {$page_current} / {$page_max} </div>{/if}
|
||||||
{if="$next_page_url"} <a href="{$next_page_url}" class="paging_newer">Newer►</a> {/if}
|
{if="$next_page_url"} <a href="{$next_page_url}" class="paging_newer">Newer►</a> {/if}
|
||||||
</div>
|
</div>
|
||||||
|
|
Loading…
Reference in a new issue