PHPackages                             ermakk/ms-cs-component - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Parsing &amp; Serialization](/categories/parsing)
4. /
5. ermakk/ms-cs-component

ActiveLibrary[Parsing &amp; Serialization](/categories/parsing)

ermakk/ms-cs-component
======================

A component for Moonshine that displays the structure of markdown or other text as a hierarchical menu based on h1-h6 headings

1.6(10mo ago)07MITPHPPHP ^8.2|^8.3|^8.4

Since Jul 10Pushed 10mo agoCompare

[ Source](https://github.com/ermakk/ms-content-struct-component)[ Packagist](https://packagist.org/packages/ermakk/ms-cs-component)[ RSS](/packages/ermakk-ms-cs-component/feed)WikiDiscussions master Synced 1mo ago

READMEChangelog (7)Dependencies (2)Versions (8)Used By (0)

MoonShine content parse to structure menu component
===================================================

[](#moonshine-content-parse-to-structure-menu-component)

Данный пакет представляет собой компонент для структурирования и обработки контентных блоков. Компонент предназначен для удобного разделения текста на логические блоки и автоматического формирования структуры документа. Использование компонента помогает упростить работу с большими объемами контента и повысить читаемость материала.

   ![cover](./art/image.png)Компонент парсит переданное в него содержимое на предмет заголовков разного уровня (h1-h6). Модифицирует контент таким образом, чтобы все заголовки имели идентификатор. Строит из них иерархическую структуру и формирует из этой структуры меню с якорными ссылками на обновленный контент.

Заголовки, которые уже имеют идентификатор, так же попадут в меню, при этом их идентификатор затронут и изменен не будет!

Requirements
------------

[](#requirements)

- MoonShine v3+
- Laravel v10+
- PHP v8.2+

Install
-------

[](#install)

```
composer require ermakk/ms-cs-component
```

Добавьте провайдер в ваш `config/app.php`

```
'providers' => ServiceProvider::defaultProviders()->merge([

//...

        \Ermakk\CSComponent\Providers\CSComponentServiceProvider::class

//...

])->toArray(),
```

Usage
-----

[](#usage)

Для вывода оглавления используется компонент `Menu`. Для инициализации обязателен один параметр - content В качестве контента в меню передается класс реализующий интерфейс `ContentContract`Задача этого класса - преобразование содержимого из необходимой вам разметки в HTML для дальнейшего парсинга заголовков.

Вы можете создавать свои классы контента для вашей разметки, либо использовать существующие:

- `\Ermakk\CSComponent\Converters\MarkdownConverter`(Преобразует markdown разметку в html для дальнейшей работы парсера)
- `\Ermakk\CSComponent\Converters\Html`(не конвертирует контент, но даже если у вас контент был в html разметке - необходимо передавать его в меню именно через класс)

В качестве второго аргумента можно передать класс парсера, для того чтобы переопределить поведение, разметку, правила генерации идентификаторов и т. п.

По умолчанию используется `Ermakk\CSComponent\Parsers\HTMLParser`

```
use Ermakk\CSComponent\Components\StructureMenu\Menu;
use \Ermakk\CSComponent\Converters\MarkdownConverter;

Menu::make(MarkdownConverter::make($content))
```

По умолчанию все якорные ссылки генерируются исходя из текущей, но могут появиться ситуации, когда будет необходимость вручную задать базу для ссылки. Для этого можно воспользоваться методом `setRoute(?Closure $route)` у объекта `Menu`

```
use Ermakk\CSComponent\Components\StructureMenu\Menu;
use \Ermakk\CSComponent\Converters\MarkdownConverter;

// в таком случае все что вернет замыкание, будет использовано в качестве якорной ссылки
// обратите внимание, что в таком случае вам нужно будет вручную добавить '#'.$item->id()
// к возвращаемому замыканием значению

Menu::make(MarkdownConverter::make($content))->setRoute(fn(StructureItem $item) => 'Ваш роут'.'#'.$item->id());
```

Последнее, что осталось сделать для полноценной работы - заменить контент на обновленный, чтобы у всех заголовков появились идентификаторы.

Для этого можно компонент не сразу встраивать в методы формирующие страницу moonshine, а объявить в классе страницы переменную и в нее при формировании страницы поместить наше меню. А затем с помощью метода `getParser()` получить объект парсера и от него уже можно будет вернуть обновленную разметку

```
    Str::markdown($this->structureMenu->getParser()->getNewHtml()),
```

В таком случае вы можете повторно использовать компонент Menu без повторного парсинга

Второй метод, для возврата обновленной разметки - это использовать метод `getNewHtml()` прямо от объекта `Menu`

```
//...
   Menu(MarkdownConverter::make($resource->getItem()->content))
    ->getNewHtml($this->newContent)
    ->setTitle('Оглавление')
//...
```

в метод getNewHtml необходимо передать переменную, куда будет помещено новое значение

### Methods

[](#methods)

- `setTitle(string $title)` - устанавливает заголовок меню
- `setPlaceholder(string $placeholder)` - устанавливает сообщение, которое отображается, когда нет содержимого
- `simpleMode(bool $condition)` - меняет режим отображения

    - `true` - простой режим, отображает только набор пунктов
    - `false` - стандартный режим, используемый по умолчанию, отображает заголовок меню и пункты в контейнере .box
- `getNewHtml()` - принимает в качестве параметра переменную, куда по ссылке помещает обновленную разметку
- так как `Menu` наследует `MoonShineComponent`, то будут доступны любые другие доступные для родительского класса методы

### Published

[](#published)

Вы можете стандартными средствами laravel опубликовать ресурсы, для изменения внешнего вида

```
   php artisan vendor:publish --provider="Ermakk\CSComponent\Providers\CSComponentServiceProvider"
```

### Advanced

[](#advanced)

Пакет построен так, чтобы можно было дополнять его своими парсерами или конвертерами. Поэтому вы можете менять логику его работы

###  Health Score

33

—

LowBetter than 75% of packages

Maintenance54

Moderate activity, may be stable

Popularity4

Limited adoption so far

Community2

Small or concentrated contributor base

Maturity59

Maturing project, gaining track record

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~0 days

Total

7

Last Release

312d ago

PHP version history (2 changes)1.0PHP ^8.2

1.5PHP ^8.2|^8.3|^8.4

### Community

Maintainers

![](https://www.gravatar.com/avatar/17f63ce8fb4fab25269fd5ba965aa9be8d11633ee930bdb352f44482d53b23b0?d=identicon)[ermakk](/maintainers/ermakk)

---

Tags

htmlmarkdownmenuparsestructurecomponentmoonshine

###  Code Quality

Static AnalysisRector

### Embed Badge

![Health badge](/badges/ermakk-ms-cs-component/health.svg)

```
[![Health](https://phpackages.com/badges/ermakk-ms-cs-component/health.svg)](https://phpackages.com/packages/ermakk-ms-cs-component)
```

###  Alternatives

[league/html-to-markdown

An HTML-to-markdown conversion helper for PHP

1.9k28.6M199](/packages/league-html-to-markdown)[pixel418/markdownify

The HTML to Markdown converter for PHP

196800.8k8](/packages/pixel418-markdownify)[texy/texy

Texy converts plain text in easy to read Texy syntax into structurally valid (X)HTML. It supports adding of images, links, nested lists, tables and has full support for CSS. Texy supports hyphenation of long words (which reflects language rules), clickable emails and URL (emails are obfuscated against spambots), national typographic single and double quotation marks, ellipses, em dashes, dimension sign, nonbreakable spaces (e.g. in phone numbers), acronyms, arrows and many others. Texy code can optionally contain HTML tags.

161838.9k15](/packages/texy-texy)[olamedia/nokogiri

HTML Parser

23176.3k3](/packages/olamedia-nokogiri)[interaction-design-foundation/nova-html-card

A Laravel Nova card to display arbitrary HTML content

67731.2k3](/packages/interaction-design-foundation-nova-html-card)[dimabdc/php-fast-simple-html-dom-parser

PHP Fast Simple HTML DOM parser.

9352.6k](/packages/dimabdc-php-fast-simple-html-dom-parser)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
