GithubHelp home page GithubHelp logo

php_rutils's Introduction

PHP RUtils

Больше не поддерживается

Summary

License Latest Stable Version

Build Status Code Climate

RUtils is a Russian-specific string utils (transliteration, numeral is words, russian dates, typography) for PHP. This is a port of the Python Pytils to PHP.

See additional docs and examples in doc subdir.

Library is published on the Composer: https://packagist.org/packages/andre_487/php_rutils


RUtils — утилиты для работы c текстом на русском языке (транслитерация, числительные словами, русские даты, простая типографика) для языка PHP. RUtils — порт утилит Pytils на PHP.

Документацию и примеры смотрите в каталоге doc.

Библиотека доступна через Composer: https://packagist.org/packages/andre_487/php_rutils

Daily Downloads Monthly Downloads Total Downloads


Буду рад принять помощь по проекту в виде советов, баг-репортов и pull-реквестов.

Проект следует стилю кодирования PSR-2. Стиль проверяется с помощью PHP_CodeSniffer на этапе CI.

Хочу сказать большое спасибо всем людям, внесшим свой вклад в улучшение проекта.


Basic usage

Modules of PHP RUtils:

  • Numeral - Plural forms and in-word representation for numerals
  • Dt - Russian dates without locales and other dates handling
  • Translit - Simple transliteration
  • Typo - Basic russian typography

Numeral

Choosing the word form depending of a number:

$variants = array(
    'гвоздь', //1
    'гвоздя', //2
    'гвоздей' //5
);
echo $amount, ' ', RUtils::numeral()->choosePlural(15, $variants);
//Result: 15 гвоздей

echo RUtils::numeral()->getPlural(2, $variants);
//Result: 2 гвоздя

Choosing the word form and print number in words:

echo RUtils::numeral()->sumString(1234, RUtils::MALE, $variants);
//Result: одна тысяча двести тридцать четыре гвоздя

Print number in words:

$numeral = RUtils::numeral();
echo $numeral->getInWordsInt(100);
//Result: сто

echo $numeral->getInWordsFloat(100.025);
//Result: сто целых двадцать пять тысячных

echo $numeral->getInWords(100.0);
//Result: сто

Print money (RUB):

echo RUtils::numeral()->getRubles(100.25);
//Result: сто рублей двадцать пять копеек

Dt

Today date: \php_rutils\struct\TimeParams - params structure, may be passed as array

$params = new TimeParams();
$params->date = null; //default value, 'now'
$params->format = 'сегодня d F Y года';
$params->monthInflected = true;
echo RUtils::dt()->ruStrFTime($params);
//Result: сегодня 22 октября 2013 года

Historical date:

$params = array(
    'date' => '09-05-1945',
    'format' => 'l d F Y была одержана победа над немецко-фашистскими захватчиками',
    'monthInflected' => true,
    'preposition' => true,
);
echo RUtils::dt()->ruStrFTime($params);
//Result: в среду 9 мая 1945 была одержана победа над немецко-фашистскими захватчиками

Time interval to fixed date:

$toTime = new \DateTime('05-06-1945'); //Unix timestamp and string also available
echo RUtils::dt()->distanceOfTimeInWords($toTime), PHP_EOL;
//Result: 68 лет назад

$toTime = strtotime('05-06-1945');
$fromTime = null; //now
$accuracy = RUtils::ACCURACY_MINUTE; //years, months, days, hours, minutes
echo RUtils::dt()->distanceOfTimeInWords($toTime, $fromTime, $accuracy), PHP_EOL;
//Result: 68 лет, 4 месяца, 21 день, 19 часов, 12 минут назад

Time interval from fixed date to fixed date:

$fromTime = '1988-01-01 11:40';
$toTime = '2088-01-01 12:35';
$accuracy = RUtils::ACCURACY_MINUTE; //years, months, days, hours, minutes
echo RUtils::dt()->distanceOfTimeInWords($toTime, $fromTime, $accuracy), PHP_EOL;
//Result: через 100 лет, 55 минут

Age:

