#0 | Kaoken\MarkdownIt\MarkdownIt->parse /var/www/vendor/kaoken/markdown-it-php/src/MarkdownIt/MarkdownIt.php (617) <?php // Main parser class namespace Kaoken\MarkdownIt; use Kaoken\Punycode\Punycode; use Kaoken\MarkdownIt\Common\Utils; use Kaoken\MarkdownIt\Helpers\Helpers; use Kaoken\LinkifyIt\LinkifyIt; use Kaoken\MDUrl\MDUrl; use \Exception; use \stdClass; /** * class MarkdownIt * * Main parser/renderer class. * * ##### Usage * * ```PHP * $md = new MarkdownIt(); * $result = $md->render('# markdown-it rulezz!'); * ``` * * Single line rendering, without paragraph wrap: * * ```PHP * $md = new MarkdownIt(); * $result = $md->renderInline('__markdown-it__ rulezz!'); * ``` **/ class MarkdownIt extends stdClass { /** * @array */ protected array $configList = [ 'default' => \Kaoken\MarkdownIt\Presets\PresetDefault::class, 'zero' => \Kaoken\MarkdownIt\Presets\Zero::class, 'commonmark' =>\Kaoken\MarkdownIt\Presets\CommonMark::class ]; protected $config; /** * Instance of [[ParserInline]]. You may need it to add new rules when * writing plugins. For simple rules control use [[MarkdownIt.disable]] and * [[MarkdownIt.enable]]. * @var ParserInline|null **/ public ?ParserInline $inline = null; /** * MarkdownIt#block -> ParserBlock * Instance of [[ParserBlock]]. You may need it to add new rules when * writing plugins. For simple rules control use [[MarkdownIt.disable]] and * [[MarkdownIt.enable]]. * @var ParserBlock|null **/ public ?ParserBlock $block = null; /** * Instance of [[Core]] chain executor. You may need it to add new rules when * writing plugins. For simple rules control use [[MarkdownIt.disable]] and * [[MarkdownIt.enable]]. * * @var ParserCore|null **/ public ?ParserCore $core = null; /** * Instance of [[Renderer]]. Use it to modify output look. Or to add rendering * rules for new token types, generated by plugins. * * ##### Example * * ```PHP * $md = new MarkdownIt(); * * function myToken($tokens, $idx, $options, $env, $self) { * //... * return $result; * } * * $md->renderer->rules['my_token'] = myToken * ``` * * See [[Renderer]] docs and [source code](https://github.com/markdown-it/markdown-it/blob/master/lib/renderer.mjs). * @var Renderer **/ public Renderer $renderer; /** * MarkdownIt#linkify -> LinkifyIt * * [linkify-it](https://github.com/markdown-it/linkify-it) instance. * Used by [linkify](https://github.com/markdown-it/markdown-it/blob/master/lib/rules_core/linkify.mjs) * rule. * @LinkifyIt **/ public ?LinkifyIt $linkify = null; // Expose utils & helpers for easy acces from plugins /** * MarkdownIt#utils -> utils * * Assorted utility functions, useful to write plugins. See details * [here](https://github.com/markdown-it/markdown-it/blob/master/lib/common/utils.mjs). **/ public ?Utils $utils = null; /** * Link components parser functions, useful to write plugins. See details * [here](https://github.com/markdown-it/markdown-it/blob/master/lib/helpers). * * @var Helpers **/ public Helpers $helpers; /** * @var MDUrl */ protected MDUrl $mdurl; /** * @var Punycode */ protected Punycode $punycode; /** * @var array */ public $options; //////////////////////////////////////////////////////////////////////////////// // // This validator can prohibit more than really needed to prevent XSS. It's a // tradeoff to keep code simple and to be secure by default. // // If you need different setup - override validator method as you wish. Or // replace it with dummy function and use external sanitizer. // const BAD_PROTO_RE = '/^(vbscript|javascript|file|data):/'; const GOOD_DATA_RE = '/^data:image\/(gif|png|jpeg|webp);/'; const RECODE_HOSTNAME_FOR = [ 'http:', 'https:', 'mailto:' ]; /** * Link validation function. CommonMark allows too much in links. By default * we disable `javascript:`, `vbscript:`, `file:` schemas, and almost all `data:...` schemas * except some embedded image types. * * You can change this behaviour: * * ```PHP * $md = new MarkdownIt(); * // enable everything * $md->validateLink = function () { return true; } * ``` * @param string $url * @return boolean */ public function validateLink(string $url): bool { if( property_exists($this,'validateLink') && is_callable($this->validateLink)){ $fn = $this->validateLink; return $fn($url); } // url should be normalized at this point, and existing entities are decoded $str = strtolower(trim($url)); return preg_match(self::BAD_PROTO_RE, $str) ? (preg_match(self::GOOD_DATA_RE, $str) ? true : false) : true; } //////////////////////////////////////////////////////////////////////////////// /** * Function used to encode link url to a machine-readable format, * which includes url-encoding, punycode, etc. * @param string $url * @return string **/ public function normalizeLink($url): string { if( property_exists($this,'normalizeLink') && is_callable($this->normalizeLink)){ $fn = $this->normalizeLink; return $fn($url); } $parsed = $this->mdurl->parse($url, true); if ($parsed->hostname) { // Encode hostnames in urls like: // `http://host/`, `https://host/`, `mailto:user@host`, `//host/` // // We don't encode unknown schemas, because it's likely that we encode // something we shouldn't (e.g. `skype:name` treated as `skype:host`) // $is = false; foreach (self::RECODE_HOSTNAME_FOR as &$v) { if( ($is = $v === $parsed->protocol) ) break; } if (empty($parsed->protocol) || $is) { try { $parsed->hostname = $this->punycode->toASCII($parsed->hostname); } catch (Exception $e) { /**/ } } } return $this->mdurl->encode($this->mdurl->format($parsed)); } /**validateLink * @param string $url * @return string **/ public function normalizeLinkText($url): string { if( property_exists($this,'normalizeLinkText') && is_callable($this->normalizeLinkText)){ $fn = $this->normalizeLinkText; return $fn($url); } $parsed = $this->mdurl->parse($url, true); if ($parsed->hostname) { // Encode hostnames in urls like: // `http://host/`, `https://host/`, `mailto:user@host`, `//host/` // // We don't encode unknown schemas, because it's likely that we encode // something we shouldn't (e.g. `skype:name` treated as `skype:host`) // $is = false; foreach (self::RECODE_HOSTNAME_FOR as &$v) { if( ($is = $v === $parsed->protocol) ) break; } if (empty($parsed->protocol) || $is) { try { $parsed->hostname = $this->punycode->toUnicode($parsed->hostname); } catch (Exception $e) { /**/ } } } // add '%' to exclude list because of https://github.com/markdown-it/markdown-it/issues/720 return $this->mdurl->decode($this->mdurl->format($parsed), $this->mdurl->decodeDefaultChars() . '%'); } /** * Creates parser instanse with given config. Can be called without `new`. * * ##### presetName * * MarkdownIt provides named presets as a convenience to quickly * enable/disable active syntax rules and options for common use cases. * * - ["commonmark"](https://github.com/markdown-it/markdown-it/blob/master/lib/presets/commonmark.mjs) - * configures parser to strict [CommonMark](http://commonmark.org/) mode. * - [default](https://github.com/markdown-it/markdown-it/blob/master/lib/presets/default.mjs) - * similar to GFM, used when no preset name given. Enables all available rules, * but still without html, typographer & autolinker. * - ["zero"](https://github.com/markdown-it/markdown-it/blob/master/lib/presets/zero.mjs) - * all rules disabled. Useful to quickly setup your config via `.enable()`. * For example, when you need only `bold` and `italic` markup and nothing else. * * ##### options: * * - __html__ - `false`. Set `true` to enable HTML tags in source. Be careful! * That's not safe! You may need external sanitizer to protect output from XSS. * It's better to extend features via plugins, instead of enabling HTML. * - __xhtmlOut__ - `false`. Set `true` to add '/' when closing single tags * (`<br />`). This is needed only for full CommonMark compatibility. In real * world you will need HTML output. * - __breaks__ - `false`. Set `true` to convert `\n` in paragraphs into `<br>`. * - __langPrefix__ - `language-`. CSS language class prefix for fenced blocks. * Can be useful for external highlighters. * - __linkify__ - `false`. Set `true` to autoconvert URL-like text to links. * - __typographer__ - `false`. Set `true` to enable [some language-neutral * replacement](https://github.com/markdown-it/markdown-it/blob/master/lib/rules_core/replacements.mjs) + * quotes beautification (smartquotes). * - __quotes__ - `“”‘’`, String or Array. Double + single quotes replacement * pairs, when typographer enabled and smartquotes on. For example, you can * use `'«»„“'` for Russian, `'„“‚‘'` for German, and * `['«\xA0', '\xA0»', '‹\xA0', '\xA0›']` for French (including nbsp). * - __highlight__ - `null`. Highlighter function for fenced code blocks. * Highlighter `function (str, lang)` should return escaped HTML. It can also * return empty string if the source was not changed and should be escaped * externaly. If result starts with <pre... internal wrapper is skipped. * * ##### Example * * ```PHP * // commonmark mode * $md = new MarkdownIt('commonmark'); * * // default mode * $md = new MarkdownIt(); * * // enable everything * $md = new MarkdownIt({ * html: true, * linkify: true, * typographer: true * }); * ``` * * ##### Syntax highlighting * * ```PHP * hljs = require('highlight.js') // https://highlightjs.org/ * * $md = new MarkdownIt({ * highlight: function (str, lang) { * if (lang && hljs.getLanguage(lang)) { * try { * return hljs.highlight(str, [ 'language' => 'lang', 'ignoreIllegals' => true ]).value; * } catch (__) {} * } * * return ''; // use external default escaping * } * }); * ``` * * Or with full wrapper override (if you need assign class to `<pre>` or `<code>`): * * ```PHP * hljs = require('highlight.js') // https://highlightjs.org/ * * // Actual default values * $md = new MarkdownIt({ * highlight: function (str, lang) { * if (lang && hljs.getLanguage(lang)) { * try { * return '<pre><code class="hljs">' + * hljs.highlight(str, [ 'language' => 'lang', 'ignoreIllegals' => true ]).value + * '</code></pre>'; * } catch (__) {} * } * * return '<pre><code class="hljs">' + md.utils.escapeHtml(str) + '</code></pre>'; * } * }); * ``` * * * MarkdownIt constructor. * @param array|object|string $presetName optional, `commonmark` / `zero` * @param array|object|null $options * @throws Exception */ public function __construct($presetName='default', $options=null) { if( is_array($presetName) ) $presetName = (object)$presetName; if( is_array($options) ) $options = (object)$options; if (!is_string($presetName)) { $options = is_object($presetName) ? $presetName : new stdClass(); $presetName = 'default'; } $this->inline = new ParserInline(); $this->block = new ParserBlock(); $this->core = new ParserCore(); $this->renderer = new Renderer(); $this->linkify = new LinkifyIt(); $this->utils = Utils::getInstance(); $this->helpers = new Helpers(); $this->options = new stdClass(); $this->punycode = new Punycode(); $this->mdurl = new MDUrl(); $this->configure($presetName); if (isset($options)) { $this->set($options); } } /** chainable * MarkdownIt.set(options) * * Set parser options (in the same format as in constructor). Probably, you * will never need it, but you can change options after constructor call. * * ##### Example * * ```PHP * $md = new MarkdownIt(); * $md->set([ "html" => true, "breaks" => true ]) * ->set([ "typographer", "true" ]); * ``` * * __Note:__ To achieve the best possible performance, don't modify a * `markdown-it` instance options on the fly. If you need multiple configurations * it's best to create multiple instances and initialize each with separate * config. * @param stdClass|array $options * @return $this * @throws Exception */ public function set($options): MarkdownIt { if( is_array($options) )$options = (object)$options;//json_decode(json_encode($options)); $this->utils->assign($this->options, $options); return $this; } /** * Batch load of all options and compenent settings. This is internal method, * and you probably will not need it. But if you will - see available presets * and data structure [here](https://github.com/markdown-it/markdown-it/tree/master/lib/presets) * * We strongly recommend to use presets instead of direct config loads. That * will give better compatibility with next versions. * @param string|stdClass $presets * @return $this * @throws Exception */ public function configure($presets=null): MarkdownIt { if (is_string($presets)) { $presetName = $presets; if(!array_key_exists ($presetName, $this->configList)){ throw new Exception('Wrong `markdown-it` preset "' . $presetName . '", check name'); } $class = $this->configList[$presetName]; $presets = $class::get(); }else if( !is_null($presets) && empty($presets) ){ return $this; } if (is_null($presets)) { throw new Exception('Wrong `markdown-it` preset, can\'t be empty'); } if (is_object($presets->options)) { $this->set($presets->options); } if (isset($presets->components)) { foreach ($presets->components as $name=>&$val) { if( !property_exists($this,$name) ) continue; if( isset($presets->components->{$name}->rules) ){ $this->{$name}->ruler->enableOnly($presets->components->{$name}->rules); } if( isset($presets->components->{$name}->rules2) ){ $this->{$name}->ruler2->enableOnly($presets->components->{$name}->rules2); } } } return $this; } /** chainable * Enable list or rules. It will automatically find appropriate components, * containing rules with given names. If rule not found, and `ignoreInvalid` * not set - throws exception. * * ##### Example * * ```PHP * $md = new MarkdownIt(); * $md->enable(['sub', 'sup']) * ->disable('smartquotes'); * ``` * @param string|array $list rule name or list of rule names to enable * @param boolean $ignoreInvalid set `true` to ignore errors when rule not found. * @return $this * @throws Exception */ public function enable($list, bool $ignoreInvalid=false): MarkdownIt { $result = []; if (!is_array($list)) { $list = [ $list ]; } foreach ([ 'core', 'block', 'inline' ] as &$chain) { if( !property_exists($this,$chain) ) continue; $result = array_merge($result, $this->{$chain}->ruler->enable($list, true)); } $result = array_merge($result, $this->inline->ruler2->enable($list, true) ); $missed = array_filter ($list, function ($name) use(&$result) { return array_search ($name, $result) === false; }); if (count($missed) !== 0 && !$ignoreInvalid) { throw new Exception('MarkdownIt. Failed to enable unknown rule(s): ' . implode(', ', $missed)); } return $this; } /** chainable * The same as [[MarkdownIt.enable]], but turn specified rules off. * * @param string|array $list rule name or list of rule names to enable * @param boolean $ignoreInvalid set `true` to ignore errors when rule not found. * @return $this * @throws Exception */ public function disable($list, bool $ignoreInvalid=false): MarkdownIt { $result = []; if (!is_array($list)) { $list = [ $list ]; } foreach ([ 'core', 'block', 'inline' ] as &$chain) { if( !property_exists($this,$chain) ) continue; $result = array_merge($result, $this->{$chain}->ruler->disable($list, true)); } $result = array_merge($result, $this->inline->ruler2->disable($list, true) ); $missed = array_filter ($list, function ($name) use(&$result) { return array_search ($name, $result) === false; }); if (count($missed) !== 0 && !$ignoreInvalid) { throw new Exception('MarkdownIt. Failed to disable unknown rule(s): ' . implode(', ', $missed)); } return $this; } /** chainable * Load specified plugin with given params into current parser instance. * It's just a sugar to call `plugin($md, $params)` with curring. * * ##### Example * * ```PHP * class Test{ * public function plugin($md, $ruleName, $tokenType, $iteartor){ * $scan = function($state) use($md, $ruleName, $tokenType, $iteartor) { * for ($blkIdx = count($state->tokens) - 1; $blkIdx >= 0; $blkIdx--) { * if ($state->tokens[$blkIdx]->type !== 'inline') { * continue; * } * * $inlineTokens = $state->tokens[$blkIdx]->children; * * for ($i = count($inlineTokens) - 1; $i >= 0; $i--) { * if ($inlineTokens[$i]->type !== $tokenType) { * continue; * } * * $iteartor($inlineTokens, $i); * } * } * }; * * $md->core->ruler->push($ruleName, $scan); * } * } * $md = new MarkdownIt(); * $md->plugin(new Test(),'foo_replace', 'text', function ($tokens, $idx) { * $tokens[$idx]->content = preg_replace("/foo/", 'bar', $tokens[$idx]->content); * }); * ``` * * @param callable|object $plugin * @param array ...$args * @return $this * @throws Exception */ public function plugin($plugin, ...$args): MarkdownIt { array_unshift($args, $this); if( is_callable($plugin) ){ call_user_func_array($plugin, $args); }else if( is_object($plugin) ){ call_user_func_array([$plugin, 'plugin'], $args); }else{ throw new Exception(); } return $this; } /** internal * Parse input string and return list of block tokens (special token type * "inline" will contain list of inline tokens). You should not call this * method directly, until you write custom renderer (for example, to produce * AST). * * `env` is used to pass data between "distributed" rules and return additional * metadata like reference info, needed for the renderer. It also can be used to * inject data in specific cases. Usually, you will be ok to pass `{}`, * and then pass updated object to renderer. * * @param null|string $src source string * @param null $env environment sandbox * @return array * @throws Exception */ public function &parse(?string $src, $env=null): array { if ( !is_string($src)) { throw new Exception('Input data should be a String'); } $state = $this->core->createState($src, $this, $env); $this->core->process($state); return $state->tokens; } /** * Render markdown string into html. It does all magic for you :). * * `env` can be used to inject additional metadata (`{}` by default). * But you will not need it with high probability. See also comment * in [[MarkdownIt.parse]]. * * @param null|string $src source string * @param null $env environment sandbox * @return string * @throws Exception */ public function render(?string $src, $env=null): string { $env = is_object($env) ? $env : new stdClass(); return $this->renderer->render($this->parse($src, $env), $this->options, $env); } /** internal * The same as [[MarkdownIt.parse]] but skip all block rules. It returns the * block tokens list with the single `inline` element, containing parsed inline * tokens in `children` property. Also updates `env` object. * * @param string $src source string * @param object $env environment sandbox * @return array */ public function &parseInline(string $src, object $env): array { $state = $this->core->createState($src, $this, $env); $state->inlineMode = true; $this->core->process($state); return $state->tokens; } /** * Similar to [[MarkdownIt.render]] but for single paragraph content. Result * will NOT be wrapped into `<p>` tags. * * @param string $src source string * @param null $env environment sandbox * @return string */ public function renderInline(string $src, $env=null): string { $env = is_object($env) ? $env : new stdClass(); $tokens = $this->parseInline($src, $env); return $this->renderer->render($tokens, $this->options, $env); } } |
#1 | Kaoken\MarkdownIt\MarkdownIt->render /var/www/src/Helpers/MarkdownParser.php (59) <?php declare(strict_types=1); namespace App\Helpers; use App\Helpers\MarkdownItPlugins\MarkdownItDeflist as OwnMarkdownItDeflist; use App\Models\InfoPost; use Kaoken\MarkdownIt\MarkdownIt; use Kaoken\MarkdownIt\Plugins\MarkdownItAbbr; use Kaoken\MarkdownIt\Plugins\MarkdownItContainer; use Kaoken\MarkdownIt\Plugins\MarkdownItEmoji; use Kaoken\MarkdownIt\Plugins\MarkdownItFootnote; use Kaoken\MarkdownIt\Plugins\MarkdownItIns; use Kaoken\MarkdownIt\Plugins\MarkdownItMark; use Kaoken\MarkdownIt\Plugins\MarkdownItSub; use Kaoken\MarkdownIt\Plugins\MarkdownItSup; class MarkdownParser { protected $post; public function __construct($post) { $this->post = $post; } public function parseText() { $md = (new MarkdownIt([ "typographer" => true, "linkify" => true, "html" => true, "quotes" => '«»„“', ])) ->plugin(new MarkdownItEmoji()) ->plugin(new MarkdownItSub()) ->plugin(new MarkdownItSup()) ->plugin(new MarkdownItFootnote()) ->plugin(new MarkdownItAbbr()) ->plugin(new MarkdownItMark()) ->plugin(new MarkdownItIns()) ->plugin(new MarkdownItContainer(), 'spoiler', [ 'render' => function ($tokens, $idx) { return $tokens[$idx]->nesting === 1 ? "<details><summary>Спойлер</summary>\n" : "</details>\n"; } ]) ->plugin(new MarkdownItContainer(), 'warning', [ 'render' => function ($tokens, $idx) { return $tokens[$idx]->nesting === 1 ? "<div class='alert alert-warning'>\n" : "</div>\n"; } ]) ->plugin(new OwnMarkdownItDeflist()); return $md->render($this->post); } } |
#2 | App\Helpers\MarkdownParser->parseText /var/www/src/Models/InfoDocumentVersion.php (88) <?php declare(strict_types=1); namespace App\Models; use App\Helpers\MarkdownParser; use App\Model; use App\Models\Events\CreateUpdateEvents; use Carbon\Carbon; /** * Class InfoDocumentVersion * * @method static findFirstByInfoDocumentId(int $info_document_id) * @method static findFirstById(int $id) * @method static findFirstByVersion(string $version) */ class InfoDocumentVersion extends Model { use CreateUpdateEvents; public ?int $id = null; public int $info_document_id; public string $content; public string $version; public ?string $reason = null; public ?string $editor_uuid = null; public string $published_at; public string $created_at; public ?string $updated_at = null; public string $parsed_content; public array $versions_list; public function initialize(): void { $this->hasOne('editor_uuid', Admin::class, 'uuid', ['alias' => 'Editor']); $this->hasOne('info_document_id', InfoDocument::class, 'id', ['alias' => 'InfoDocument']); } public static function getVersion($document_name, $version = null, $parsed = true) { /** * @var InfoDocument $document * @var InfoDocumentVersion $documentContent */ $document = InfoDocument::findFirst([ 'meta_name = :meta_name:', 'bind' => [ 'meta_name' => $document_name, ], ]); if($version) { $documentContent = self::findFirst([ 'info_document_id = :document_id: AND version = :version:', 'bind' => [ 'document_id' => $document->id, 'version' => $version ], 'order' => 'published_at DESC', ]); } else { $documentContent = self::findFirst([ 'info_document_id = :document_id: AND published_at <= :today:', 'bind' => [ 'document_id' => $document->id, 'today' => Carbon::now(), ], 'order' => 'published_at DESC', ]); } $all_versions = self::find([ 'columns' => 'version', 'info_document_id = :document_id: AND published_at <= :today:', 'bind' => [ 'document_id' => $document->id, 'today' => Carbon::now(), ], 'order' => 'published_at DESC', ]); foreach($all_versions as $version_item) { $documentContent->versions_list[] = $version_item->version; } if($parsed) { $documentContent->parsed_content = (new MarkdownParser($documentContent->content))->parseText(); } return $documentContent; } } |
#3 | App\Models\InfoDocumentVersion::getVersion /var/www/src/Modules/Info/Controllers/DocumentationController.php (52) <?php namespace App\Modules\Info\Controllers; use App\Models\InfoDocument; use App\Models\InfoDocumentVersion; use App\Models\PriceList; use App\Modules\Info\Controller; use Carbon\Carbon; use Phalcon\Paginator\Adapter\Model as PaginatorModel; class DocumentationController extends Controller { public function initialize() { $this->tag->title()->set('Документация'); parent::initialize(); $this->view->setTemplateBefore('index'); $this->view->{'breadcrumbs_controller'} = 'Документация'; $this->view->{'breadcrumbs_action'} = ''; } public function indexAction(): void { $this->view->{'breadcrumbs_action'} = 'Список'; $currentPage = (int)($this->request->get('page') ?? 0); $paginator = new PaginatorModel( [ 'model' => InfoDocument::class, 'parameters' => [ 'publish_on_main = :on_main: AND enabled = :enabled: AND created_at <= :today:', 'bind' => [ 'on_main' => 1, 'enabled' => 1, 'today' => Carbon::now()->tz(+2)->subDay()->endOfDay()->format('Y-m-d H:i:s') ], 'order' => 'name' ], 'limit' => 20, 'page' => $currentPage, ] ); $this->view->{'page'} = $paginator->paginate(); } public function viewAction($docname, $version = null) { $doc = InfoDocumentVersion::getVersion($docname, $version); if($doc) { $this->view->{'breadcrumbs_action'} = $doc->{'InfoDocument'}->name; $this->view->{'document'} = $doc; } else { return $this->show404(); } } public function priceAction(): void { $this->view->{'breadcrumbs_action'} = 'Стоимость услуг'; $this->view->{'priceList'} = (new PriceList())->getBeautify(); } } |
#4 | App\Modules\Info\Controllers\DocumentationController->viewAction |
#5 | Phalcon\Dispatcher\AbstractDispatcher->callActionMethod |
#6 | Phalcon\Dispatcher\AbstractDispatcher->dispatch |
#7 | Phalcon\Mvc\Application->handle /var/www/config/bootstrap.php (94) <?php declare(strict_types=1); use App\Providers\ModulesProvider; use Phalcon\Config\Adapter\Grouped; use Phalcon\Di\FactoryDefault; use Phalcon\Mvc\Application; use Phalcon\Mvc\Dispatcher; use Phalcon\Support\Debug; use Phalcon\Support\HelperFactory; use Sentry\SentrySdk; $environment = getenv('DE_ENV') ?: 'local'; $config = new Grouped( [ "config.php", "env/config.{$environment}.php", "env/config.my.php", ] ); //define("API_HOST", $config->api_host . '/v1'); define("API_HOST", $config->api_host); if($config->get('debug', false)) { ini_set('display_errors', '1'); error_reporting(E_ALL); $debug = new Debug(); $debug->listen(); $_SERVER['start_time'] = microtime(true); $_SERVER['start_memory'] = memory_get_usage(); } require ROOT_PATH . 'vendor/autoload.php'; //require 'sentry.php'; $loader = require 'loader.php'; $container = new FactoryDefault(); $providers = require 'providers.php'; foreach($providers as $provider) { $container->register(new $provider()); } $container->set('dispatcher', function() use ($container) { $eventsManager = $container->getShared('eventsManager'); $eventsManager->attach('dispatch:beforeException', function($event, Dispatcher $dispatcher, Exception $exception) { switch($exception->getCode()) { case \Phalcon\Dispatcher\Exception::EXCEPTION_HANDLER_NOT_FOUND: case \Phalcon\Dispatcher\Exception::EXCEPTION_INVALID_PARAMS: case \Phalcon\Dispatcher\Exception::EXCEPTION_ACTION_NOT_FOUND: $dispatcher->forward([ 'controller' => 'errors', 'action' => 'show404', ]); return false; } return true; }); $dispatcher = new Dispatcher(); $dispatcher->setEventsManager($eventsManager); return $dispatcher; }); /** * Init application */ $application = new Application(); $application->setDI($container); $application->registerModules(ModulesProvider::getModules()); try { $application->handle($_SERVER['REQUEST_URI'])->send(); } catch(Throwable $exception) { if(isset($debug)) { if($exception instanceof \Error) { $exception = new \ErrorException($exception->getMessage(), $exception->getCode(), \E_ERROR, $exception->getFile(), $exception->getLine()); } /** * @var Phalcon\Mvc\Dispatcher $dispatcher */ $dispatcher = $container->get('dispatcher'); // if($dispatcher->getModuleName() !== null){ $debug->onUncaughtException($exception); // } } else { // Sentry\captureException($exception); $template = file_get_contents(ROOT_PATH . 'public/pages/wrong-with-track.html'); $html = str_replace([ '{track_id}', '{event_id}', ], [ $config->get('track_id'), '',//SentrySdk::getCurrentHub()->getLastEventId(), ], $template); echo $html; } } |
#8 | require(/var/www/config/bootstrap.php) /var/www/public/index.php (34) <?php /* * This file is a part of Dolce Eda 2.0 project. * * 2024 (c) DolceEda <dolceeda@yandex.ru> */ declare(strict_types=1); use Phalcon\Config\Config; ini_set('memory_limit', '-1'); if(!function_exists('gen_uuid')){ function gen_uuid(): string { return sprintf( '%04x%04x-%04x-%04x-%04x-%04x%04x%04x', mt_rand(0, 0xffff), mt_rand(0, 0xffff), mt_rand(0, 0xffff), mt_rand(0, 0x0fff) | 0x4000, mt_rand(0, 0x3fff) | 0x8000, mt_rand(0, 0xffff), mt_rand(0, 0xffff), mt_rand(0, 0xffff) ); } } $GLOBALS['http_request_id'] = gen_uuid(); $GLOBALS['exec_time'] = microtime(true); require __DIR__ . '/../config/defines.php'; /** * @var Config $config */ $config = require CONFIG_PATH . 'bootstrap.php'; |
Key | Value |
---|---|
_url | /agreement |
Key | Value |
---|---|
HOSTNAME | f8d55023ea20 |
HOME | /var/www |
XDEBUG_CONFIG | remote_host=host.docker.internal - CHOKIDAR_USEPOLLING=true |
TERM | linux |
PATH | /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin |
DEBIAN_FRONTEND | noninteractive |
DE_ENV | prod |
PWD | /var/www |
USER | www-data |
HTTP_HOST | dolceeda.com |
HTTP_ACCEPT_ENCODING | gzip, br, zstd, deflate |
HTTP_USER_AGENT | Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; ClaudeBot/1.0; +claudebot@anthropic.com) |
HTTP_ACCEPT | */* |
PHP_VALUE | upload_max_filesize=300M \n post_max_size=300M |
PATH_INFO | |
PATH_TRANSLATED | /var/www/public |
SCRIPT_FILENAME | /var/www/public/index.php |
REDIRECT_STATUS | 200 |
SERVER_NAME | dolceeda.com |
SERVER_PORT | 443 |
SERVER_ADDR | 172.18.0.6 |
REMOTE_PORT | 55858 |
REMOTE_ADDR | 3.135.201.101 |
SERVER_SOFTWARE | nginx/1.27.3 |
GATEWAY_INTERFACE | CGI/1.1 |
HTTPS | on |
REQUEST_SCHEME | https |
SERVER_PROTOCOL | HTTP/1.1 |
DOCUMENT_ROOT | /var/www/public |
DOCUMENT_URI | /index.php |
REQUEST_URI | /agreement |
SCRIPT_NAME | /index.php |
CONTENT_LENGTH | |
CONTENT_TYPE | |
REQUEST_METHOD | GET |
QUERY_STRING | _url=/agreement& |
FCGI_ROLE | RESPONDER |
PHP_SELF | /index.php |
REQUEST_TIME_FLOAT | 1734893225.5415 |
REQUEST_TIME | 1734893225 |
start_time | 1734893225.5447 |
start_memory | 878568 |
# | Path |
---|---|
0 | /var/www/public/index.php |
1 | /var/www/config/defines.php |
2 | /var/www/config/bootstrap.php |
3 | /var/www/config/config.php |
4 | /var/www/config/env/config.prod.php |
5 | /var/www/vendor/autoload.php |
6 | /var/www/vendor/composer/autoload_real.php |
7 | /var/www/vendor/composer/platform_check.php |
8 | /var/www/vendor/composer/ClassLoader.php |
9 | /var/www/vendor/composer/autoload_static.php |
10 | /var/www/vendor/symfony/polyfill-php80/bootstrap.php |
11 | /var/www/vendor/symfony/polyfill-mbstring/bootstrap.php |
12 | /var/www/vendor/symfony/polyfill-mbstring/bootstrap80.php |
13 | /var/www/vendor/symfony/deprecation-contracts/function.php |
14 | /var/www/vendor/symfony/polyfill-ctype/bootstrap.php |
15 | /var/www/vendor/symfony/polyfill-ctype/bootstrap80.php |
16 | /var/www/vendor/myclabs/deep-copy/src/DeepCopy/deep_copy.php |
17 | /var/www/vendor/phpunit/phpunit/src/Framework/Assert/Functions.php |
18 | /var/www/vendor/symfony/polyfill-php73/bootstrap.php |
19 | /var/www/vendor/ralouphie/getallheaders/src/getallheaders.php |
20 | /var/www/vendor/symfony/var-dumper/Resources/functions/dump.php |
21 | /var/www/vendor/cakephp/core/functions.php |
22 | /var/www/vendor/symfony/polyfill-intl-normalizer/bootstrap.php |
23 | /var/www/vendor/symfony/polyfill-intl-normalizer/bootstrap80.php |
24 | /var/www/vendor/symfony/polyfill-intl-idn/bootstrap.php |
25 | /var/www/vendor/symfony/polyfill-intl-idn/bootstrap80.php |
26 | /var/www/vendor/clue/stream-filter/src/functions_include.php |
27 | /var/www/vendor/clue/stream-filter/src/functions.php |
28 | /var/www/vendor/psy/psysh/src/functions.php |
29 | /var/www/vendor/php-http/message/src/filters.php |
30 | /var/www/vendor/codeception/codeception/functions.php |
31 | /var/www/vendor/guzzlehttp/guzzle/src/functions_include.php |
32 | /var/www/vendor/guzzlehttp/guzzle/src/functions.php |
33 | /var/www/vendor/mtdowling/jmespath.php/src/JmesPath.php |
34 | /var/www/vendor/symfony/polyfill-php81/bootstrap.php |
35 | /var/www/vendor/aws/aws-sdk-php/src/functions.php |
36 | /var/www/vendor/symfony/polyfill-php83/bootstrap.php |
37 | /var/www/vendor/cakephp/collection/functions.php |
38 | /var/www/vendor/cakephp/utility/bootstrap.php |
39 | /var/www/vendor/cakephp/utility/Inflector.php |
40 | /var/www/vendor/sentry/sentry/src/functions.php |
41 | /var/www/vendor/symfony/clock/Resources/now.php |
42 | /var/www/vendor/symfony/polyfill-iconv/bootstrap.php |
43 | /var/www/vendor/mpdf/mpdf/src/functions.php |
44 | /var/www/vendor/swiftmailer/swiftmailer/lib/swift_required.php |
45 | /var/www/vendor/swiftmailer/swiftmailer/lib/classes/Swift.php |
46 | /var/www/config/loader.php |
47 | /var/www/config/providers.php |
48 | /var/www/src/Providers/ConfigProvider.php |
49 | /var/www/src/Providers/ModulesProvider.php |
50 | /var/www/src/Providers/RouterProvider.php |
51 | /var/www/src/Providers/SessionProvider.php |
52 | /var/www/src/Providers/UrlProvider.php |
53 | /var/www/src/Providers/EventsManagerProvider.php |
54 | /var/www/src/Providers/DbProvider.php |
55 | /var/www/src/Providers/ModelsCacheProvider.php |
56 | /var/www/src/Providers/CacheProvider.php |
57 | /var/www/src/Providers/ModelsMetadataProvider.php |
58 | /var/www/src/Providers/RedisProvider.php |
59 | /var/www/src/Providers/MessageQueueProvider.php |
60 | /var/www/src/Providers/ViewProvider.php |
61 | /var/www/src/Providers/VoltProvider.php |
62 | /var/www/src/Providers/AssetsProvider.php |
63 | /var/www/src/Providers/FlashProvider.php |
64 | /var/www/src/Providers/SimpleViewProvider.php |
65 | /var/www/src/Providers/CryptProvider.php |
66 | /var/www/src/Providers/MailerProvider.php |
67 | /var/www/src/Providers/LoggerProvider.php |
68 | /var/www/src/Providers/FilesystemProvider.php |
69 | /var/www/vendor/predis/predis/src/Client.php |
70 | /var/www/vendor/predis/predis/src/ClientInterface.php |
71 | /var/www/vendor/predis/predis/src/Configuration/Options.php |
72 | /var/www/vendor/predis/predis/src/Configuration/OptionsInterface.php |
73 | /var/www/vendor/predis/predis/src/Configuration/ConnectionFactoryOption.php |
74 | /var/www/vendor/predis/predis/src/Configuration/OptionInterface.php |
75 | /var/www/vendor/predis/predis/src/Connection/Factory.php |
76 | /var/www/vendor/predis/predis/src/Connection/FactoryInterface.php |
77 | /var/www/vendor/predis/predis/src/Connection/Parameters.php |
78 | /var/www/vendor/predis/predis/src/Connection/ParametersInterface.php |
79 | /var/www/vendor/predis/predis/src/Connection/StreamConnection.php |
80 | /var/www/vendor/predis/predis/src/Connection/AbstractConnection.php |
81 | /var/www/vendor/predis/predis/src/Connection/NodeConnectionInterface.php |
82 | /var/www/vendor/predis/predis/src/Connection/ConnectionInterface.php |
83 | /var/www/vendor/predis/predis/src/Command/RawCommand.php |
84 | /var/www/vendor/predis/predis/src/Command/CommandInterface.php |
85 | /var/www/vendor/predis/predis/src/Configuration/ProfileOption.php |
86 | /var/www/vendor/predis/predis/src/Profile/Factory.php |
87 | /var/www/vendor/predis/predis/src/Profile/RedisVersion320.php |
88 | /var/www/vendor/predis/predis/src/Profile/RedisProfile.php |
89 | /var/www/vendor/predis/predis/src/Profile/ProfileInterface.php |
90 | /var/www/src/Providers/TelegramProvider.php |
91 | /var/www/vendor/enqueue/pheanstalk/PheanstalkConnectionFactory.php |
92 | /var/www/vendor/queue-interop/queue-interop/src/ConnectionFactory.php |
93 | /var/www/vendor/pda/pheanstalk/src/Pheanstalk.php |
94 | /var/www/vendor/pda/pheanstalk/src/PheanstalkInterface.php |
95 | /var/www/src/Services/MessageQueue.php |
96 | /var/www/vendor/queue-interop/queue-interop/src/Context.php |
97 | /var/www/vendor/enqueue/pheanstalk/PheanstalkContext.php |
98 | /var/www/vendor/pda/pheanstalk/src/Connection.php |
99 | /var/www/vendor/pda/pheanstalk/src/Response.php |
100 | /var/www/src/Providers/ErrorTrackerProvider.php |
101 | /var/www/src/Providers/DadataProvider.php |
102 | /var/www/src/Modules/Info/Module.php |
103 | /var/www/src/Modules/Info/Plugins/Elements.php |
104 | /var/www/src/Injectable.php |
105 | /var/www/src/Helpers/MetaTagsHelper.php |
106 | /var/www/vendor/nesbot/carbon/src/Carbon/Carbon.php |
107 | /var/www/vendor/nesbot/carbon/src/Carbon/Traits/Date.php |
108 | /var/www/vendor/nesbot/carbon/src/Carbon/Traits/Boundaries.php |
109 | /var/www/vendor/nesbot/carbon/src/Carbon/Traits/Comparison.php |
110 | /var/www/vendor/nesbot/carbon/src/Carbon/Traits/Converter.php |
111 | /var/www/vendor/nesbot/carbon/src/Carbon/Traits/ToStringFormat.php |
112 | /var/www/vendor/nesbot/carbon/src/Carbon/Traits/Creator.php |
113 | /var/www/vendor/nesbot/carbon/src/Carbon/Traits/ObjectInitialisation.php |
114 | /var/www/vendor/nesbot/carbon/src/Carbon/Traits/LocalFactory.php |
115 | /var/www/vendor/nesbot/carbon/src/Carbon/Traits/Difference.php |
116 | /var/www/vendor/nesbot/carbon/src/Carbon/Traits/Macro.php |
117 | /var/www/vendor/nesbot/carbon/src/Carbon/Traits/Mixin.php |
118 | /var/www/vendor/nesbot/carbon/src/Carbon/Traits/MagicParameter.php |
119 | /var/www/vendor/nesbot/carbon/src/Carbon/Traits/Modifiers.php |
120 | /var/www/vendor/nesbot/carbon/src/Carbon/Traits/Mutability.php |
121 | /var/www/vendor/nesbot/carbon/src/Carbon/Traits/Cast.php |
122 | /var/www/vendor/nesbot/carbon/src/Carbon/Traits/Options.php |
123 | /var/www/vendor/nesbot/carbon/src/Carbon/Traits/StaticOptions.php |
124 | /var/www/vendor/nesbot/carbon/src/Carbon/Traits/Localization.php |
125 | /var/www/vendor/nesbot/carbon/src/Carbon/Traits/StaticLocalization.php |
126 | /var/www/vendor/nesbot/carbon/src/Carbon/Traits/Rounding.php |
127 | /var/www/vendor/nesbot/carbon/src/Carbon/Traits/IntervalRounding.php |
128 | /var/www/vendor/nesbot/carbon/src/Carbon/Traits/Serialization.php |
129 | /var/www/vendor/nesbot/carbon/src/Carbon/Traits/Test.php |
130 | /var/www/vendor/nesbot/carbon/src/Carbon/Traits/Timestamp.php |
131 | /var/www/vendor/nesbot/carbon/src/Carbon/Traits/Units.php |
132 | /var/www/vendor/nesbot/carbon/src/Carbon/Traits/Week.php |
133 | /var/www/vendor/nesbot/carbon/src/Carbon/CarbonInterface.php |
134 | /var/www/vendor/nesbot/carbon/src/Carbon/CarbonTimeZone.php |
135 | /var/www/vendor/nesbot/carbon/src/Carbon/CarbonInterval.php |
136 | /var/www/vendor/nesbot/carbon/src/Carbon/Traits/IntervalStep.php |
137 | /var/www/vendor/nesbot/carbon/src/Carbon/CarbonConverterInterface.php |
138 | /var/www/vendor/nesbot/carbon/src/Carbon/FactoryImmutable.php |
139 | /var/www/vendor/nesbot/carbon/src/Carbon/Factory.php |
140 | /var/www/vendor/symfony/clock/ClockInterface.php |
141 | /var/www/vendor/psr/clock/src/ClockInterface.php |
142 | /var/www/vendor/nesbot/carbon/src/Carbon/CarbonImmutable.php |
143 | /var/www/src/Modules/Info/Controllers/DocumentationController.php |
144 | /var/www/src/Modules/Info/Controller.php |
145 | /var/www/src/Controller.php |
146 | /var/www/src/Models/Configuration.php |
147 | /var/www/src/Model.php |
148 | /var/www/src/Models/Events/CreateUpdateEvents.php |
149 | /var/www/vendor/phalcon/migrations/src/Db/Dialect/DialectPostgresql.php |
150 | /var/www/src/Helpers/AssetsManager.php |
151 | /var/www/src/Models/InfoDocumentVersion.php |
152 | /var/www/src/Models/InfoDocument.php |
153 | /var/www/src/Helpers/MarkdownParser.php |
154 | /var/www/vendor/kaoken/markdown-it-php/src/MarkdownIt/MarkdownIt.php |
155 | /var/www/vendor/kaoken/markdown-it-php/src/MarkdownIt/ParserInline.php |
156 | /var/www/vendor/kaoken/markdown-it-php/src/MarkdownIt/Ruler.php |
157 | /var/www/vendor/kaoken/markdown-it-php/src/MarkdownIt/RulesInline/Text.php |
158 | /var/www/vendor/kaoken/markdown-it-php/src/MarkdownIt/RulerObject.php |
159 | /var/www/vendor/kaoken/markdown-it-php/src/MarkdownIt/RulesInline/Linkify.php |
160 | /var/www/vendor/kaoken/markdown-it-php/src/MarkdownIt/RulesInline/NewLine.php |
161 | /var/www/vendor/kaoken/markdown-it-php/src/MarkdownIt/Common/Utils.php |
162 | /var/www/vendor/kaoken/markdown-it-php/src/MarkdownIt/RulesInline/Escape.php |
163 | /var/www/vendor/kaoken/markdown-it-php/src/MarkdownIt/RulesInline/Backticks.php |
164 | /var/www/vendor/kaoken/markdown-it-php/src/MarkdownIt/RulesInline/Strikethrough.php |
165 | /var/www/vendor/kaoken/markdown-it-php/src/MarkdownIt/RulesInline/Emphasis.php |
166 | /var/www/vendor/kaoken/markdown-it-php/src/MarkdownIt/RulesInline/Link.php |
167 | /var/www/vendor/kaoken/markdown-it-php/src/MarkdownIt/RulesInline/Image.php |
168 | /var/www/vendor/kaoken/markdown-it-php/src/MarkdownIt/RulesInline/AutoLink.php |
169 | /var/www/vendor/kaoken/markdown-it-php/src/MarkdownIt/RulesInline/HtmlInline.php |
170 | /var/www/vendor/kaoken/markdown-it-php/src/MarkdownIt/RulesInline/Entity.php |
171 | /var/www/vendor/kaoken/markdown-it-php/src/MarkdownIt/RulesInline/BalancePairs.php |
172 | /var/www/vendor/kaoken/markdown-it-php/src/MarkdownIt/RulesInline/FragmentsJoin.php |
173 | /var/www/vendor/kaoken/markdown-it-php/src/MarkdownIt/ParserBlock.php |
174 | /var/www/vendor/kaoken/markdown-it-php/src/MarkdownIt/RulesBlock/Table.php |
175 | /var/www/vendor/kaoken/markdown-it-php/src/MarkdownIt/RulesBlock/Code.php |
176 | /var/www/vendor/kaoken/markdown-it-php/src/MarkdownIt/RulesBlock/Fence.php |
177 | /var/www/vendor/kaoken/markdown-it-php/src/MarkdownIt/RulesBlock/BlockQuote.php |
178 | /var/www/vendor/kaoken/markdown-it-php/src/MarkdownIt/RulesBlock/Hr.php |
179 | /var/www/vendor/kaoken/markdown-it-php/src/MarkdownIt/RulesBlock/CList.php |
180 | /var/www/vendor/kaoken/markdown-it-php/src/MarkdownIt/RulesBlock/Reference.php |
181 | /var/www/vendor/kaoken/markdown-it-php/src/MarkdownIt/RulesBlock/HtmlBlock.php |
182 | /var/www/vendor/kaoken/markdown-it-php/src/MarkdownIt/Common/HtmlBlocks.php |
183 | /var/www/vendor/kaoken/markdown-it-php/src/MarkdownIt/Common/HtmlRegex.php |
184 | /var/www/vendor/kaoken/markdown-it-php/src/MarkdownIt/RulesBlock/Heading.php |
185 | /var/www/vendor/kaoken/markdown-it-php/src/MarkdownIt/RulesBlock/LHeading.php |
186 | /var/www/vendor/kaoken/markdown-it-php/src/MarkdownIt/RulesBlock/Paragraph.php |
187 | /var/www/vendor/kaoken/markdown-it-php/src/MarkdownIt/ParserCore.php |
188 | /var/www/vendor/kaoken/markdown-it-php/src/MarkdownIt/RulesCore/Normalize.php |
189 | /var/www/vendor/kaoken/markdown-it-php/src/MarkdownIt/RulesCore/Block.php |
190 | /var/www/vendor/kaoken/markdown-it-php/src/MarkdownIt/RulesCore/Inline.php |
191 | /var/www/vendor/kaoken/markdown-it-php/src/MarkdownIt/RulesCore/Linkify.php |
192 | /var/www/vendor/kaoken/markdown-it-php/src/MarkdownIt/RulesCore/ReplaceMents.php |
193 | /var/www/vendor/kaoken/markdown-it-php/src/MarkdownIt/RulesCore/SmartQuotes.php |
194 | /var/www/vendor/kaoken/markdown-it-php/src/MarkdownIt/RulesCore/TextJoin.php |
195 | /var/www/vendor/kaoken/markdown-it-php/src/MarkdownIt/Renderer.php |
196 | /var/www/vendor/kaoken/markdown-it-php/src/MarkdownIt/Rules/DefaultRules.php |
197 | /var/www/vendor/kaoken/markdown-it-php/src/LinkifyIt/LinkifyIt.php |
198 | /var/www/vendor/kaoken/markdown-it-php/src/LinkifyIt/Def.php |
199 | /var/www/vendor/kaoken/markdown-it-php/src/LinkifyIt/Re.php |
200 | /var/www/vendor/kaoken/markdown-it-php/src/MarkdownIt/Helpers/Helpers.php |
201 | /var/www/vendor/kaoken/markdown-it-php/src/MarkdownIt/Helpers/ParseLinkDestination.php |
202 | /var/www/vendor/kaoken/markdown-it-php/src/MarkdownIt/Helpers/ParseLinkLabel.php |
203 | /var/www/vendor/kaoken/markdown-it-php/src/MarkdownIt/Helpers/ParseLinkTitle.php |
204 | /var/www/vendor/kaoken/markdown-it-php/src/Punycode/Punycode.php |
205 | /var/www/vendor/kaoken/markdown-it-php/src/MDUrl/MDUrl.php |
206 | /var/www/vendor/kaoken/markdown-it-php/src/MDUrl/DecodeTrait.php |
207 | /var/www/vendor/kaoken/markdown-it-php/src/MDUrl/EncodeTrait.php |
208 | /var/www/vendor/kaoken/markdown-it-php/src/MDUrl/FormatTrait.php |
209 | /var/www/vendor/kaoken/markdown-it-php/src/MDUrl/ParseTrait.php |
210 | /var/www/vendor/kaoken/markdown-it-php/src/MarkdownIt/Presets/PresetDefault.php |
211 | /var/www/vendor/kaoken/markdown-it-php/src/MarkdownIt/Plugins/MarkdownItEmoji.php |
212 | /var/www/vendor/kaoken/markdown-it-php/src/MarkdownIt/Plugins/Emoji/Data/Shortcuts.php |
213 | /var/www/vendor/kaoken/markdown-it-php/src/MarkdownIt/Plugins/Emoji/NormalizeOpts.php |
214 | /var/www/vendor/kaoken/markdown-it-php/src/MarkdownIt/Plugins/Emoji/Render.php |
215 | /var/www/vendor/kaoken/markdown-it-php/src/MarkdownIt/Plugins/Emoji/Replace.php |
216 | /var/www/vendor/kaoken/markdown-it-php/src/MarkdownIt/Plugins/MarkdownItSub.php |
217 | /var/www/vendor/kaoken/markdown-it-php/src/MarkdownIt/Plugins/MarkdownItSup.php |
218 | /var/www/vendor/kaoken/markdown-it-php/src/MarkdownIt/Plugins/MarkdownItFootnote.php |
219 | /var/www/vendor/kaoken/markdown-it-php/src/MarkdownIt/Plugins/MarkdownItAbbr.php |
220 | /var/www/vendor/kaoken/markdown-it-php/src/MarkdownIt/Plugins/MarkdownItMark.php |
221 | /var/www/vendor/kaoken/markdown-it-php/src/MarkdownIt/Plugins/MarkdownItIns.php |
222 | /var/www/vendor/kaoken/markdown-it-php/src/MarkdownIt/Plugins/MarkdownItContainer.php |
223 | /var/www/src/Helpers/MarkdownItPlugins/MarkdownItDeflist.php |
Memory | |
---|---|
Usage | 2097152 |