configurator = $configurator; foreach ($overrideProps as $k => $v) { $methodName = 'set' . ucfirst($k); if (method_exists($this, $methodName)) { $this->$methodName($v); } elseif (property_exists($this, $k)) { $this->$k = $v; } else { throw new RuntimeException("Unknown property '" . $k . "'"); } } $this->setUp(); } /** * Executed by this plugin's constructor */ protected function setUp() { } /** * Finalize this plugin's configuration * * Executed by the configurator whenever the tags' config must be in a usable state: * - before the parser's config is generated * - before the renderer's stylesheet is generated * - before HTML5 rules are generated * * As such, this method may be called multiple times during configuration */ public function finalize() { } /** * @return array|null This plugin's config, or NULL to disable this plugin */ public function asConfig() { $properties = get_object_vars($this); unset($properties['configurator']); return ConfigHelper::toArray($properties); } /** * Return a list of base properties meant to be added to asConfig()'s return * * NOTE: this final method exists so that the plugin's configuration can always specify those * base properties, even if they're omitted from asConfig(). Going forward, this ensure * that new base properties added to ConfiguratorBase appear in the plugin's config without * having to update every plugin * * @return array */ final public function getBaseProperties() { $config = [ 'className' => preg_replace('/Configurator$/', 'Parser', get_class($this)), 'quickMatch' => $this->quickMatch, 'regexpLimit' => $this->regexpLimit ]; $js = $this->getJSParser(); if (isset($js)) { $config['js'] = new Code($js); } return $config; } /** * Return additional hints used in the JavaScript parser * * @return array Hint names and values */ public function getJSHints() { return []; } /** * Return this plugin's JavaScript parser * * This is the base implementation, meant to be overridden by custom plugins. By default it * returns the Parser.js file from stock plugins' directory, if available * * @return string|null JavaScript source, or NULL if no JS parser is available */ public function getJSParser() { $className = get_class($this); if (strpos($className, 's9e\\TextFormatter\\Plugins\\') === 0) { $p = explode('\\', $className); $pluginName = $p[3]; $filepath = __DIR__ . '/' . $pluginName . '/Parser.js'; if (file_exists($filepath)) { return file_get_contents($filepath); } } return null; } /** * Return the tag associated with this plugin, if applicable * * @return \s9e\TextFormatter\Configurator\Items\Tag */ public function getTag() { if (!isset($this->tagName)) { throw new RuntimeException('No tag associated with this plugin'); } return $this->configurator->tags[$this->tagName]; } //========================================================================== // Setters //========================================================================== /** * Disable quickMatch * * @return void */ public function disableQuickMatch() { $this->quickMatch = false; } /** * Set $this->attrName with given attribute name, normalized * * @param string $attrName New attribute name * @return void */ protected function setAttrName($attrName) { if (!property_exists($this, 'attrName')) { throw new RuntimeException("Unknown property 'attrName'"); } $this->attrName = AttributeName::normalize($attrName); } /** * Set the quickMatch string * * @param string $quickMatch * @return void */ public function setQuickMatch($quickMatch) { if (!is_string($quickMatch)) { throw new InvalidArgumentException('quickMatch must be a string'); } $this->quickMatch = $quickMatch; } /** * Set the maximum number of regexp matches * * @param integer $limit * @return void */ public function setRegexpLimit($limit) { $limit = (int) $limit; if ($limit < 1) { throw new InvalidArgumentException('regexpLimit must be a number greater than 0'); } $this->regexpLimit = $limit; } /** * Set $this->tagName with given tag name, normalized * * @param string $tagName New tag name * @return void */ protected function setTagName($tagName) { if (!property_exists($this, 'tagName')) { throw new RuntimeException("Unknown property 'tagName'"); } $this->tagName = TagName::normalize($tagName); } }