Skip to content

Commit 6b1a13e

Browse files
♻️ style:
1. typo 2. use companion object 3. more functional style
1 parent c437d68 commit 6b1a13e

File tree

6 files changed

+128
-124
lines changed

6 files changed

+128
-124
lines changed

README.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# emoji-jvm-string 👺
22

3-
> Let's access emoji like Enum and print it easily 😎
3+
> Let's access emoji like Enum and print it easily. 😎
44
55
## Sample Code 📜
66

@@ -70,5 +70,5 @@ dependencies {
7070
```
7171

7272
## Issue
73-
Q: Why not just one Emoji class ?
74-
> All enum in one .kt is will exceed jvm limit 64K.
73+
Q: Why not just one Emoji class?
74+
> All enum in one .kt will exceed jvm limit 64K.
Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
package net.purefunc.generate
22

3+
import net.purefunc.generate.util.EmojiCollector
34
import net.purefunc.generate.util.EmojiFileCreator
45
import net.purefunc.generate.util.EmojiReader
5-
import net.purefunc.generate.util.ValidEmojiCollector
66

77
fun main() {
8-
val roughList = EmojiReader("https://unicode.org/Public/emoji/15.0/emoji-test.txt").readTargetUrl()
9-
val bigEnum = ValidEmojiCollector(roughList).filter()
10-
EmojiFileCreator(1000).writeAsEnumFile(bigEnum)
8+
EmojiFileCreator.writeAsEnumFile(
9+
EmojiCollector.filter(
10+
EmojiReader.readTargetUrl("https://unicode.org/Public/emoji/15.0/emoji-test.txt")
11+
)
12+
)
1113
}
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
package net.purefunc.generate.util
2+
3+
class EmojiCollector {
4+
5+
companion object {
6+
fun filter(source: List<String>) =
7+
source
8+
.filter {
9+
it.contains("fully-qualified")
10+
}.map {
11+
it.split(" ")
12+
}.map { elements ->
13+
// [1F636, 200D, 1F32B, FE0F, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ;, fully-qualified, , , , , #, 😶‍🌫️, E13.1, face, in, cloud]
14+
15+
val items = mutableListOf<String>()
16+
17+
val codePartIdxs = elements.mapIndexed { idx, element -> if (element.isEmpty() || element == ";") idx else -1 }
18+
val codeIdx = codePartIdxs.first { idx -> idx != -1 }
19+
20+
(0 until codeIdx).forEach { i -> items.add(elements[i]) }
21+
items.add(";")
22+
23+
val namePartIdxs =
24+
elements.mapIndexed { idx, element -> if (element.startsWith("E") && element.contains(".")) idx else -1 }
25+
val nameIdx = namePartIdxs.first { idx -> idx != -1 }
26+
27+
items.plus(elements.subList(nameIdx + 1, elements.size).map { str -> convertToValidChar(str) })
28+
}
29+
30+
private fun convertToValidChar(str: String) =
31+
// replace item name contains invalid char
32+
str.replace("", "")
33+
.replace("", "")
34+
.replace("", "")
35+
.replace("-", "_")
36+
.replace(":", "")
37+
.replace(".", "")
38+
.replace("!", "")
39+
.replace("(", "")
40+
.replace(")", "")
41+
.replace("1st", "first")
42+
.replace("2nd", "second")
43+
.replace("3rd", "third")
44+
.replace("package", "packages")
45+
.replace("#", "hash")
46+
.replace("*", "star")
47+
.replace(",", "comma")
48+
.replace("&", "and")
49+
}
50+
}

src/main/kotlin/net/purefunc/generate/util/EmojiFileCreator.kt

Lines changed: 54 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -2,76 +2,76 @@ package net.purefunc.generate.util
22

33
import java.io.File
44
import java.io.FileOutputStream
5-
import java.util.*
6-
7-
class EmojiFileCreator(private val pageCount: Int) {
8-
// all enum in one .kt is will exceed jvm limit 64K
9-
fun writeAsEnumFile(source: List<List<String>>): Unit {
10-
val pagingItems = allocatePerPageItem(source)
11-
12-
pagingItems.forEachIndexed { fileIdx, item ->
13-
val fos = FileOutputStream(File("src/main/kotlin/net/purefunc/emoji/Emoji$fileIdx.kt"))
14-
fos.generateFileHeader(fileIdx)
15-
16-
item.forEachIndexed { idx, element ->
17-
val idxListThird = element.mapIndexed { i, e -> if (e == ";") i else -1 }
18-
val splitIdx = idxListThird.first { i -> i != -1 }
19-
20-
val name = element.subList(splitIdx + 1, element.size).joinToString("_").uppercase(Locale.getDefault())
21-
val hexs = element.subList(0, splitIdx).joinToString(",") { hex -> "0x$hex" }
22-
val emojiIntArr = element.subList(0, splitIdx).map { hex -> hex.toInt(16) }.toIntArray()
23-
val emoji = String(emojiIntArr, 0, emojiIntArr.size)
24-
25-
val comment = " // $emoji $emoji $emoji"
26-
val enum = " $name(intArrayOf($hexs))"
27-
if (idx == item.size - 1) {
28-
fos.writeLastLine(comment, enum)
29-
} else {
30-
fos.writeNextLine(comment, enum)
5+
import java.util.Locale
6+
7+
class EmojiFileCreator {
8+
9+
companion object {
10+
// all enum in one .kt will exceed jvm limit 64K
11+
fun writeAsEnumFile(source: List<List<String>>, pageCount: Int = 1000) {
12+
val pagingItems = allocatePerPageItem(source, pageCount)
13+
14+
pagingItems.forEachIndexed { fileIdx, item ->
15+
val fos = FileOutputStream(File("src/main/kotlin/net/purefunc/emoji/Emoji$fileIdx.kt"))
16+
fos.generateFileHeader(fileIdx)
17+
18+
item.forEachIndexed { idx, element ->
19+
val idxListThird = element.mapIndexed { i, e -> if (e == ";") i else -1 }
20+
val splitIdx = idxListThird.first { i -> i != -1 }
21+
22+
val name = element.subList(splitIdx + 1, element.size).joinToString("_").uppercase(Locale.getDefault())
23+
val hexs = element.subList(0, splitIdx).joinToString(",") { hex -> "0x$hex" }
24+
val emojiIntArr = element.subList(0, splitIdx).map { hex -> hex.toInt(16) }.toIntArray()
25+
val emoji = String(emojiIntArr, 0, emojiIntArr.size)
26+
27+
val comment = " // $emoji $emoji $emoji"
28+
val enum = " $name(intArrayOf($hexs))"
29+
if (idx == item.size - 1) {
30+
fos.writeLastLine(comment, enum)
31+
} else {
32+
fos.writeNextLine(comment, enum)
33+
}
3134
}
32-
}
3335

34-
fos.generateFileFooter()
36+
fos.generateFileFooter()
37+
}
3538
}
36-
}
37-
38-
private fun allocatePerPageItem(source: List<List<String>>): List<List<List<String>>> {
39-
val pageSize = (source.size / pageCount)
40-
return (0..pageSize).map { page ->
41-
val pageList: (Int) -> List<List<String>> = { source.subList(pageCount * page, it) }
42-
if (pageCount * (page + 1) > source.size)
43-
pageList(source.size)
44-
else
45-
pageList(pageCount * (page + 1))
4639

40+
private fun allocatePerPageItem(source: List<List<String>>, pageCount: Int): List<List<List<String>>> {
41+
val pageSize = (source.size / pageCount)
42+
return (0..pageSize).map { page ->
43+
val pageList: (Int) -> List<List<String>> = { source.subList(pageCount * page, it) }
44+
if (pageCount * (page + 1) > source.size)
45+
pageList(source.size)
46+
else
47+
pageList(pageCount * (page + 1))
48+
}
4749
}
48-
}
4950

50-
private fun FileOutputStream.generateFileHeader(fileIdx: Int) =
51-
write(
52-
"""
51+
private fun FileOutputStream.generateFileHeader(fileIdx: Int) =
52+
write(
53+
"""
5354
package net.purefunc.emoji
5455
5556
enum class Emoji$fileIdx(
5657
private val intArray: IntArray,
5758
) {
5859
59-
6060
""".trimIndent().toByteArray()
61-
)
61+
)
6262

63-
private fun FileOutputStream.writeNextLine(comment: String, enum: String) = write("$comment\n$enum,\n".toByteArray())
63+
private fun FileOutputStream.writeNextLine(comment: String, enum: String) = write("$comment\n$enum,\n".toByteArray())
6464

65-
private fun FileOutputStream.writeLastLine(comment: String, enum: String) = write("$comment\n$enum;\n".toByteArray())
65+
private fun FileOutputStream.writeLastLine(comment: String, enum: String) = write("$comment\n$enum;\n".toByteArray())
6666

67-
private fun FileOutputStream.generateFileFooter() =
68-
write(
69-
"""
67+
private fun FileOutputStream.generateFileFooter() =
68+
write(
69+
"""
70+
71+
override fun toString() = String(intArray, 0, intArray.size)
72+
}
7073
71-
override fun toString() = String(intArray, 0, intArray.size)
72-
}
73-
7474
""".trimIndent().toByteArray()
75-
)
76-
75+
)
76+
}
7777
}

src/main/kotlin/net/purefunc/generate/util/EmojiReader.kt

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -4,20 +4,22 @@ import java.io.BufferedReader
44
import java.io.InputStreamReader
55
import java.net.URL
66

7-
class EmojiReader(private val targetUrl: String) {
7+
class EmojiReader {
88

9-
fun readTargetUrl(): List<String> =
10-
// collect emoji lines
11-
// 1F636 200D 1F32B FE0F ; fully-qualified # 😶‍🌫️ E13.1 face in clouds
12-
buildList {
13-
var flag = false
14-
val reader = BufferedReader(InputStreamReader(URL(targetUrl).openConnection().getInputStream()))
15-
reader.useLines { readLines ->
16-
readLines.forEach { line ->
17-
if (line.isEmpty()) flag = false
18-
if (flag) add(line)
19-
if (line.startsWith("# subgroup: ")) flag = true
9+
companion object {
10+
fun readTargetUrl(targetUrl: String): List<String> =
11+
// collect emoji lines
12+
// 1F636 200D 1F32B FE0F ; fully-qualified # 😶‍🌫️ E13.1 face in clouds
13+
buildList {
14+
var flag = false
15+
val reader = BufferedReader(InputStreamReader(URL(targetUrl).openConnection().getInputStream()))
16+
reader.useLines { readLines ->
17+
readLines.forEach { line ->
18+
if (line.isEmpty()) flag = false
19+
if (flag) add(line)
20+
if (line.startsWith("# subgroup: ")) flag = true
21+
}
2022
}
2123
}
22-
}
24+
}
2325
}

src/main/kotlin/net/purefunc/generate/util/ValidEmojiCollector.kt

Lines changed: 0 additions & 50 deletions
This file was deleted.

0 commit comments

Comments
 (0)