Compare commits
26 commits
Author | SHA1 | Date | |
---|---|---|---|
|
6b65d56b19 | ||
|
0afabd8a4e | ||
|
4b1cdffa7e | ||
|
6fc79f6a94 | ||
|
5af7c33746 | ||
|
3177a1ff16 | ||
|
322fdd6d0e | ||
|
9043139d30 | ||
|
e579f7bfe1 | ||
|
906b9d8da4 | ||
af2a59e3ec | |||
|
0cf3c54ae2 | ||
|
dd09353592 | ||
|
46ece47676 | ||
|
091e16a697 | ||
|
3a56d6d792 | ||
|
acf66ae704 | ||
|
ca927135f3 | ||
|
ba938bd865 | ||
|
a422910c03 | ||
|
3b02359c3f | ||
|
1f0c0f4dbe | ||
|
aa567c97f7 | ||
|
ff11b6a6e4 | ||
|
075acc0c94 | ||
|
d0f22d0f40 |
|
@ -4,9 +4,9 @@ android:
|
|||
components:
|
||||
- tools
|
||||
- platform-tools
|
||||
- build-tools-24.0.2
|
||||
- build-tools-24.0.3
|
||||
- extra-android-m2repository
|
||||
- android-24
|
||||
- android-25
|
||||
|
||||
jdk:
|
||||
- oraclejdk8
|
||||
|
|
45
README.md
|
@ -1,61 +1,72 @@
|
|||
<!--  -->
|
||||
# kotlin-pluralizer [](https://travis-ci.org/cesarferreira/kotlin-pluralizer) [](https://jitpack.io/#cesarferreira/kkotlin-pluralizer)
|
||||
|
||||
# kotlin-pluralizer
|
||||
|
||||
**kotlin extension** to **pluralize** and **singularize** strings
|
||||
|
||||
**kotlin extension** to **pluralize** and **singularize** strings!
|
||||
[](https://travis-ci.org/cesarferreira/kotlin-pluralizer) [](https://jitpack.io/#cesarferreira/kotlin-pluralizer)
|
||||
|
||||
### Show some love
|
||||
[](https://github.com/cesarferreira/kotlin-pluralizer) [](https://twitter.com/cesarmcferreira)
|
||||
|
||||
## Usage
|
||||
|
||||
|
||||
**Pluralization:**
|
||||
|
||||
```kotlin
|
||||
"person".pluralize() # => "people"
|
||||
"post".pluralize() # => "posts"
|
||||
"sheep".pluralize() # => "sheep"
|
||||
"person".pluralize() # => "people"
|
||||
"post".pluralize() # => "posts"
|
||||
"sheep".pluralize() # => "sheep"
|
||||
"foot".pluralize() # => "feet"
|
||||
```
|
||||
|
||||
**Singuralization:**
|
||||
|
||||
```kotlin
|
||||
"words".singularize() # => "word"
|
||||
"octopi".singularize() # => "octopus"
|
||||
"words".singularize() # => "word"
|
||||
"octopi".singularize() # => "octopus"
|
||||
"people".singularize() # => "person"
|
||||
"feet".singularize() # => "foot"
|
||||
```
|
||||
|
||||
**Quantities:**
|
||||
```kotlin
|
||||
"person".pluralize(1) # => "person"
|
||||
"person".pluralize(2) # => "people"
|
||||
```
|
||||
|
||||
## Install
|
||||
|
||||
```groovy
|
||||
repositories {
|
||||
jcenter()
|
||||
maven { url "https://jitpack.io" }
|
||||
jcenter()
|
||||
maven { url "https://jitpack.io" }
|
||||
}
|
||||
dependencies {
|
||||
compile 'com.github.cesarferreira:kotlin-pluralizer:0.2.1'
|
||||
compile 'com.github.cesarferreira:kotlin-pluralizer:0.2.9'
|
||||
}
|
||||
```
|
||||
|
||||
### Show some :heart:
|
||||
[](https://github.com/cesarferreira/kotlin-pluralizer) [](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:
|
||||
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.
|
||||
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.
|
||||
5. Check for existing [issues](https://github.com/cesarferreira/kotkotlin-pluralizer/issues) first, before filing an issue.
|
||||
5. Check for existing [issues](https://github.com/cesarferreira/kotlin-pluralizer/issues) first, before filing an issue.
|
||||
6. Have fun!
|
||||
|
||||
|
||||
## Credits
|
||||
## Credits
|
||||
|
||||
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
|
||||
- http://www.java2s.com/Tutorial/Java/0040__Data-Type/Transformswordstosingularpluralhumanizedhumanreadableunderscorecamelcaseorordinalform.htm
|
||||
- https://github.com/rails/rails/blob/26698fb91d88dca0f860adcb80528d8d3f0f6285/activesupport/lib/active_support/inflector/inflections.rb
|
||||
- https://github.com/MehdiK/Humanizer.jvm
|
||||
|
||||
|
||||
### Created & Maintained By
|
||||
|
|
|
@ -1,20 +1,29 @@
|
|||
buildscript {
|
||||
repositories {
|
||||
jcenter()
|
||||
}
|
||||
dependencies {
|
||||
classpath "org.jetbrains.kotlin:kotlin-android-extensions:$kotlin_version"
|
||||
}
|
||||
}
|
||||
|
||||
apply plugin: 'com.android.application'
|
||||
apply plugin: 'kotlin-android'
|
||||
apply plugin: 'kotlin-android-extensions'
|
||||
|
||||
android {
|
||||
compileSdkVersion 24
|
||||
buildToolsVersion "24.0.2"
|
||||
compileSdkVersion 25
|
||||
buildToolsVersion "24.0.3"
|
||||
defaultConfig {
|
||||
applicationId "com.cesarferreira.supposedlibrary"
|
||||
minSdkVersion 16
|
||||
targetSdkVersion 24
|
||||
targetSdkVersion 25
|
||||
versionCode 1
|
||||
versionName "1.0"
|
||||
}
|
||||
lintOptions {
|
||||
abortOnError false
|
||||
}
|
||||
|
||||
|
||||
buildTypes {
|
||||
release {
|
||||
minifyEnabled false
|
||||
|
@ -29,8 +38,8 @@ android {
|
|||
dependencies {
|
||||
compile project(':library')
|
||||
compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
|
||||
compile 'com.android.support:appcompat-v7:24.2.0'
|
||||
compile 'com.android.support:design:24.2.0'
|
||||
compile 'com.android.support:appcompat-v7:25.1.0'
|
||||
compile 'com.android.support:design:25.1.0'
|
||||
}
|
||||
repositories {
|
||||
mavenCentral()
|
|
@ -1,12 +1,11 @@
|
|||
package com.cesarferreira.pluralize.sample
|
||||
|
||||
import android.os.Bundle
|
||||
import android.support.design.widget.FloatingActionButton
|
||||
import android.support.v7.app.AppCompatActivity
|
||||
import android.support.v7.widget.Toolbar
|
||||
import android.util.Log
|
||||
import com.cesarferreira.pluralize.pluralize
|
||||
import com.cesarferreira.pluralize.singularize
|
||||
import kotlinx.android.synthetic.main.content_hello.*
|
||||
|
||||
class HelloActivity : AppCompatActivity() {
|
||||
|
||||
|
@ -16,15 +15,24 @@ class HelloActivity : AppCompatActivity() {
|
|||
val toolbar = findViewById(R.id.toolbar) as Toolbar
|
||||
setSupportActionBar(toolbar)
|
||||
|
||||
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())
|
||||
val singulars = arrayOf("person", "banana", "woman")
|
||||
|
||||
})
|
||||
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")
|
||||
}
|
||||
|
||||
}
|
|
@ -5,8 +5,7 @@
|
|||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:fitsSystemWindows="true"
|
||||
tools:context="com.cesarferreira.supposedlibrary.com.cesarferreira.pluralize.sample.HelloActivity">
|
||||
android:fitsSystemWindows="true">
|
||||
|
||||
<android.support.design.widget.AppBarLayout
|
||||
android:layout_height="wrap_content"
|
||||
|
@ -24,12 +23,4 @@
|
|||
|
||||
<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>
|
|
@ -11,7 +11,11 @@
|
|||
android:paddingTop="@dimen/activity_vertical_margin"
|
||||
android:paddingBottom="@dimen/activity_vertical_margin"
|
||||
app:layout_behavior="@string/appbar_scrolling_view_behavior"
|
||||
tools:showIn="@layout/activity_hello"
|
||||
tools:context="com.cesarferreira.supposedlibrary.com.cesarferreira.pluralize.sample.HelloActivity">
|
||||
tools:showIn="@layout/activity_hello">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/centerTextView"
|
||||
android:layout_centerInParent="true"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"/>
|
||||
</RelativeLayout>
|
Before Width: | Height: | Size: 3.3 KiB After Width: | Height: | Size: 3.3 KiB |
Before Width: | Height: | Size: 2.2 KiB After Width: | Height: | Size: 2.2 KiB |
Before Width: | Height: | Size: 4.7 KiB After Width: | Height: | Size: 4.7 KiB |
Before Width: | Height: | Size: 7.5 KiB After Width: | Height: | Size: 7.5 KiB |
Before Width: | Height: | Size: 10 KiB After Width: | Height: | Size: 10 KiB |
|
@ -1,4 +1,4 @@
|
|||
<resources>
|
||||
<string name="app_name">Pluralize</string>
|
||||
<string name="title_activity_hello">HelloActivity</string>
|
||||
<string name="title_activity_hello">Pluralize</string>
|
||||
</resources>
|
|
@ -1,12 +1,12 @@
|
|||
// Top-level build file where you can add configuration options common to all sub-projects/modules.
|
||||
|
||||
buildscript {
|
||||
ext.kotlin_version = '1.0.3'
|
||||
ext.kotlin_version = '1.0.6'
|
||||
|
||||
ext {
|
||||
ext_groupId = 'com.cesarferreira'
|
||||
ext_artifactId = 'kotlin-pluralizer'
|
||||
ext_version = '0.1.0'
|
||||
ext_version = '0.2.9'
|
||||
ext_url = 'https://github.com/cesarferreira/kotlin-pluralizer'
|
||||
ext_vcsUrl = 'https://github.com/cesarferreira/kotlin-pluralizer.git'
|
||||
ext_description = 'Kotlin extension to pluralize and singularize strings'
|
||||
|
@ -16,7 +16,7 @@ buildscript {
|
|||
jcenter()
|
||||
}
|
||||
dependencies {
|
||||
classpath 'com.android.tools.build:gradle:2.1.3'
|
||||
classpath 'com.android.tools.build:gradle:2.2.3'
|
||||
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
|
||||
}
|
||||
}
|
||||
|
|
2
gradle/wrapper/gradle-wrapper.properties
vendored
|
@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME
|
|||
distributionPath=wrapper/dists
|
||||
zipStoreBase=GRADLE_USER_HOME
|
||||
zipStorePath=wrapper/dists
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-2.14.1-all.zip
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-3.3-all.zip
|
||||
|
|
|
@ -1,43 +1,18 @@
|
|||
buildscript {
|
||||
repositories {
|
||||
mavenCentral()
|
||||
}
|
||||
|
||||
dependencies {
|
||||
classpath 'com.github.dcendents:android-maven-gradle-plugin:1.5'
|
||||
jcenter()
|
||||
mavenLocal()
|
||||
}
|
||||
}
|
||||
|
||||
apply plugin: 'com.android.library'
|
||||
apply plugin: 'kotlin-android'
|
||||
|
||||
android {
|
||||
compileSdkVersion 24
|
||||
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'
|
||||
}
|
||||
plugins {
|
||||
id 'com.jfrog.bintray' version '1.6'
|
||||
}
|
||||
|
||||
apply plugin: 'java'
|
||||
apply plugin: 'kotlin'
|
||||
apply plugin: 'maven-publish'
|
||||
|
||||
dependencies {
|
||||
compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
|
||||
}
|
||||
|
|
|
@ -1,52 +1,59 @@
|
|||
// 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) {
|
||||
from android.sourceSets.main.java.srcDirs
|
||||
from sourceSets.main.java.srcDirs
|
||||
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) {
|
||||
classifier = 'javadoc'
|
||||
from javadoc.destinationDir
|
||||
}
|
||||
|
||||
|
||||
artifacts {
|
||||
archives sourcesJar
|
||||
archives javadocJar
|
||||
archives sourcesJar
|
||||
}
|
||||
|
||||
//
|
||||
//bintray {
|
||||
// user = System.getenv('BINTRAY_USER')
|
||||
// key = System.getenv('BINTRAY_API_KEY')
|
||||
//
|
||||
// dryRun = false
|
||||
// publish = true
|
||||
//
|
||||
// publications = ['MyPublication']
|
||||
// pkg {
|
||||
// repo = 'maven'
|
||||
// name = "$ext_artifactId"
|
||||
// licenses = ['Apache-2.0']
|
||||
// labels = ['android', 'gradle-plugin']
|
||||
//
|
||||
// publicDownloadNumbers = true
|
||||
// vcsUrl = "$ext_vcsUrl"
|
||||
//
|
||||
// version {
|
||||
// name = "$ext_version"
|
||||
// desc = "$ext_description"
|
||||
// released = new Date()
|
||||
// gpg {
|
||||
// sign = true // Determines whether to GPG sign the files.
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
//}
|
||||
bintray {
|
||||
user = System.getenv('BINTRAY_USER')
|
||||
key = System.getenv('BINTRAY_API_KEY')
|
||||
|
||||
dryRun = false
|
||||
publish = true
|
||||
|
||||
publications = ['MyPublication']
|
||||
pkg {
|
||||
repo = 'maven'
|
||||
name = "$ext_artifactId"
|
||||
licenses = ['Apache-2.0']
|
||||
labels = ['android', 'gradle-plugin']
|
||||
|
||||
publicDownloadNumbers = true
|
||||
vcsUrl = "$ext_vcsUrl"
|
||||
|
||||
version {
|
||||
name = "$ext_version"
|
||||
desc = "$ext_description"
|
||||
released = new Date()
|
||||
gpg {
|
||||
sign = true // Determines whether to GPG sign the files.
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -25,34 +25,48 @@ fun String.singularize(plurality: Plurality = Plurality.Plural): String {
|
|||
|
||||
if (this.pluralizer() != this && this + "s" != this.pluralizer() &&
|
||||
this.pluralizer().singularize() == this && this.singularizer() != this)
|
||||
return this;
|
||||
return this
|
||||
|
||||
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 {
|
||||
if (unCountable().contains(this)) return this
|
||||
if (unCountable().contains(this.toLowerCase())) return this
|
||||
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())
|
||||
val endswith = exceptions().firstOrNull { this.endsWith(it.component1()) }
|
||||
if (endswith != null) found = this.replace(endswith.component1(), endswith.component2())
|
||||
val excep = exceptions().firstOrNull() { this.equals(it.component1()) }
|
||||
if (excep != null) found = excep.component2()
|
||||
val endsWith = exceptions().firstOrNull { this.endsWith(it.component1()) }
|
||||
if (endsWith != null) found = this.replace(endsWith.component1(), endsWith.component2())
|
||||
val exception = exceptions().firstOrNull() { this.equals(it.component1()) }
|
||||
if (exception != null) found = exception.component2()
|
||||
return found
|
||||
}
|
||||
|
||||
private fun String.singularizer(): String {
|
||||
if (unCountable().contains(this)) {
|
||||
if (unCountable().contains(this.toLowerCase())) {
|
||||
return this
|
||||
}
|
||||
val excepions = exceptions().firstOrNull() { this.equals(it.component2()) }
|
||||
val exceptions = exceptions().firstOrNull() { this.equals(it.component2()) }
|
||||
|
||||
if (excepions != null) {
|
||||
return excepions.component1()
|
||||
if (exceptions != null) {
|
||||
return exceptions.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 {
|
||||
if (singularizeRules().count {
|
||||
|
@ -200,5 +214,3 @@ fun singularizeRules(): List<Pair<String, String>> {
|
|||
"i$" to "us",
|
||||
"ae$" to "a")
|
||||
}
|
||||
|
||||
|
|
@ -1 +1 @@
|
|||
include ':sample', ':library'
|
||||
include ':android-sample', ':library'
|
||||
|
|