init
This commit is contained in:
@@ -0,0 +1,21 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<extension type="plugin" group="system" method="upgrade">
|
||||
<name>plg_system_highlight</name>
|
||||
<author>Joomla! Project</author>
|
||||
<creationDate>2011-08</creationDate>
|
||||
<copyright>(C) 2011 Open Source Matters, Inc.</copyright>
|
||||
<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
|
||||
<authorEmail>admin@joomla.org</authorEmail>
|
||||
<authorUrl>www.joomla.org</authorUrl>
|
||||
<version>3.0.0</version>
|
||||
<description>PLG_SYSTEM_HIGHLIGHT_XML_DESCRIPTION</description>
|
||||
<namespace path="src">Joomla\Plugin\System\Highlight</namespace>
|
||||
<files>
|
||||
<folder plugin="highlight">services</folder>
|
||||
<folder>src</folder>
|
||||
</files>
|
||||
<languages>
|
||||
<language tag="en-GB">language/en-GB/plg_system_highlight.ini</language>
|
||||
<language tag="en-GB">language/en-GB/plg_system_highlight.sys.ini</language>
|
||||
</languages>
|
||||
</extension>
|
||||
@@ -0,0 +1,42 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* @package Joomla.Plugin
|
||||
* @subpackage System.highlight
|
||||
*
|
||||
* @copyright (C) 2023 Open Source Matters, Inc. <https://www.joomla.org>
|
||||
* @license GNU General Public License version 2 or later; see LICENSE.txt
|
||||
*/
|
||||
|
||||
\defined('_JEXEC') or die;
|
||||
|
||||
use Joomla\CMS\Extension\PluginInterface;
|
||||
use Joomla\CMS\Plugin\PluginHelper;
|
||||
use Joomla\DI\Container;
|
||||
use Joomla\DI\ServiceProviderInterface;
|
||||
use Joomla\Plugin\System\Highlight\Extension\Highlight;
|
||||
|
||||
return new class () implements ServiceProviderInterface {
|
||||
/**
|
||||
* Registers the service provider with a DI container.
|
||||
*
|
||||
* @param Container $container The DI container.
|
||||
*
|
||||
* @return void
|
||||
*
|
||||
* @since 4.4.0
|
||||
*/
|
||||
public function register(Container $container): void
|
||||
{
|
||||
$container->set(
|
||||
PluginInterface::class,
|
||||
$container->lazy(Highlight::class, function (Container $container) {
|
||||
$plugin = new Highlight(
|
||||
(array) PluginHelper::getPlugin('system', 'highlight')
|
||||
);
|
||||
|
||||
return $plugin;
|
||||
})
|
||||
);
|
||||
}
|
||||
};
|
||||
@@ -0,0 +1,151 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* @package Joomla.Plugin
|
||||
* @subpackage System.highlight
|
||||
*
|
||||
* @copyright (C) 2011 Open Source Matters, Inc. <https://www.joomla.org>
|
||||
* @license GNU General Public License version 2 or later; see LICENSE.txt
|
||||
*/
|
||||
|
||||
namespace Joomla\Plugin\System\Highlight\Extension;
|
||||
|
||||
use Joomla\CMS\Component\ComponentHelper;
|
||||
use Joomla\CMS\Event\Application\AfterDispatchEvent;
|
||||
use Joomla\CMS\Event\Finder\ResultEvent;
|
||||
use Joomla\CMS\Filter\InputFilter;
|
||||
use Joomla\CMS\Plugin\CMSPlugin;
|
||||
use Joomla\CMS\Uri\Uri;
|
||||
use Joomla\Event\SubscriberInterface;
|
||||
|
||||
// phpcs:disable PSR1.Files.SideEffects
|
||||
\defined('_JEXEC') or die;
|
||||
// phpcs:enable PSR1.Files.SideEffects
|
||||
|
||||
/**
|
||||
* System plugin to highlight terms.
|
||||
*
|
||||
* @since 2.5
|
||||
*/
|
||||
final class Highlight extends CMSPlugin implements SubscriberInterface
|
||||
{
|
||||
/**
|
||||
* Returns an array of events this subscriber will listen to.
|
||||
*
|
||||
* @return array
|
||||
*
|
||||
* @since 5.3.0
|
||||
*/
|
||||
public static function getSubscribedEvents(): array
|
||||
{
|
||||
return [
|
||||
'onAfterDispatch' => 'onAfterDispatch',
|
||||
'onFinderResult' => 'onFinderResult',
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Method to catch the onAfterDispatch event.
|
||||
*
|
||||
* This is where we setup the click-through content highlighting for.
|
||||
* The highlighting is done with JavaScript so we just
|
||||
* need to check a few parameters and the JHtml behavior will do the rest.
|
||||
*
|
||||
* @param AfterDispatchEvent $event The event object
|
||||
*
|
||||
* @return void
|
||||
*
|
||||
* @since 2.5
|
||||
*/
|
||||
public function onAfterDispatch(AfterDispatchEvent $event): void
|
||||
{
|
||||
// Check that we are in the site application.
|
||||
if (!$event->getApplication()->isClient('site')) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Set the variables.
|
||||
$input = $event->getApplication()->getInput();
|
||||
$extension = $input->get('option', '', 'cmd');
|
||||
|
||||
// Check if the highlighter is enabled.
|
||||
if (!ComponentHelper::getParams($extension)->get('highlight_terms', 1)) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Check if the highlighter should be activated in this environment.
|
||||
if ($input->get('tmpl', '', 'cmd') === 'component' || $event->getApplication()->getDocument()->getType() !== 'html') {
|
||||
return;
|
||||
}
|
||||
|
||||
// Get the terms to highlight from the request.
|
||||
$terms = $input->request->get('highlight', null, 'base64');
|
||||
$terms = $terms ? json_decode(base64_decode($terms)) : null;
|
||||
|
||||
// Check the terms.
|
||||
if (empty($terms)) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Clean the terms array.
|
||||
$filter = InputFilter::getInstance();
|
||||
|
||||
$cleanTerms = [];
|
||||
|
||||
foreach ($terms as $term) {
|
||||
$cleanTerms[] = htmlspecialchars($filter->clean($term, 'string'));
|
||||
}
|
||||
|
||||
/** @var \Joomla\CMS\Document\HtmlDocument $doc */
|
||||
$doc = $event->getApplication()->getDocument();
|
||||
|
||||
// Activate the highlighter.
|
||||
if (!empty($cleanTerms)) {
|
||||
$doc->getWebAssetManager()->useScript('highlight');
|
||||
$doc->addScriptOptions(
|
||||
'highlight',
|
||||
[[
|
||||
'class' => 'js-highlight',
|
||||
'highLight' => $cleanTerms,
|
||||
]]
|
||||
);
|
||||
}
|
||||
|
||||
// Adjust the component buffer.
|
||||
$buf = $doc->getBuffer('component');
|
||||
$buf = '<div class="js-highlight">' . $buf . '</div>';
|
||||
$doc->setBuffer($buf, 'component');
|
||||
}
|
||||
|
||||
/**
|
||||
* Method to catch the onFinderResult event.
|
||||
*
|
||||
* @param ResultEvent $event The event object
|
||||
*
|
||||
* @return void
|
||||
*
|
||||
* @since 4.0.0
|
||||
*/
|
||||
public function onFinderResult(ResultEvent $event): void
|
||||
{
|
||||
static $params;
|
||||
|
||||
if (\is_null($params)) {
|
||||
$params = ComponentHelper::getParams('com_finder');
|
||||
}
|
||||
|
||||
$item = $event->getItem();
|
||||
$query = $event->getQuery();
|
||||
|
||||
// Get the route with highlighting information.
|
||||
if (
|
||||
!empty($query->highlight)
|
||||
&& empty($item->mime)
|
||||
&& $params->get('highlight_terms', 1)
|
||||
) {
|
||||
$uri = new Uri($item->route);
|
||||
$uri->setVar('highlight', base64_encode(json_encode(\array_slice($query->highlight, 0, 10))));
|
||||
$item->route = $uri->toString();
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user