Verzeichnisstruktur phpBB-3.2.0


Veröffentlicht
06.01.2017

So funktioniert es


Auf das letzte Element klicken. Dies geht jeweils ein Schritt zurück

Auf das Icon klicken, dies öffnet das Verzeichnis. Nochmal klicken schließt das Verzeichnis.
Auf den Verzeichnisnamen klicken, dies zeigt nur das Verzeichnis mit Inhalt an

(Beispiel Datei-Icons)

Auf das Icon klicken um den Quellcode anzuzeigen

JavaScript.php

Zuletzt modifiziert: 09.10.2024, 12:57 - Dateigröße: 6.78 KiB


001  <?php
002   
003  /*
004  * @package   s9e\TextFormatter
005  * @copyright Copyright (c) 2010-2016 The s9e Authors
006  * @license   http://www.opensource.org/licenses/mit-license.php The MIT License
007  */
008  namespace s9e\TextFormatter\Configurator;
009  use ReflectionClass;
010  use s9e\TextFormatter\Configurator;
011  use s9e\TextFormatter\Configurator\Helpers\ConfigHelper;
012  use s9e\TextFormatter\Configurator\JavaScript\CallbackGenerator;
013  use s9e\TextFormatter\Configurator\JavaScript\Code;
014  use s9e\TextFormatter\Configurator\JavaScript\ConfigOptimizer;
015  use s9e\TextFormatter\Configurator\JavaScript\Dictionary;
016  use s9e\TextFormatter\Configurator\JavaScript\Encoder;
017  use s9e\TextFormatter\Configurator\JavaScript\HintGenerator;
018  use s9e\TextFormatter\Configurator\JavaScript\Minifier;
019  use s9e\TextFormatter\Configurator\JavaScript\Minifiers\Noop;
020  use s9e\TextFormatter\Configurator\JavaScript\RegexpConvertor;
021  use s9e\TextFormatter\Configurator\JavaScript\StylesheetCompressor;
022  use s9e\TextFormatter\Configurator\RendererGenerators\XSLT;
023  class JavaScript
024  {
025      protected $callbackGenerator;
026      protected $config;
027      protected $configOptimizer;
028      protected $configurator;
029      public $encoder;
030      public $exportMethods = array(
031          'disablePlugin',
032          'disableTag',
033          'enablePlugin',
034          'enableTag',
035          'getLogger',
036          'parse',
037          'preview',
038          'setNestingLimit',
039          'setParameter',
040          'setTagLimit'
041      );
042      protected $hintGenerator;
043      protected $minifier;
044      protected $stylesheetCompressor;
045      protected $xsl;
046      public function __construct(Configurator $configurator)
047      {
048          $this->encoder              = new Encoder;
049          $this->callbackGenerator    = new CallbackGenerator;
050          $this->configOptimizer      = new ConfigOptimizer($this->encoder);
051          $this->configurator         = $configurator;
052          $this->hintGenerator        = new HintGenerator;
053          $this->stylesheetCompressor = new StylesheetCompressor;
054      }
055      public function getMinifier()
056      {
057          if (!isset($this->minifier))
058              $this->minifier = new Noop;
059          return $this->minifier;
060      }
061      public function getParser(array $config = \null)
062      {
063          $this->configOptimizer->reset();
064          $rendererGenerator = new XSLT;
065          $this->xsl = $rendererGenerator->getXSL($this->configurator->rendering);
066          $this->config = (isset($config)) ? $config : $this->configurator->asConfig();
067          $this->config = ConfigHelper::filterConfig($this->config, 'JS');
068          $this->config = $this->callbackGenerator->replaceCallbacks($this->config);
069          $src = $this->getHints() . $this->injectConfig($this->getSource());
070          $src .= $this->getExports();
071          $src = $this->getMinifier()->get($src);
072          $src = '(function(){' . $src . '})()';
073          return $src;
074      }
075      public function setMinifier($minifier)
076      {
077          if (\is_string($minifier))
078          {
079              $className = __NAMESPACE__ . '\\JavaScript\\Minifiers\\' . $minifier;
080              $args = \array_slice(\func_get_args(), 1);
081              if (!empty($args))
082              {
083                  $reflection = new ReflectionClass($className);
084                  $minifier   = $reflection->newInstanceArgs($args);
085              }
086              else
087                  $minifier = new $className;
088          }
089          $this->minifier = $minifier;
090          return $minifier;
091      }
092      protected function encode($value)
093      {
094          return $this->encoder->encode($value);
095      }
096      protected function getExports()
097      {
098          if (empty($this->exportMethods))
099              return '';
100          $methods = array();
101          foreach ($this->exportMethods as $method)
102              $methods[] = "'" . $method . "':" . $method;
103          return "window['s9e'] = { 'TextFormatter': {" . \implode(',', $methods) . "} }\n";
104      }
105      protected function getHints()
106      {
107          $this->hintGenerator->setConfig($this->config);
108          $this->hintGenerator->setPlugins($this->configurator->plugins);
109          $this->hintGenerator->setXSL($this->xsl);
110          return $this->hintGenerator->getHints();
111      }
112      protected function getPluginsConfig()
113      {
114          $plugins = new Dictionary;
115          foreach ($this->config['plugins'] as $pluginName => $pluginConfig)
116          {
117              if (!isset($pluginConfig['js']))
118                  continue;
119              $js = $pluginConfig['js'];
120              unset($pluginConfig['js']);
121              unset($pluginConfig['className']);
122              if (isset($pluginConfig['quickMatch']))
123              {
124                  $valid = array(
125                      '[[:ascii:]]',
126                      '[\\xC0-\\xDF][\\x80-\\xBF]',
127                      '[\\xE0-\\xEF][\\x80-\\xBF]{2}',
128                      '[\\xF0-\\xF7][\\x80-\\xBF]{3}'
129                  );
130                  $regexp = '#(?>' . \implode('|', $valid) . ')+#';
131                  if (\preg_match($regexp, $pluginConfig['quickMatch'], $m))
132                      $pluginConfig['quickMatch'] = $m[0];
133                  else
134                      unset($pluginConfig['quickMatch']);
135              }
136              $globalKeys = array(
137                  'quickMatch'  => 1,
138                  'regexp'      => 1,
139                  'regexpLimit' => 1
140              );
141              $globalConfig = \array_intersect_key($pluginConfig, $globalKeys);
142              $localConfig  = \array_diff_key($pluginConfig, $globalKeys);
143              if (isset($globalConfig['regexp']) && !($globalConfig['regexp'] instanceof Code))
144                  $globalConfig['regexp'] = new Code(RegexpConvertor::toJS($globalConfig['regexp'], \true));
145              $globalConfig['parser'] = new Code(
146                  '/**
147                  * @param {!string} text
148                  * @param {!Array.<Array>} matches
149                  */
150                  function(text, matches)
151                  {
152                      /** @const */
153                      var config=' . $this->encode($localConfig) . ';
154                      ' . $js . '
155                  }'
156              );
157              $plugins[$pluginName] = $globalConfig;
158          }
159          return $plugins;
160      }
161      protected function getRegisteredVarsConfig()
162      {
163          $registeredVars = $this->config['registeredVars'];
164          unset($registeredVars['cacheDir']);
165          return new Dictionary($registeredVars);
166      }
167      protected function getRootContext()
168      {
169          return $this->config['rootContext'];
170      }
171      protected function getSource()
172      {
173          $src = '';
174          $files = array(
175              'Parser/utils.js',
176              'Parser/BuiltInFilters.js',
177              'Parser/' . (\in_array('getLogger', $this->exportMethods) ? '' : 'Null') . 'Logger.js',
178              'Parser/Tag.js',
179              'Parser.js'
180          );
181          if (\in_array('preview', $this->exportMethods, \true))
182          {
183              $files[] = 'render.js';
184              $src .= '/** @const */ var xsl=' . $this->getStylesheet() . ";\n";
185          }
186          foreach ($files as $filename)
187          {
188              $filepath = __DIR__ . '/../' . $filename;
189              $src .= \file_get_contents($filepath) . "\n";
190          }
191          return $src;
192      }
193      protected function getStylesheet()
194      {
195          return $this->stylesheetCompressor->encode($this->xsl);
196      }
197      protected function getTagsConfig()
198      {
199          $tags = new Dictionary;
200          foreach ($this->config['tags'] as $tagName => $tagConfig)
201          {
202              if (isset($tagConfig['attributes']))
203                  $tagConfig['attributes'] = new Dictionary($tagConfig['attributes']);
204              $tags[$tagName] = $tagConfig;
205          }
206          return $tags;
207      }
208      protected function injectConfig($src)
209      {
210          $config = \array_map(
211              array($this, 'encode'),
212              $this->configOptimizer->optimize(
213                  array(
214                      'plugins'        => $this->getPluginsConfig(),
215                      'registeredVars' => $this->getRegisteredVarsConfig(),
216                      'rootContext'    => $this->getRootContext(),
217                      'tagsConfig'     => $this->getTagsConfig()
218                  )
219              )
220          );
221          $src = \preg_replace_callback(
222              '/(\\nvar (' . \implode('|', \array_keys($config)) . '))(;)/',
223              function ($m) use ($config)
224              {
225                  return $m[1] . '=' . $config[$m[2]] . $m[3];
226              },
227              $src
228          );
229          $src = $this->configOptimizer->getVarDeclarations() . $src;
230          return $src;
231      }
232  }