-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathsnippet.readingTime2.php
52 lines (42 loc) · 2.49 KB
/
snippet.readingTime2.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
<?php
/**
* readingTime
* Вывод времени, необходимого на чтение текущей статьи в часах/минутах или в часах/минутах/секундах.
* для простоты считаются все символы - теги и т.д.
*
* @category snippet
* @version 0.2
* CMS version MODx Evo 7.1.6
*
* @param (float) &k - коэффициент трудности, а точнее скорости чтения материала. С его помощью вносится поправка на время чтения. По дефолту &k=`1`.
* @param (string) &s - нужны ли секунды (1|0). По дефолту 0.
*
* @example [[readingTime? &k = `1,5`]] здесь в параметре ошибка (запятая вместо точки), которая будет исправлена в сниппете
*
* @author Aharito http://aharito.ru
**/
// Если значение &k не указано в вызове сниппета, то делаем равным 1
// заодно исправляем, если вместо десятичной точки человек поставил запятую
$k = isset($k) ? str_replace(",", ".", $k) : 1;
// Если значение &s не указано в вызове сниппета, то делаем равным 0
$s = isset($s) ? $s : 0;
// Время "чтения" одного знака. Исходя из моего эксперимента оно равно 0.042 сек.
$t = 0.042;
// Вычисляем кол-во знаков в статье
$symbolsCount = mb_strlen($modx->documentObject['content']);
// Вычисляем общее время чтения в секундах с учетом коэффициента трудности
$readingTime = $symbolsCount * $t * $k;
// Переводим в часы-минуты
$hours = floor($readingTime / 3600);
if( !$s ) {
// Это если нужно считать с точностью до минут. ceil для того, чтобы для короткой статьи не получилось 0 минут
$min = ceil(($readingTime % 3600) / 60);
} else {
// а это - если до секунд
$min = floor(($readingTime % 3600) / 60);
$sec = round($readingTime - $hours*3600 - $min*60);
}
$hours = ($hours >= 1) ? $hours." ч " : "";
$min = ($min >= 1) ? $min." мин " : "";
$sec = ($sec) ? $sec." сек" : "";
return $hours.$min.$sec;