Plugin to allow visitor contributions to WordPress posts, wiki style.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

488 lines
9.9 KiB

<?php
namespace Caxy\HtmlDiff;
/**
* Class HtmlDiffConfig
* @package Caxy\HtmlDiff
*/
class HtmlDiffConfig
{
/**
* @var array
*/
protected $specialCaseTags = array('strong', 'b', 'i', 'big', 'small', 'u', 'sub', 'sup', 'strike', 's', 'p');
/**
* @var array
*/
protected $specialCaseChars = array('.', ',', '(', ')', '\'');
/**
* @var bool
*/
protected $groupDiffs = true;
/**
* @var bool
*/
protected $insertSpaceInReplace = false;
/**
* @var string
*/
protected $encoding = 'UTF-8';
/**
* @var array
*/
protected $isolatedDiffTags = array(
'ol' => '[[REPLACE_ORDERED_LIST]]',
'ul' => '[[REPLACE_UNORDERED_LIST]]',
'sub' => '[[REPLACE_SUB_SCRIPT]]',
'sup' => '[[REPLACE_SUPER_SCRIPT]]',
'dl' => '[[REPLACE_DEFINITION_LIST]]',
'table' => '[[REPLACE_TABLE]]',
'strong' => '[[REPLACE_STRONG]]',
'b' => '[[REPLACE_B]]',
'em' => '[[REPLACE_EM]]',
'i' => '[[REPLACE_I]]',
'a' => '[[REPLACE_A]]',
);
/**
* @var int
*/
protected $matchThreshold = 80;
/**
* @var array
*/
protected $specialCaseOpeningTags = array();
/**
* @var array
*/
protected $specialCaseClosingTags = array();
/**
* @var bool
*/
protected $useTableDiffing = true;
/**
* @var null|\Doctrine\Common\Cache\Cache
*/
protected $cacheProvider;
/**
* @var null|string
*/
protected $purifierCacheLocation = null;
/**
* @return HtmlDiffConfig
*/
public static function create()
{
return new self();
}
/**
* HtmlDiffConfig constructor.
*/
public function __construct()
{
$this->setSpecialCaseTags($this->specialCaseTags);
}
/**
* @return int
*/
public function getMatchThreshold()
{
return $this->matchThreshold;
}
/**
* @param int $matchThreshold
*
* @return AbstractDiff
*/
public function setMatchThreshold($matchThreshold)
{
$this->matchThreshold = $matchThreshold;
return $this;
}
/**
* @param array $chars
*/
public function setSpecialCaseChars(array $chars)
{
$this->specialCaseChars = $chars;
}
/**
* @return array|null
*/
public function getSpecialCaseChars()
{
return $this->specialCaseChars;
}
/**
* @param string $char
*
* @return $this
*/
public function addSpecialCaseChar($char)
{
if (!in_array($char, $this->specialCaseChars)) {
$this->specialCaseChars[] = $char;
}
return $this;
}
/**
* @param string $char
*
* @return $this
*/
public function removeSpecialCaseChar($char)
{
$key = array_search($char, $this->specialCaseChars);
if ($key !== false) {
unset($this->specialCaseChars[$key]);
}
return $this;
}
/**
* @param array $tags
*
* @return $this
*/
public function setSpecialCaseTags(array $tags = array())
{
$this->specialCaseTags = $tags;
$this->specialCaseOpeningTags = array();
$this->specialCaseClosingTags = array();
foreach ($this->specialCaseTags as $tag) {
$this->addSpecialCaseTag($tag);
}
return $this;
}
/**
* @param string $tag
*
* @return $this
*/
public function addSpecialCaseTag($tag)
{
if (!in_array($tag, $this->specialCaseTags)) {
$this->specialCaseTags[] = $tag;
}
$opening = $this->getOpeningTag($tag);
$closing = $this->getClosingTag($tag);
if (!in_array($opening, $this->specialCaseOpeningTags)) {
$this->specialCaseOpeningTags[] = $opening;
}
if (!in_array($closing, $this->specialCaseClosingTags)) {
$this->specialCaseClosingTags[] = $closing;
}
return $this;
}
/**
* @param string $tag
*
* @return $this
*/
public function removeSpecialCaseTag($tag)
{
if (($key = array_search($tag, $this->specialCaseTags)) !== false) {
unset($this->specialCaseTags[$key]);
$opening = $this->getOpeningTag($tag);
$closing = $this->getClosingTag($tag);
if (($key = array_search($opening, $this->specialCaseOpeningTags)) !== false) {
unset($this->specialCaseOpeningTags[$key]);
}
if (($key = array_search($closing, $this->specialCaseClosingTags)) !== false) {
unset($this->specialCaseClosingTags[$key]);
}
}
return $this;
}
/**
* @return array|null
*/
public function getSpecialCaseTags()
{
return $this->specialCaseTags;
}
/**
* @return boolean
*/
public function isGroupDiffs()
{
return $this->groupDiffs;
}
/**
* @param boolean $groupDiffs
*
* @return HtmlDiffConfig
*/
public function setGroupDiffs($groupDiffs)
{
$this->groupDiffs = $groupDiffs;
return $this;
}
/**
* @return string
*/
public function getEncoding()
{
return $this->encoding;
}
/**
* @param string $encoding
*
* @return HtmlDiffConfig
*/
public function setEncoding($encoding)
{
$this->encoding = $encoding;
return $this;
}
/**
* @return boolean
*/
public function isInsertSpaceInReplace()
{
return $this->insertSpaceInReplace;
}
/**
* @param boolean $insertSpaceInReplace
*
* @return HtmlDiffConfig
*/
public function setInsertSpaceInReplace($insertSpaceInReplace)
{
$this->insertSpaceInReplace = $insertSpaceInReplace;
return $this;
}
/**
* @return array
*/
public function getIsolatedDiffTags()
{
return $this->isolatedDiffTags;
}
/**
* @param array $isolatedDiffTags
*
* @return HtmlDiffConfig
*/
public function setIsolatedDiffTags($isolatedDiffTags)
{
$this->isolatedDiffTags = $isolatedDiffTags;
return $this;
}
/**
* @param string $tag
* @param null|string $placeholder
*
* @return $this
*/
public function addIsolatedDiffTag($tag, $placeholder = null)
{
if (null === $placeholder) {
$placeholder = sprintf('[[REPLACE_%s]]', strtoupper($tag));
}
if ($this->isIsolatedDiffTag($tag) && $this->isolatedDiffTags[$tag] !== $placeholder) {
throw new \InvalidArgumentException(
sprintf('Isolated diff tag "%s" already exists using a different placeholder', $tag)
);
}
$matchingKey = array_search($placeholder, $this->isolatedDiffTags, true);
if (false !== $matchingKey && $matchingKey !== $tag) {
throw new \InvalidArgumentException(
sprintf('Placeholder already being used for a different tag "%s"', $tag)
);
}
if (!array_key_exists($tag, $this->isolatedDiffTags)) {
$this->isolatedDiffTags[$tag] = $placeholder;
}
return $this;
}
/**
* @param string $tag
*
* @return $this
*/
public function removeIsolatedDiffTag($tag)
{
if ($this->isIsolatedDiffTag($tag)) {
unset($this->isolatedDiffTags[$tag]);
}
return $this;
}
/**
* @param string $tag
*
* @return bool
*/
public function isIsolatedDiffTag($tag)
{
return array_key_exists($tag, $this->isolatedDiffTags);
}
/**
* @param string $text
*
* @return bool
*/
public function isIsolatedDiffTagPlaceholder($text)
{
return in_array($text, $this->isolatedDiffTags, true);
}
/**
* @param string $tag
*
* @return null|string
*/
public function getIsolatedDiffTagPlaceholder($tag)
{
return $this->isIsolatedDiffTag($tag) ? $this->isolatedDiffTags[$tag] : null;
}
/**
* @return array
*/
public function getSpecialCaseOpeningTags()
{
return $this->specialCaseOpeningTags;
}
/**
* @return array
*/
public function getSpecialCaseClosingTags()
{
return $this->specialCaseClosingTags;
}
/**
* @return boolean
*/
public function isUseTableDiffing()
{
return $this->useTableDiffing;
}
/**
* @param boolean $useTableDiffing
*
* @return HtmlDiffConfig
*/
public function setUseTableDiffing($useTableDiffing)
{
$this->useTableDiffing = $useTableDiffing;
return $this;
}
/**
* @param null|\Doctrine\Common\Cache\Cache $cacheProvider
*
* @return $this
*/
public function setCacheProvider(\Doctrine\Common\Cache\Cache $cacheProvider = null)
{
$this->cacheProvider = $cacheProvider;
return $this;
}
/**
* @return null|\Doctrine\Common\Cache\Cache
*/
public function getCacheProvider()
{
return $this->cacheProvider;
}
/**
* @param null|string
*
* @return $this
*/
public function setPurifierCacheLocation($purifierCacheLocation = null)
{
$this->purifierCacheLocation = $purifierCacheLocation;
return $this;
}
/**
* @return null|string
*/
public function getPurifierCacheLocation()
{
return $this->purifierCacheLocation;
}
/**
* @param string $tag
*
* @return string
*/
protected function getOpeningTag($tag)
{
return "/<".$tag."[^>]*/i";
}
/**
* @param string $tag
*
* @return string
*/
protected function getClosingTag($tag)
{
return "</".$tag.">";
}
}