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. |
|
(Beispiel Datei-Icons)
|
Auf das Icon klicken um den Quellcode anzuzeigen |
JavaScript.php
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 }