PHPackages                             ksnk/text - 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. ksnk/text

ActiveLibrary

ksnk/text
=========

text based function in one class

1.0.21(1y ago)0128MITPHPPHP &gt;=7.3

Since Oct 23Pushed 4mo ago1 watchersCompare

[ Source](https://github.com/Ksnk/text)[ Packagist](https://packagist.org/packages/ksnk/text)[ RSS](/packages/ksnk-text/feed)WikiDiscussions master Synced today

READMEChangelog (1)Dependencies (1)Versions (21)Used By (0)

Текстовые утилиты
=================

[](#текстовые-утилиты)

Все утилиты выполнены в виде функций единственного класса `tpl`. Класс, непосредственно реализующий функционал - `Model_tpl`, однако для удобства применения каждая функция может быть вызвана как статическая функция `tpl`. Вызов статического синонима, как правило, более компактен и не требует предварительного создания класса, однако в классическом виде можно настроить поведение более гибко. И с наследованием все значительно более правильно. Впрочем, обычно это не нужно.

Несомненной пользой класса является тот факт, что класс одинаково хорошо работает как в обычном, так и битриксовском серверном окружении.

Использование
-------------

[](#использование)

```
use Ksnk\text\tpl;
$data=[
    'promo'=>'СКОРОЛЕТО',
    'first_name'=>'Вагоноуважатый',
    'discountrub'=>250,
    'prop'=>tpl::prop(2345,tpl::RUB),
    'date'=>'now'
    ];
echo tpl::text('Глубокоуважаемый{first_name?{ first_name}{ second_name}}!
При оформлении заказа от {date|d}, Вам предоставлена скидка {discountrub?{discountrub}₽:{discount}%} по промокоду `{promo}`
Общая сумма заказа составляет: {prop}
',$data);
/*
Глубокоуважаемый Вагоноуважатый!
    При оформлении заказа от 25 октября, Вам предоставлена скидка 250₽ по промокоду `СКОРОЛЕТО`
    Общая сумма заказа составляет: две тысячи триста сорок пять рублей
*/

```

установка
---------

[](#установка)

```
composer require ksnk/text

```

По сути - там пара файлов, в случае серьезной нужды - поковыряйтесь в репозитории, скопируйте его себе и делайте с ним что угодно. Но не дай БГ так оголодать ))) композер - это действительно удобно.

Сама реализация допускает небольшую модификацию шаблонизатора на лету или полное перенаследование класса с сохранением опции статического вызова уже переопределенных функций.

Вывод числа прописью. tpl::prop($number, $podpis, $kop = FALSE)
---------------------------------------------------------------

[](#вывод-числа-прописью-tplpropnumber-podpis-kop--false)

Первый параметр - число, если число не целое, целая часть выводится словами, вторая цифрами, с обрезанием на 2 цифры. Подпись к обоим частям - второй параметр. `"рубл|ь|я|ей;+копе|йка|йки|ек";`Третий параметр говорит - можно ли опускать вывод `00 коп`.

При выводе числа учитывается склонение. Женский род помечается ведущим символом `+`, при указании второго параметра функции

```
$number=101;
//'сто один баран на поле', склонение в мужском роде - один-два
tpl::text('{prop} на поле', [
    'prop'=>tpl::prop($number,"баран||а|ов")]);
);
// проверка склонения в женском роде одна-две вместо один-два
//'сто одна овца на поле',
tpl::text('{prop} на поле', [
    'prop'=>tpl::prop($number,"+овц|а|ы|ец")]) ;

```

Классический вывод цены с копейками

```
// двадцать три тысячи четыреста пятьдесят шесть рублей 45 копеек
echo tpl:prop(23456.45, tpl::RUB, true);

```

Вывод русской даты. tpl::rusd($time,$format)
--------------------------------------------

[](#вывод-русской-даты-tplrusdtimeformat)

К удивлению, в PHP до сих пор из коробки отсутствует возможность вывода даты по-русски, с названиями в родительном падеже. Только в именительном. Как же так?

```
// так советуют писать тру ПХПшники
setlocale(LC_ALL, 'ru_RU', 'ru_RU.UTF-8', 'ru', 'russian');
echo strftime("%B %d, %Y", time()).PHP_EOL;
// Октябрь 25, 2022

// Так хочет бухгалтер
tpl::rusd(time(), "j F"); // 25 октября.

```

Используется формат даты для обычного вывода даты по английски. Можно таймстамп, можно строковое значение из базы, которое понимается оператором strtotime. Если требуется умное преобразование дат - лучше сделать это вне шаблонизатора и передать уже нужный таймстамп.

plural form. tpl::pl
--------------------

[](#plural-form-tplpl)

Окончания для числительных. Параметр в строковом виде, `ОДИН, ТРИ, ПЯТЬ`.

```
echo 25.' копе'.tpl::pl(25, 'копейка', 'копейки', 'копеек');

```

Впрочем, самостоятельного применения практически не имеет, обычно в составе шаблона. Опять же, формат параметров в строке чуть-чуть отличается от используемого функцией `text`, что делает явное использование функции, скорее, вредной практикой. В шаблонах используется более компактная форма вызова - одна строка параметров, разделенных `|`. Например этот промер через `::text`выглядит более управляемо

```
echo tpl::text('{kop} копе{|йка|йки|еек}',['kop'=>25]);

```

парсинг сокращенных чисел. tpl::parseKMG
----------------------------------------

[](#парсинг-сокращенных-чисел-tplparsekmg)

Переводит в число строковые cокращения вида .5k 1K и т.д.

```
echo tpl::parseKMG('.25Г'); // четверть гига - 268435456

```

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

tpl::text
---------

[](#tpltext)

Форматированный вывод с подстановкой значений.

- первый параметр - шаблон
- второй параметр - данные. Лучше если это будет объект, однако, не обязательно, внутри функции он будет преобразован в объект явным образом. Так как наличие свойств в этом объекте проверяется методом `property_exists` - передавать объект с магическими свойствами будет значительно сложнее.

В шаблоне могут встречаться операторы-подстановки - переменная в фигурных скобках. В конце переменной могут находиться модификаторы, отделяемые символом `|`. Пример `{date|t}`Ведущие пробелы перед переменной в подстановке выводятся вместе со значением подстановки, если значение не пусто.

```
$data=[
    'first_name'=>'Вассисуалий',
    'second_name'=>'Лоханкин',
    'joined'=>'2022-10-15'
];

echo tpl::text('Уважаемый{ first_name}{ second_name}!', $data);

```

Такое не очень обычное обращение с ведущими пробелами подстановки позволяет генерировать корректные с точки зрения лишних пробелов конструкции - `Уважаемый Вассисуалий!` `Уважаемый!` `Уважаемый Лоханкин!` `Уважаемый Вассисуалий Лоханкин!`

Некоторые символы имеют служебный смысл и, могут, а в некоторых местах обязаны быть заслешены, чтобы они не использовались шаблонизатором. Эти символы `{}?:\|`.

Продемонстрируем чудеса эскейпинга. Технически, не обязательно эскейпить все служебные символы внутри подстановки, необходимо только те, которые ожидаются по синтаксису, однако, если их эскейпить все - результат будет точно такой же. Наиболее удобным способом поставить нужные слеши в PHP будет `addcslashes($x,'{}?:\|');`.

```
// не все служебные символы прослешены, но синтаксис позволяет
$pattern = 'Сумма прописью:{ Очень странная переменная {1\|2\}\?: }';
// 'Сумма прописью: А вот!',
echo    tpl::text($pattern, ['Очень странная переменная {1|2}?:' => 'А вот!']);

// все служебные символы прослешены
$pattern = 'Сумма прописью:{ Очень странная переменная \{1\|2\}\?\: }';
// 'Сумма прописью: А вот еще!',
echo    tpl::text($pattern, ['Очень странная переменная {1|2}?:' => 'А вот еще!']);

// правильный способ, всегда дающий правильный результат
$key='Очень странная переменная {1|2}?:';
$pattern = 'Сумма прописью:{ '.addcslashes($key,'{}?:\|').' }';
echo    tpl::text($pattern, [$key => 'А вот еще!']);

```

Кроме подстановок имеются логические тернарные операторы. Если значение параметра-подстановнки не пусто, выбирается первый операнд, если пусто - второй. Нужно отметить, что ведущие пробелы внутри условия тернарного оператора игнорируются, внутри операндов работают в обычном режиме.

```
echo tpl::text('Уважаемый {joined?подписчик:посетитель}!', $data);

```

Внутри операндов также могут находиться подстановки и логические операторы.

```
echo tpl::text('Уважаемый {first_name?:посетитель}!', $data);

```

Условный оператор в виде `?:` имеет несколько отличающуюся от очевидной логику вывода. Если параметр не пуст, выводится он, если пуст - выводится значение по умолчанию. Фактически, является сокращением `{first_name?{first_name}:посетитель}`

Внутри "условной" части тернарного оператора могут быть вычисляемые конструкции

```
tpl::text(
"Ваш счет - {count} из {total}. {10
