Phalcon Framework 5.6.2

Exception: Input data should be a String

/var/www/vendor/kaoken/markdown-it-php/src/MarkdownIt/MarkdownIt.php (590)
#0Kaoken\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);
    }
}
#1Kaoken\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);
 
  }
 
}
#2App\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;
 
  }
 
}
#3App\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();
 
  }
 
}
#4App\Modules\Info\Controllers\DocumentationController->viewAction
#5Phalcon\Dispatcher\AbstractDispatcher->callActionMethod
#6Phalcon\Dispatcher\AbstractDispatcher->dispatch
#7Phalcon\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;
 
  }
 
}
#8require(/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';
KeyValue
_url/agreement
KeyValue
HOSTNAMEf8d55023ea20
HOME/var/www
XDEBUG_CONFIGremote_host=host.docker.internal - CHOKIDAR_USEPOLLING=true
TERMlinux
PATH/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
DEBIAN_FRONTENDnoninteractive
DE_ENVprod
PWD/var/www
USERwww-data
HTTP_HOSTdolceeda.com
HTTP_ACCEPT_ENCODINGgzip, br, zstd, deflate
HTTP_USER_AGENTMozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; ClaudeBot/1.0; +claudebot@anthropic.com)
HTTP_ACCEPT*/*
PHP_VALUEupload_max_filesize=300M \n post_max_size=300M
PATH_INFO
PATH_TRANSLATED/var/www/public
SCRIPT_FILENAME/var/www/public/index.php
REDIRECT_STATUS200
SERVER_NAMEdolceeda.com
SERVER_PORT443
SERVER_ADDR172.18.0.6
REMOTE_PORT55858
REMOTE_ADDR3.135.201.101
SERVER_SOFTWAREnginx/1.27.3
GATEWAY_INTERFACECGI/1.1
HTTPSon
REQUEST_SCHEMEhttps
SERVER_PROTOCOLHTTP/1.1
DOCUMENT_ROOT/var/www/public
DOCUMENT_URI/index.php
REQUEST_URI/agreement
SCRIPT_NAME/index.php
CONTENT_LENGTH
CONTENT_TYPE
REQUEST_METHODGET
QUERY_STRING_url=/agreement&
FCGI_ROLERESPONDER
PHP_SELF/index.php
REQUEST_TIME_FLOAT1734893225.5415
REQUEST_TIME1734893225
start_time1734893225.5447
start_memory878568
#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
Usage2097152