Skip to content

Commit

Permalink
Start work on library
Browse files Browse the repository at this point in the history
  • Loading branch information
danielstjules committed Jul 10, 2013
1 parent f7e12a4 commit fa13bfb
Show file tree
Hide file tree
Showing 6 changed files with 382 additions and 1 deletion.
19 changes: 19 additions & 0 deletions LICENSE.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
Copyright (C) 2013 Daniel St. Jules

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
106 changes: 105 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,108 @@
Stringy
=======

A PHP library with a variety of string manipulation methods.
A PHP library with a variety of multibyte string manipulation functions.

Usage
-----

```php
use Stringy\Stringy as S;
```

**upperCaseFirst**

S::upperCaseFirst($string [, $encoding])

Converts the first character of the supplied string to upper case, with
support for multibyte strings.

```php
S::upperCaseFirst('σ test', 'UTF-8'); // 'Σ test'
```

**lowerCaseFirst**

S::lowerCaseFirst($string [, $encoding])

Converts the first character of the supplied string to lower case, with
support for multibyte strings.

```php
S::lowerCaseFirst('Σ test', 'UTF-8'); // 'σ test'
```

**camelize**

S::camelize($string [, $encoding])

Returns a camelCase version of a supplied string, with multibyte support.
Trims surrounding spaces, capitalizes letters following digits, spaces,
dashes and underscores, and removes spaces, dashes, underscores.

```php
S::camelize('Camel-Case'); // 'camelCase'
```

**upperCamelize**

S::upperCamelize($string [, $encoding])

Returns an UpperCamelCase version of a supplied string, with multibyte
support. Trims surrounding spaces, capitalizes letters following digits,
spaces, dashes and underscores, and removes spaces, dashes, underscores.

```php
S::upperCamelize('Upper Camel-Case'); // 'UpperCamelCase'
```

TODO
----

**dasherize**

**underscored**

**swapCase**

**dashes**

**underscores**

**title**

**sentence**

**center**

**endsWith**

**beginsWith**

**toSpaces**

**toTabs**

**slugify**

**contains**

**clean**

**between**

**insert**

**nextChar**

**truncateByChars**

**truncateByWords**

**longestCommonPrefix**

**longestCommonSubstring**

**isJson**

**toAnchor**
20 changes: 20 additions & 0 deletions composer.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
{
"name": "danielstjules/Stringy",
"description": "A PHP library with a variety of multibyte string manipulation functions.",
"keywords": ["multibyte", "string", "manipulation", "utf-8", "helpers", "utils"],
"license": "MIT",
"authors": [
{
"name": "Daniel St. Jules",
"email": "[email protected]",
"homepage": "http://www.danielstjules.com"
}
],
"minimum-stability": "stable",
"require": {
"php": ">=5.3.0"
},
"autoload": {
"psr-0": { "Stringy": "src/" }
}
}
11 changes: 11 additions & 0 deletions phpunit.xml.dist
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>

<phpunit processIsolation="false"
stopOnFailure="false"
syntaxCheck="false">
<testsuites>
<testsuite name="Stringy">
<directory>tests/Stringy</directory>
</testsuite>
</testsuites>
</phpunit>
111 changes: 111 additions & 0 deletions src/Stringy/Stringy.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,111 @@
<?php

namespace Stringy;

class Stringy {

/**
* Checks that the first argument ($ars[0]) supplied to the private method
* is a string, and throws an exception if not. And if not provided, sets
* the second argument ($ars[1]) to mb_internal_encoding(). It then calls
* the static method.
*
* @param string $method Private static method being called
* @param array $args Array of arguments supplied to the method call
* @return string String returned by the private method called
* @throws BadMethodCallException If $method doesn't exist
* @throws InvalidArgumentException If $args[0] is not of type string
*/
public static function __callStatic($method, $args) {
if (!method_exists(__CLASS__, $method))
throw new \BadMethodCallException("Method doesn't exist");

if (!is_string($args[0])) {
// Scalar type hinting isn't allowed, so have to throw exceptions
$message = sprintf('Argument of type string expected, instead ' .
'received an argument of type %s', gettype($args[0]));

throw new \InvalidArgumentException($message, $args[0]);
}

// Set the character encoding ($args[1]/$encoding) if not provided
if (sizeof($args) == 1 || !$args[1])
$args[1] = mb_internal_encoding();

return forward_static_call(array(__CLASS__, $method), $args[0], $args[1]);
}

/**
* Converts the first character of the supplied string to upper case, with
* support for multibyte strings.
*
* @param string $string String to modify
* @param string $encoding The character encodng
* @return string String with the first character being upper case
*/
private static function upperCaseFirst($string, $encoding) {
$first = mb_substr($string, 0, 1, $encoding);
$rest = mb_substr($string, 1, mb_strlen($string, $encoding) - 1, $encoding);

return mb_strtoupper($first, $encoding) . $rest;
}

/**
* Converts the first character of the supplied string to lower case, with
* support for multibyte strings.
*
* @param string $string String to modify
* @param string $encoding The character encodng
* @return string String with the first character being lower case
*/
private static function lowerCaseFirst($string, $encoding) {
$first = mb_substr($string, 0, 1, $encoding);
$rest = mb_substr($string, 1, mb_strlen($string, $encoding) - 1, $encoding);

return mb_strtolower($first, $encoding) . $rest;
}

/**
* Returns a camelCase version of a supplied string, with multibyte support.
* Trims surrounding spaces, capitalizes letters following digits, spaces,
* dashes and underscores, and removes spaces, dashes, underscores.
*
* @param string $string String to convert to camelCase
* @return string String in camelCase
*/
private static function camelize($string, $encoding) {
$camelCase = preg_replace_callback(
'/[-_\s]+(.)?/u',
function ($matches) use (&$encoding) {
return $matches[1] ? mb_strtoupper($matches[1], $encoding) : "";
},
self::lowerCaseFirst(trim($string), $encoding)
);

$camelCase = preg_replace_callback(
'/[\d]+(.)?/u',
function ($matches) use (&$encoding) {
return mb_strtoupper($matches[0], $encoding);
},
$camelCase
);

return $camelCase;
}

/**
* Returns an UpperCamelCase version of a supplied string, with multibyte
* support. Trims surrounding spaces, capitalizes letters following digits,
* spaces, dashes and underscores, and removes spaces, dashes, underscores.
*
* @param string $string String to convert to UpperCamelCase
* @return string String in UpperCamelCase
*/
private static function upperCamelize($string, $encoding) {
$camelCase = self::camelize($string, $encoding);

return self::upperCaseFirst($camelCase, $encoding);
}
}

