44 lines
1.1 KiB
PHP
44 lines
1.1 KiB
PHP
<?php
|
|
|
|
use Kirby\Cms\Page;
|
|
|
|
/**
|
|
* @method object categories()
|
|
* @method object tags()
|
|
* @method object date()
|
|
* @method object text()
|
|
*/
|
|
class ArticlePage extends Page
|
|
{
|
|
private const READING_TIME_FORMAT = '%d words, ~%d min reading time';
|
|
|
|
/**
|
|
* @param array|string|null $options
|
|
*/
|
|
public function url($options = null): string
|
|
{
|
|
$date = $this->date()->toDate('Y/m/d');
|
|
return '/' . $date .'/' . $this->slug();
|
|
}
|
|
|
|
public function readingTime(): string
|
|
{
|
|
$doc = new DOMDocument();
|
|
$doc->loadHTML(
|
|
'<html><head><meta charset="UTF-8"><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"></head><body>'
|
|
. $this->text()->kirbytext()
|
|
. '</body></html>'
|
|
);
|
|
$pElems = $doc->getElementsByTagName('p');
|
|
|
|
$text = '';
|
|
foreach ($pElems as $pElem) {
|
|
$text .= $pElem->nodeValue . ' ';
|
|
}
|
|
|
|
$wordCount = count(explode(' ', $text));
|
|
$readingTime = (int)ceil($wordCount / 150);
|
|
|
|
return sprintf(self::READING_TIME_FORMAT, $wordCount, $readingTime);
|
|
}
|
|
}
|