$birthDate = strtotime('today - 25 years');
echo RUtils::dt()->getAge($birthDate);
//Result: 25

Translit

//Translify
echo RUtils::translit()->translify('Муха - это маленькая птичка');
//Result: Muxa - e`to malen`kaya ptichka

//Detranslify
echo RUtils::translit()->detranslify("Muxa - e`to malen`kaya ptichka");
//Result: Муха - это маленькая птичка

//Prepare to use in URLs or file paths
echo RUtils::translit()->slugify('Муха — это маленькая птичка');
//Result: muha-eto-malenkaya-ptichka

Typo

$text = <<<TEXT
...Когда В. И. Пупкин увидел в газете ( это была "Сермяжная правда" № 45) рубрику Weather Forecast (r),
он не поверил своим глазам - температуру обещали +-451F.
TEXT;

//Standard rules
echo RUtils::typo()->typography($text);
/**
 * Result:
 * ...Когда В. И. Пупкин увидел в газете (это была «Сермяжная правда» №45) рубрику Weather Forecast®,
 * он не поверил своим глазам — температуру обещали ±451°F.
 */


//Extended rules
echo RUtils::typo()->typography($text, TypoRules::$EXTENDED_RULES);
/**
 * Result:
 * …Когда В. И. Пупкин увидел в газете (это была «Сермяжная правда» №45) рубрику Weather Forecast®,
 * он не поверил своим глазам — температуру обещали ±451 °F.
 */

//Custom rules
echo RUtils::typo()->typography($text, array(TypoRules::DASHES, TypoRules::CLEAN_SPACES));
/**
 * Result:
 * ...Когда В. И. Пупкин увидел в газете (это была "Сермяжная правда" № 45) рубрику Weather Forecast (r),
 * он не поверил своим глазам — температуру обещали +-451F.
 */

php_rutils's People

Contributors

andre487 avatar boldyrev avatar githubjeka avatar kazip avatar walik91 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

php_rutils's Issues

other phrases for Dt::distanceOfTimeInWords()

$fromTime = '2013-10-24 11:45';
$toTime = '2013-10-23 11:45';
$accuracy = 3;
echo RUtils::dt()->distanceOfTimeInWords($toTime, $fromTime, $accuracy);
//Returns: 1 день назад

I think it would be better if the phrase would be "Днем ранее" or "Вчера" (if $fromTime is today)

$fromTime = '2013-10-24 11:40';
$toTime = '2013-10-24 11:10';
$accuracy = 3;
echo RUtils::dt()->distanceOfTimeInWords($toTime, $fromTime, $accuracy);
//Returns: 30 минут назад

I think it would be better if the phrase would be "полчаса назад" or "через полчаса" (if the variables $fromTime and $toTime are interchanged)

And other similar examples

Использовать среднее тире (en-dash) для числовых диапазонов

Сейчас в правиле Dashes в Typo минус в числовых диапазонах вида "15-30 минут" заменяется на длинное тире. Хотя правила русской типографики и предписывают использовать длинное тире, тире средней длинны в данном случае выглядит значительно лучше и гармоничнее.

Предлагаю использовать именно среднее тире (en-dash) для числовых диапазонов.

Пример:

2014-10-15-01-39-04


Та же аргументация от Лебедева

Composer support

Benefits:

  • Composer has own autoloading system, wich pretty easy to use
  • Packagist (you may set stability level to alpha for now)

Не работает Typo

Странно но эта часть не работает у меня на сервере, но на localhost все в норме.
$p = array(
"#(^|\s)(")(\w)#u",
"#(\w)(")([\s,;:?!.]|$)#u",
"#(^|\s)(')(\w)#u",
"#(\w)(')([\s,;:?!.]|$)#u"
);
$rep = array('$1«$3', '$1»$3', "$1“$3", "$1”$3");

$text = <<<TEXT
...Когда В. И. Пупкин увидел в 'газете' ( это была "Сермяжная правда" № 45) рубрику Weather Forecast (r),
он не поверил своим глазам - температуру обещали +-451F.
TEXT;
echo preg_replace($p, $rep, $text);
// Получаю тот же самый текст

