jonnybarnes.uk/app/Models/Article.php
Jonny Barnes 427b79f278 Improve syntax highlighting of code
Squashed commit of the following:

commit eb55e94ed89a1b8ccd1db10a36efd28d8896f316
Author: Jonny Barnes <jonny@jonnybarnes.uk>
Date:   Thu Jan 24 18:45:00 2019 +0000

    Remove un-needed use statments, fix tests now we have 2 articles

commit f1c12c1b43d071fe0484407a9692ee4184542437
Author: Jonny Barnes <jonny@jonnybarnes.uk>
Date:   Wed Jan 23 19:39:56 2019 +0000

    Remove prism files

commit 3a1d12d9181600f661593c662dbc18d152413b28
Author: Jonny Barnes <jonny@jonnybarnes.uk>
Date:   Wed Jan 23 19:39:24 2019 +0000

    Use the new css file in the search page

commit 119b6b5163c217a15770004a45b07bacdfb766f0
Author: Jonny Barnes <jonny@jonnybarnes.uk>
Date:   Wed Jan 23 19:36:14 2019 +0000

    Recompress assets

commit afae245d0211dd31fcc131cecb0fab4084895612
Author: Jonny Barnes <jonny@jonnybarnes.uk>
Date:   Sun Jan 20 19:33:56 2019 +0000

    Style codeblocks in articles as well

commit 53be0a2023755c2f16ba1560d88f9c66675b581d
Author: Jonny Barnes <jonny@jonnybarnes.uk>
Date:   Sun Jan 20 19:23:25 2019 +0000

    Styled codeblocks are now on the notes pages

commit 818add06f349874501cc44baf332dc63dfdcfab1
Author: Jonny Barnes <jonny@jonnybarnes.uk>
Date:   Sun Jan 20 19:08:56 2019 +0000

    Install spatie’s commonmark highlighter, use it for notes

commit fb69d98b2bd3bb56540854fe16200c027e5ef6b2
Author: Jonny Barnes <jonny@jonnybarnes.uk>
Date:   Sun Jan 20 18:54:27 2019 +0000

    Remove links to prism code in the notes pages

commit dc89fcd4711b25e8407be9b25b58cd4cd1e9980e
Author: Jonny Barnes <jonny@jonnybarnes.uk>
Date:   Sun Jan 20 18:54:11 2019 +0000

    Add a note to the seeder which has a code block
2019-01-24 19:19:45 +00:00

149 lines
3.7 KiB
PHP

<?php
declare(strict_types=1);
namespace App\Models;
use League\CommonMark\Environment;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Builder;
use Cviebrock\EloquentSluggable\Sluggable;
use League\CommonMark\CommonMarkConverter;
use Illuminate\Database\Eloquent\SoftDeletes;
use League\CommonMark\Block\Element\FencedCode;
use League\CommonMark\Block\Element\IndentedCode;
use Spatie\CommonMarkHighlighter\FencedCodeRenderer;
use Spatie\CommonMarkHighlighter\IndentedCodeRenderer;
class Article extends Model
{
use Sluggable;
use SoftDeletes;
/**
* The attributes that should be mutated to dates.
*
* @var array
*/
protected $dates = ['created_at', 'updated_at', 'deleted_at'];
/**
* The database table used by the model.
*
* @var string
*/
protected $table = 'articles';
/**
* Return the sluggable configuration array for this model.
*
* @return array
*/
public function sluggable(): array
{
return [
'titleurl' => [
'source' => 'title',
],
];
}
/**
* We shall set a blacklist of non-modifiable model attributes.
*
* @var array
*/
protected $guarded = ['id'];
/**
* Process the article for display.
*
* @return string
*/
public function getHtmlAttribute(): string
{
$environment = Environment::createCommonMarkEnvironment();
$environment->addBlockRenderer(FencedCode::class, new FencedCodeRenderer());
$environment->addBlockRenderer(IndentedCode::class, new IndentedCodeRenderer());
$commonMarkConverter = new CommonMarkConverter([], $environment);
return $commonMarkConverter->convertToHtml($this->main);
}
/**
* Convert updated_at to W3C time format.
*
* @return string
*/
public function getW3cTimeAttribute(): string
{
return $this->updated_at->toW3CString();
}
/**
* Convert updated_at to a tooltip appropriate format.
*
* @return string
*/
public function getTooltipTimeAttribute(): string
{
return $this->updated_at->toRFC850String();
}
/**
* Convert updated_at to a human readable format.
*
* @return string
*/
public function getHumanTimeAttribute(): string
{
return $this->updated_at->diffForHumans();
}
/**
* Get the pubdate value for RSS feeds.
*
* @return string
*/
public function getPubdateAttribute(): string
{
return $this->updated_at->toRSSString();
}
/**
* A link to the article, i.e. `/blog/1999/12/25/merry-christmas`.
*
* @return string
*/
public function getLinkAttribute(): string
{
return '/blog/' . $this->updated_at->year . '/' . $this->updated_at->format('m') . '/' . $this->titleurl;
}
/**
* Scope a query to only include articles from a particular year/month.
*
* @return \Illuminate\Database\Eloquent\Builder
*/
public function scopeDate($query, int $year = null, int $month = null): Builder
{
if ($year == null) {
return $query;
}
$start = $year . '-01-01 00:00:00';
$end = ($year + 1) . '-01-01 00:00:00';
if (($month !== null) && ($month !== 12)) {
$start = $year . '-' . $month . '-01 00:00:00';
$end = $year . '-' . ($month + 1) . '-01 00:00:00';
}
if ($month === 12) {
$start = $year . '-12-01 00:00:00';
$end = ($year + 1) . '-01-01 00:00:00';
}
return $query->where([
['updated_at', '>=', $start],
['updated_at', '<', $end],
]);
}
}