1
0
Fork 0
mirror of https://github.com/ethauvin/kotlin-pluralizer.git synced 2025-04-29 02:08:12 -07:00

Compare commits

..

No commits in common. "master" and "0.2.2" have entirely different histories.

27 changed files with 140 additions and 157 deletions

View file

@ -4,9 +4,9 @@ android:
components: components:
- tools - tools
- platform-tools - platform-tools
- build-tools-24.0.3 - build-tools-24.0.2
- extra-android-m2repository - extra-android-m2repository
- android-25 - android-24
jdk: jdk:
- oraclejdk8 - oraclejdk8

View file

@ -1,72 +1,61 @@
<!-- ![Image](extras/logo.png) -->
# kotlin-pluralizer [![Build Status](https://travis-ci.org/cesarferreira/kotlin-pluralizer.svg?branch=master)](https://travis-ci.org/cesarferreira/kotlin-pluralizer) [![Release](https://jitpack.io/v/cesarferreira/kotlin-pluralizer.svg)](https://jitpack.io/#cesarferreira/kkotlin-pluralizer)
# kotlin-pluralizer
**kotlin extension** to **pluralize** and **singularize** strings
[![Build Status](https://travis-ci.org/cesarferreira/kotlin-pluralizer.svg?branch=master)](https://travis-ci.org/cesarferreira/kotlin-pluralizer) [![Release](https://jitpack.io/v/cesarferreira/kotlin-pluralizer.svg)](https://jitpack.io/#cesarferreira/kotlin-pluralizer) **kotlin extension** to **pluralize** and **singularize** strings!
### Show some love
[![GitHub followers](https://img.shields.io/github/followers/cesarferreira.svg?style=social&label=Follow)](https://github.com/cesarferreira/kotlin-pluralizer) [![Twitter Follow](https://img.shields.io/twitter/follow/cesarmcferreira.svg?style=social)](https://twitter.com/cesarmcferreira)
## Usage ## Usage
**Pluralization:** **Pluralization:**
```kotlin ```kotlin
"person".pluralize() # => "people" "person".pluralize() # => "people"
"post".pluralize() # => "posts" "post".pluralize() # => "posts"
"sheep".pluralize() # => "sheep" "sheep".pluralize() # => "sheep"
"foot".pluralize() # => "feet"
``` ```
**Singuralization:** **Singuralization:**
```kotlin ```kotlin
"words".singularize() # => "word" "words".singularize() # => "word"
"octopi".singularize() # => "octopus" "octopi".singularize() # => "octopus"
"people".singularize() # => "person"
"feet".singularize() # => "foot"
```
**Quantities:**
```kotlin
"person".pluralize(1) # => "person"
"person".pluralize(2) # => "people"
``` ```
## Install ## Install
```groovy ```groovy
repositories { repositories {
jcenter() jcenter()
maven { url "https://jitpack.io" } maven { url "https://jitpack.io" }
} }
dependencies { dependencies {
compile 'com.github.cesarferreira:kotlin-pluralizer:0.2.9' compile 'com.github.cesarferreira:kotlin-pluralizer:0.2.1'
} }
``` ```
## Contributing ### Show some :heart:
[![GitHub followers](https://img.shields.io/github/followers/cesarferreira.svg?style=social&label=Follow)](https://github.com/cesarferreira/kotlin-pluralizer) [![Twitter Follow](https://img.shields.io/twitter/follow/cesarmcferreira.svg?style=social)](https://twitter.com/cesarmcferreira)
## Contributing
I welcome and encourage all pull requests. It usually will take me within 24-48 hours to respond to any issue or request. Here are some basic rules to follow to ensure timely addition of your request: I welcome and encourage all pull requests. It usually will take me within 24-48 hours to respond to any issue or request. Here are some basic rules to follow to ensure timely addition of your request:
1. Match coding style (braces, spacing, etc.) This is best achieved using `CMD`+`Option`+`L` (Reformat code) on Mac (not sure for Windows) with Android Studio defaults. 1. Match coding style (braces, spacing, etc.) This is best achieved using `CMD`+`Option`+`L` (Reformat code) on Mac (not sure for Windows) with Android Studio defaults.
2. If its a feature, bugfix, or anything please only change code to what you specify. 2. If its a feature, bugfix, or anything please only change code to what you specify.
3. Please keep PR titles easy to read and descriptive of changes, this will make them easier to merge :) 3. Please keep PR titles easy to read and descriptive of changes, this will make them easier to merge :)
4. Pull requests _must_ be made against `develop` branch. Any other branch (unless specified by the maintainers) will get rejected. 4. Pull requests _must_ be made against `develop` branch. Any other branch (unless specified by the maintainers) will get rejected.
5. Check for existing [issues](https://github.com/cesarferreira/kotlin-pluralizer/issues) first, before filing an issue. 5. Check for existing [issues](https://github.com/cesarferreira/kotkotlin-pluralizer/issues) first, before filing an issue.
6. Have fun! 6. Have fun!
## Credits ## Credits
The pluralize and singularize methods are based on the code found in the following places. The pluralize and singularize methods are based on the code found in the following places.
- https://github.com/rails/rails/blob/26698fb91d88dca0f860adcb80528d8d3f0f6285/activesupport/lib/active_support/inflector/inflections.rb
- https://github.com/atteo/evo-inflector/blob/master/src/main/java/org/atteo/evo/inflector/English.java - https://github.com/atteo/evo-inflector/blob/master/src/main/java/org/atteo/evo/inflector/English.java
- http://www.java2s.com/Tutorial/Java/0040__Data-Type/Transformswordstosingularpluralhumanizedhumanreadableunderscorecamelcaseorordinalform.htm - http://www.java2s.com/Tutorial/Java/0040__Data-Type/Transformswordstosingularpluralhumanizedhumanreadableunderscorecamelcaseorordinalform.htm
- https://github.com/MehdiK/Humanizer.jvm - https://github.com/rails/rails/blob/26698fb91d88dca0f860adcb80528d8d3f0f6285/activesupport/lib/active_support/inflector/inflections.rb
### Created & Maintained By ### Created & Maintained By

View file

@ -1,12 +1,12 @@
// Top-level build file where you can add configuration options common to all sub-projects/modules. // Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript { buildscript {
ext.kotlin_version = '1.0.6' ext.kotlin_version = '1.0.3'
ext { ext {
ext_groupId = 'com.cesarferreira' ext_groupId = 'com.cesarferreira'
ext_artifactId = 'kotlin-pluralizer' ext_artifactId = 'kotlin-pluralizer'
ext_version = '0.2.9' ext_version = '0.1.0'
ext_url = 'https://github.com/cesarferreira/kotlin-pluralizer' ext_url = 'https://github.com/cesarferreira/kotlin-pluralizer'
ext_vcsUrl = 'https://github.com/cesarferreira/kotlin-pluralizer.git' ext_vcsUrl = 'https://github.com/cesarferreira/kotlin-pluralizer.git'
ext_description = 'Kotlin extension to pluralize and singularize strings' ext_description = 'Kotlin extension to pluralize and singularize strings'
@ -16,7 +16,7 @@ buildscript {
jcenter() jcenter()
} }
dependencies { dependencies {
classpath 'com.android.tools.build:gradle:2.2.3' classpath 'com.android.tools.build:gradle:2.1.3'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
} }
} }

View file

@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-3.3-all.zip distributionUrl=https\://services.gradle.org/distributions/gradle-2.14.1-all.zip

View file

@ -1,17 +1,42 @@
buildscript { buildscript {
repositories { repositories {
jcenter() mavenCentral()
mavenLocal() }
dependencies {
classpath 'com.github.dcendents:android-maven-gradle-plugin:1.5'
} }
} }
plugins { apply plugin: 'com.android.library'
id 'com.jfrog.bintray' version '1.6' apply plugin: 'kotlin-android'
}
apply plugin: 'java' android {
apply plugin: 'kotlin' compileSdkVersion 24
apply plugin: 'maven-publish' buildToolsVersion "24.0.2"
defaultConfig {
minSdkVersion 16
targetSdkVersion 24
versionCode 1
versionName "1.0"
}
lintOptions {
abortOnError false
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
sourceSets {
main.java.srcDirs += 'src/main/kotlin'
}
}
dependencies { dependencies {
compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"

View file

@ -1,59 +1,52 @@
// build a jar with source files
group "$ext_groupId"
version "$ext_version"
publishing {
publications {
MyPublication(MavenPublication) {
from components.java
artifact sourcesJar
groupId "$ext_groupId"
artifactId "$ext_artifactId"
version "$ext_version"
}
}
}
task sourcesJar(type: Jar) { task sourcesJar(type: Jar) {
from sourceSets.main.java.srcDirs from android.sourceSets.main.java.srcDirs
classifier = 'sources' classifier = 'sources'
} }
task javadoc(type: Javadoc) {
failOnError false
source = android.sourceSets.main.java.sourceFiles
classpath += project.files(android.getBootClasspath().join(File.pathSeparator))
classpath += configurations.compile
}
// build a jar with javadoc
task javadocJar(type: Jar, dependsOn: javadoc) { task javadocJar(type: Jar, dependsOn: javadoc) {
classifier = 'javadoc' classifier = 'javadoc'
from javadoc.destinationDir from javadoc.destinationDir
} }
artifacts { artifacts {
archives javadocJar
archives sourcesJar archives sourcesJar
archives javadocJar
} }
bintray { //
user = System.getenv('BINTRAY_USER') //bintray {
key = System.getenv('BINTRAY_API_KEY') // user = System.getenv('BINTRAY_USER')
// key = System.getenv('BINTRAY_API_KEY')
dryRun = false //
publish = true // dryRun = false
// publish = true
publications = ['MyPublication'] //
pkg { // publications = ['MyPublication']
repo = 'maven' // pkg {
name = "$ext_artifactId" // repo = 'maven'
licenses = ['Apache-2.0'] // name = "$ext_artifactId"
labels = ['android', 'gradle-plugin'] // licenses = ['Apache-2.0']
// labels = ['android', 'gradle-plugin']
publicDownloadNumbers = true //
vcsUrl = "$ext_vcsUrl" // publicDownloadNumbers = true
// vcsUrl = "$ext_vcsUrl"
version { //
name = "$ext_version" // version {
desc = "$ext_description" // name = "$ext_version"
released = new Date() // desc = "$ext_description"
gpg { // released = new Date()
sign = true // Determines whether to GPG sign the files. // gpg {
} // sign = true // Determines whether to GPG sign the files.
} // }
} // }
} // }
//}

View file

@ -25,48 +25,34 @@ fun String.singularize(plurality: Plurality = Plurality.Plural): String {
if (this.pluralizer() != this && this + "s" != this.pluralizer() && if (this.pluralizer() != this && this + "s" != this.pluralizer() &&
this.pluralizer().singularize() == this && this.singularizer() != this) this.pluralizer().singularize() == this && this.singularizer() != this)
return this return this;
return this.singularize() return this.singularize()
} }
fun String.pluralize(count: Int): String {
if (count > 1)
return this.pluralize(Plurality.Plural)
else
return this.pluralize(Plurality.Singular)
}
fun String.singularize(count: Int): String {
if (count > 1)
return this.singularize(Plurality.Plural)
else
return this.singularize(Plurality.Singular)
}
private fun String.pluralizer(): String { private fun String.pluralizer(): String {
if (unCountable().contains(this.toLowerCase())) return this if (unCountable().contains(this)) return this
val rule = pluralizeRules().last { Pattern.compile(it.component1(), Pattern.CASE_INSENSITIVE).matcher(this).find() } val rule = pluralizeRules().last { Pattern.compile(it.component1(), Pattern.CASE_INSENSITIVE).matcher(this).find() }
var found = Pattern.compile(rule.component1(), Pattern.CASE_INSENSITIVE).matcher(this).replaceAll(rule.component2()) var found = Pattern.compile(rule.component1(), Pattern.CASE_INSENSITIVE).matcher(this).replaceAll(rule.component2())
val endsWith = exceptions().firstOrNull { this.endsWith(it.component1()) } val endswith = exceptions().firstOrNull { this.endsWith(it.component1()) }
if (endsWith != null) found = this.replace(endsWith.component1(), endsWith.component2()) if (endswith != null) found = this.replace(endswith.component1(), endswith.component2())
val exception = exceptions().firstOrNull() { this.equals(it.component1()) } val excep = exceptions().firstOrNull() { this.equals(it.component1()) }
if (exception != null) found = exception.component2() if (excep != null) found = excep.component2()
return found return found
} }
private fun String.singularizer(): String { private fun String.singularizer(): String {
if (unCountable().contains(this.toLowerCase())) { if (unCountable().contains(this)) {
return this return this
} }
val exceptions = exceptions().firstOrNull() { this.equals(it.component2()) } val excepions = exceptions().firstOrNull() { this.equals(it.component2()) }
if (exceptions != null) { if (excepions != null) {
return exceptions.component1() return excepions.component1()
} }
val endsWith = exceptions().firstOrNull { this.endsWith(it.component2()) } val endswith = exceptions().firstOrNull { this.endsWith(it.component2()) }
if (endsWith != null) return this.replace(endsWith.component2(), endsWith.component1()) if (endswith != null) return this.replace(endswith.component2(), endswith.component1())
try { try {
if (singularizeRules().count { if (singularizeRules().count {
@ -214,3 +200,5 @@ fun singularizeRules(): List<Pair<String, String>> {
"i$" to "us", "i$" to "us",
"ae$" to "a") "ae$" to "a")
} }

View file

@ -1,29 +1,20 @@
buildscript {
repositories {
jcenter()
}
dependencies {
classpath "org.jetbrains.kotlin:kotlin-android-extensions:$kotlin_version"
}
}
apply plugin: 'com.android.application' apply plugin: 'com.android.application'
apply plugin: 'kotlin-android' apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
android { android {
compileSdkVersion 25 compileSdkVersion 24
buildToolsVersion "24.0.3" buildToolsVersion "24.0.2"
defaultConfig { defaultConfig {
applicationId "com.cesarferreira.supposedlibrary"
minSdkVersion 16 minSdkVersion 16
targetSdkVersion 25 targetSdkVersion 24
versionCode 1 versionCode 1
versionName "1.0" versionName "1.0"
} }
lintOptions { lintOptions {
abortOnError false abortOnError false
} }
buildTypes { buildTypes {
release { release {
minifyEnabled false minifyEnabled false
@ -38,8 +29,8 @@ android {
dependencies { dependencies {
compile project(':library') compile project(':library')
compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
compile 'com.android.support:appcompat-v7:25.1.0' compile 'com.android.support:appcompat-v7:24.2.0'
compile 'com.android.support:design:25.1.0' compile 'com.android.support:design:24.2.0'
} }
repositories { repositories {
mavenCentral() mavenCentral()

View file

@ -1,11 +1,12 @@
package com.cesarferreira.pluralize.sample package com.cesarferreira.pluralize.sample
import android.os.Bundle import android.os.Bundle
import android.support.design.widget.FloatingActionButton
import android.support.v7.app.AppCompatActivity import android.support.v7.app.AppCompatActivity
import android.support.v7.widget.Toolbar import android.support.v7.widget.Toolbar
import android.util.Log
import com.cesarferreira.pluralize.pluralize import com.cesarferreira.pluralize.pluralize
import com.cesarferreira.pluralize.singularize import com.cesarferreira.pluralize.singularize
import kotlinx.android.synthetic.main.content_hello.*
class HelloActivity : AppCompatActivity() { class HelloActivity : AppCompatActivity() {
@ -15,24 +16,15 @@ class HelloActivity : AppCompatActivity() {
val toolbar = findViewById(R.id.toolbar) as Toolbar val toolbar = findViewById(R.id.toolbar) as Toolbar
setSupportActionBar(toolbar) setSupportActionBar(toolbar)
val singulars = arrayOf("person", "banana", "woman") val fab = findViewById(R.id.fab) as FloatingActionButton
fab.setOnClickListener({
view ->
Log.d("TAG", "person".pluralize())
Log.d("TAG", "banana".pluralize())
Log.d("TAG", "woman".pluralize())
Log.d("TAG", "women".singularize())
for (item in singulars) { })
concat("$item -> pluralize -> ${item.pluralize()}")
}
concat("")
concat("")
val plurals = arrayOf("words", "octopi", "sheep")
for (item in plurals) {
concat("$item -> singularize -> ${item.singularize()}")
}
}
fun concat(str: String) {
centerTextView.append(str + "\n")
} }
} }

View file

@ -5,7 +5,8 @@
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:fitsSystemWindows="true"> android:fitsSystemWindows="true"
tools:context="com.cesarferreira.supposedlibrary.com.cesarferreira.pluralize.sample.HelloActivity">
<android.support.design.widget.AppBarLayout <android.support.design.widget.AppBarLayout
android:layout_height="wrap_content" android:layout_height="wrap_content"
@ -23,4 +24,12 @@
<include layout="@layout/content_hello"/> <include layout="@layout/content_hello"/>
<android.support.design.widget.FloatingActionButton
android:id="@+id/fab"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom|end"
android:layout_margin="@dimen/fab_margin"
app:srcCompat="@android:drawable/ic_dialog_email"/>
</android.support.design.widget.CoordinatorLayout> </android.support.design.widget.CoordinatorLayout>

View file

@ -11,11 +11,7 @@
android:paddingTop="@dimen/activity_vertical_margin" android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin"
app:layout_behavior="@string/appbar_scrolling_view_behavior" app:layout_behavior="@string/appbar_scrolling_view_behavior"
tools:showIn="@layout/activity_hello"> tools:showIn="@layout/activity_hello"
tools:context="com.cesarferreira.supposedlibrary.com.cesarferreira.pluralize.sample.HelloActivity">
<TextView
android:id="@+id/centerTextView"
android:layout_centerInParent="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</RelativeLayout> </RelativeLayout>

View file

Before

Width:  |  Height:  |  Size: 3.3 KiB

After

Width:  |  Height:  |  Size: 3.3 KiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 2.2 KiB

After

Width:  |  Height:  |  Size: 2.2 KiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 4.7 KiB

After

Width:  |  Height:  |  Size: 4.7 KiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 7.5 KiB

After

Width:  |  Height:  |  Size: 7.5 KiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 10 KiB

After

Width:  |  Height:  |  Size: 10 KiB

Before After
Before After

View file

@ -1,4 +1,4 @@
<resources> <resources>
<string name="app_name">Pluralize</string> <string name="app_name">Pluralize</string>
<string name="title_activity_hello">Pluralize</string> <string name="title_activity_hello">HelloActivity</string>
</resources> </resources>

View file

@ -1 +1 @@
include ':android-sample', ':library' include ':sample', ':library'