?>
116 changes: 116 additions & 0 deletions tests/Stringy/StringyTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,116 @@
<?php

$base = realpath(dirname(__FILE__) . '/../..');
require("$base/src/Stringy/Stringy.php");

use Stringy\Stringy as S;

class StringyTestCase extends PHPUnit_Framework_TestCase {

/**
* @expectedException BadMethodCallException
*/
public function testExceptionOnUndefinedMethod() {
S::doesntExist('test', 'UTF-8');
}

/**
* @expectedException InvalidArgumentException
*/
public function testExceptionWithInvalidArgument() {
S::camelize(1, 'UTF-8');
}

/**
* @dataProvider stringsForUpperCaseFirst
*/
public function testUpperCaseFirst($string, $expected, $encoding = null) {
$result = S::upperCaseFirst($string, $encoding);
$this->assertEquals($expected, $result);
}

public function stringsForUpperCaseFirst() {
$testData = array(
array('Test', 'Test'),
array('test', 'Test'),
array('σ test', 'Σ test', 'UTF-8')
);

return $testData;
}

/**
* @dataProvider stringsForLowerCaseFirst
*/
public function testLowerCaseFirst($string, $expected, $encoding = null) {
$result = S::lowerCaseFirst($string, $encoding);
$this->assertEquals($expected, $result);
}

public function stringsForLowerCaseFirst() {
$testData = array(
array('Test', 'test'),
array('test', 'test'),
array('Σ test', 'σ test', 'UTF-8')
);

return $testData;
}

/**
* @dataProvider stringsForCamelize
*/
public function testCamelize($string, $expected, $encoding = null) {
$result = S::camelize($string, $encoding);
$this->assertEquals($expected, $result);
}

public function stringsForCamelize() {
$testData = array(
array('CamelCase', 'camelCase'),
array('Camel-Case', 'camelCase'),
array('camel case', 'camelCase'),
array('camel -case', 'camelCase'),
array('camel - case', 'camelCase'),
array('camel_case', 'camelCase'),
array('camel c test', 'camelCTest'),
array('string_with1number', 'stringWith1Number'),
array('string-with-2-2 numbers', 'stringWith22Numbers'),
array('camel σase', 'camelΣase', 'UTF-8'),
array('Σamel case', 'σamelCase', 'UTF-8'),
array('σamel Case', 'σamelCase', 'UTF-8')
);

return $testData;
}

/**
* @dataProvider stringsForUpperCamelize
*/
public function testUpperCamelize($string, $expected, $encoding = null) {
$result = S::upperCamelize($string, $encoding);
$this->assertEquals($expected, $result);
}

public function stringsForUpperCamelize() {
$testData = array(
array('camelCase', 'CamelCase'),
array('Camel-Case', 'CamelCase'),
array('camel case', 'CamelCase'),
array('camel -case', 'CamelCase'),
array('camel - case', 'CamelCase'),
array('camel_case', 'CamelCase'),
array('camel c test', 'CamelCTest'),
array('string_with1number', 'StringWith1Number'),
array('string-with-2-2 numbers', 'StringWith22Numbers'),
array('camel σase', 'CamelΣase', 'UTF-8'),
array('σamel case', 'ΣamelCase', 'UTF-8'),
array('Σamel Case', 'ΣamelCase', 'UTF-8')
);

return $testData;
}

}

?>

0 comments on commit fa13bfb

Please sign in to comment.