nikolay-oskin/contents

Laravel 包,用于生成帖子、新闻、文章等文本的目录表

dev-master 2019-05-26 23:03 UTC

This package is auto-updated.

Last update: 2024-09-27 11:00:53 UTC


README

此包根据输入文本中的 h2-h6 HTML 标签为您提供的帖子、新闻、文章等提供可点击的目录表。

Build Status laravel version

用法

假设您有一些存储在数据库中的帖子(来自 WYSIWYG 编辑器或其他内容),其外观如下

<h2>First h2 header</h2>
<p>Some text</p>    
<h3>First h3 header</h3>
<p>Some text</p>    
<h3>2nd h3 header</h3>
<p>Some text</p>    
<h4>First h4 header</h4>
<p>Some text</p>
<h4>2nd h4</h4>
<p>Some text</p>
<h2>Latest header</h2>

您有一个 PostController,其中包含 show() 方法,该方法将您的 Post 模型对象数据发送到您的视图。

public function show ($id)
{
    $post = Post::find($id);
    $header = $post->title;
    $body = $post->body;
    return view('post', compact('header', 'body');
}

您的 'post.blade.php' 视图非常简单,如下所示

<div>
    <h1>{{$header}}</h1>
    {!! $body !!}
</div>

这就是您如何在控制器中使用此包生成“目录表”的方法

public function show ($id, Contents $contents)
{
    $post = Post::find($id);
    $header = $post->title;
    $body = $contents->fromText($post->body)->getHandledText();
    $contents = $contents->getContents();
    return view('post', compact('header', 'body', 'contents');
}

现在您已经传递了包含您的标题标签的“contents”数组。同时,如您所见,您还传递了“handledText”,它包含标题 HTML 标签中的 id 属性。

您的视图

<div>
    <h1>{{$header}}</h1>
    @if(!empty($contents))
        @include('nikolay-oskin.contents.table', $contents)
    @endif
    {!! $post !!}
</div>

table.blade.php 是带有 ul-li 标签的视图,您可以在其中添加 CSS 样式或进行其他自定义。

结果

Alt text

选项

默认情况下,为 h2-h6 标签创建内容。您可以为包含在“目录表”中的标题标签设置。

示例

public function show ($id, Contents $contents)
{
    $post = Post::find($id);
    $contents->fromText($post->body)->setTags(['h2', 'h3']);
    $body = $contents->getHandledText();
    $contents = $contents->getContents(); 
    return view('post', compact('body', 'contents');
    
    // Only h2 and h3 headers will be added to table of contents
}    

您还可以设置文本的最小长度数字,如果文本长度低于此数字,则 $contents 数组将为空,并且 $contents->getHandledText() 返回原始文本。

示例

public function show ($id, Contents $contents)
{
    $post = Post::find($id);
    $contents->fromText($post->body)->setTags(['h2', 'h3'])->setMinLength(5000);
    $body = $contents->getHandledText();
    $contents = $contents->getContents();
    return view('post', compact('body', 'contents');
    
    // Table of contents will not be shown for texts length less than 5000 chars.
}    

安装

适用于 Laravel 5.5+

composer require nikolay-oskin/contents

将视图复制到您的 resource/views 目录

php artisan vendor:publish --provider="NikolayOskin\Contents\ContentsServiceProvider"

许可证

MIT