Конфиг PHP
[root@dejur156 etc]# php -v
PHP 5.3.3 (cli) (built: Dec 11 2013 03:29:57)
Copyright (c) 1997-2010 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2010 Zend Technologies
with the ionCube PHP Loader v4.4.4, Copyright (c) 2002-2013, by ionCube Ltd.

Не работают тесты.

У меня 12 тестов не проходятся.

К примеру этот тест фейлится из-за того, что 2016 високосный год.

($nowTime - 366 * 24 * 60 * 60) => "1 год, %d д%s\xC2\xA0назад"

Вот этот был коммит в моем случае испортил тест: 6f14f1a
У меня вариант который был до коммита.

Так же есть несколько странных фейлов вроде:

Failed asserting that two strings are equal.
Expected :'«Вот так вот»'
Actual :'«Вот так вот«'

Ошибка Class 'RUtils' not found in

Код программы

typography($str, TypoRules::$EXTENDED_RULES), PHP_EOL; ?>

выдает

Class 'RUtils' not found in
Подсобите пожалуйста с ООП знаком пока поверхностно постигаю, но понять не могу чего подключенный класс не вызывается.

Ошибка в классе Translit

Warning: preg_replace(): Compilation failed: invalid range in character class at offset 9 in php_rutils/Translit.php on line 114

В строке 114 файла Translit.php :
$inString = preg_replace('/[—−-\s\t]+/u', '-', $inString);
Нужно заэкранировать символ "-" - получится так:
$inString = preg_replace('/[—−-\s\t]+/u', '-', $inString);

Bug "вчера" and "позавчера"

echo RUtils::dt()->distanceOfTimeInWords( new \DateTime('23-06-1945')); //вчера
echo RUtils::dt()->distanceOfTimeInWords(new \DateTime('22-06-1945')); //позавчера

feature request: plural without number

Возможность в getPlural получить только вариант слова, без цифры (яблок, вместо 5 яблок).
Случай использования: дополнительное форматирование у числа. Пример <strong>5</strong> яблок

Предложение по доработке

Часто такая задача возникает народ в комментариях пишет в конце предложения точку, а потом сразу заглавную букву без пробела. Ваша библиотека исправляет вот такой вид "предложение .Новое предложение" правильно, но получается в результате "предложение.Новое предложение" при экстендед typo.

Еще проверил если изначально вот так "предложение.Новое предложение" то все нормально на выходе получается "предложение. Новое предложение", а если изначально вот так "предложение .Новое предложение" то на выходе вот так "предложение.Новое предложение"

namespace php_rutils;

Please use CamelCase for namespace. And remove php_* prefix. We all know what it is an php namespace.

\xa0 in Dt

My code:

 echo RUtils::dt()->ruStrFTime(
            array(
                'date' => $this->model->date,
                'format' => 'l d F Y',
                'monthInflected' => true,
                'preposition' => true,
            )
        );

ALL in UTF-8. And i see: в �

I replaced all \xa0 on \xc2\xa0 in Dt.php. Profit

Mb it my local problem? And may be better was replace "в\xa0" on 'в '?

Force float digits after for Numeral::getInWordsFloat()

По некоторым законодательствам РФ (и не только) требуется указывать сумму включая тысячные.
Один из примеров библитотеки:

echo $numeral->getInWordsFloat(100.025);
//Result: сто целых двадцать пять тысячных

Предлагаю при добавлении параметра $digitsAfterDecimalPoint выдавать следующий результат

echo $numeral->getInWordsFloat(100.500, 2);
//Result: сто целых пятьдесят сотых
echo $numeral->getInWordsFloat(100.500, 3);
//Result: сто целых пятьсот тысячных

detranslify and slugify

  1. Problem:
echo $r = RUtils::translit()->slugify($this->model->obj_connect);
echo RUtils::translit()->detranslify($r);

return "ts" and "ц", original data = "ТС"

  1. Problem with encode $inString = mb_strtolower($inString); in slugify

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.