@@ -9,26 +9,27 @@ import io.github.optimumcode.json.schema.internal.formats.IdnHostnameFormatValid
9
9
import io.github.optimumcode.json.schema.internal.formats.IdnHostnameFormatValidator.BidiLabelType.RTL
10
10
import io.github.optimumcode.json.schema.internal.hostname.Punycode
11
11
import io.github.optimumcode.json.schema.internal.hostname.isNormalized
12
- import io.github.optimumcode.json.schema.internal.unicode.CharacterCategory
13
- import io.github.optimumcode.json.schema.internal.unicode.CharacterCategory.ENCLOSING_MARK
14
- import io.github.optimumcode.json.schema.internal.unicode.CharacterCategory.NONSPACING_MARK
15
- import io.github.optimumcode.json.schema.internal.unicode.CharacterCategory.SPACING_MARK
16
- import io.github.optimumcode.json.schema.internal.unicode.CharacterDirectionality
17
- import io.github.optimumcode.json.schema.internal.unicode.CharacterDirectionality.ARABIC_LETTER
18
- import io.github.optimumcode.json.schema.internal.unicode.CharacterDirectionality.ARABIC_NUMBER
19
- import io.github.optimumcode.json.schema.internal.unicode.CharacterDirectionality.BOUNDARY_NEUTRAL
20
- import io.github.optimumcode.json.schema.internal.unicode.CharacterDirectionality.COMMON_SEPARATOR
21
- import io.github.optimumcode.json.schema.internal.unicode.CharacterDirectionality.EUROPEAN_NUMBER
22
- import io.github.optimumcode.json.schema.internal.unicode.CharacterDirectionality.EUROPEAN_SEPARATOR
23
- import io.github.optimumcode.json.schema.internal.unicode.CharacterDirectionality.EUROPEAN_TERMINATOR
24
- import io.github.optimumcode.json.schema.internal.unicode.CharacterDirectionality.LEFT_TO_RIGHT
25
- import io.github.optimumcode.json.schema.internal.unicode.CharacterDirectionality.OTHER_NEUTRAL
26
- import io.github.optimumcode.json.schema.internal.unicode.CharacterDirectionality.RIGHT_TO_LEFT
27
- import io.github.optimumcode.json.schema.internal.unicode.DerivedProperties
28
- import io.github.optimumcode.json.schema.internal.unicode.JoiningType
29
12
import io.github.optimumcode.json.schema.internal.util.forEachCodePointIndexed
13
+ import io.github.optimumcode.karacteristics.CodepointBidirectionalClass.ARABIC_LETTER
14
+ import io.github.optimumcode.karacteristics.CodepointBidirectionalClass.ARABIC_NUMBER
15
+ import io.github.optimumcode.karacteristics.CodepointBidirectionalClass.BOUNDARY_NEUTRAL
16
+ import io.github.optimumcode.karacteristics.CodepointBidirectionalClass.COMMON_SEPARATOR
17
+ import io.github.optimumcode.karacteristics.CodepointBidirectionalClass.EUROPEAN_NUMBER
18
+ import io.github.optimumcode.karacteristics.CodepointBidirectionalClass.EUROPEAN_SEPARATOR
19
+ import io.github.optimumcode.karacteristics.CodepointBidirectionalClass.EUROPEAN_TERMINATOR
20
+ import io.github.optimumcode.karacteristics.CodepointBidirectionalClass.LEFT_TO_RIGHT
21
+ import io.github.optimumcode.karacteristics.CodepointBidirectionalClass.OTHER_NEUTRAL
22
+ import io.github.optimumcode.karacteristics.CodepointBidirectionalClass.RIGHT_TO_LEFT
23
+ import io.github.optimumcode.karacteristics.CodepointCategory.ENCLOSING_MARK
24
+ import io.github.optimumcode.karacteristics.CodepointCategory.NONSPACING_MARK
25
+ import io.github.optimumcode.karacteristics.CodepointCategory.SPACING_MARK
26
+ import io.github.optimumcode.karacteristics.CodepointDerivedProperty
27
+ import io.github.optimumcode.karacteristics.CodepointJoiningType
28
+ import io.github.optimumcode.karacteristics.bidirectionalClass
29
+ import io.github.optimumcode.karacteristics.category
30
+ import io.github.optimumcode.karacteristics.contains
30
31
import kotlin.math.abs
31
- import io.github.optimumcode.json.schema.internal.unicode.CharacterDirectionality .NONSPACING_MARK as NONSPACING_MARK_DIRECTIONALITY
32
+ import io.github.optimumcode.karacteristics.CodepointBidirectionalClass .NONSPACING_MARK as NONSPACING_MARK_DIRECTIONALITY
32
33
33
34
private const val GREEK_LOWER_NUMERAL_SIGN : Int = 0x0375
34
35
private const val HEBREW_GERESH : Int = 0x05F3
@@ -57,7 +58,7 @@ internal object IdnHostnameFormatValidator : AbstractStringFormatValidator() {
57
58
value.forEachLabel {
58
59
it.forEachCodePointIndexed { _, codePoint ->
59
60
isBidiDomainName = isBidiDomainName ||
60
- when (getDirectionality( codePoint) ) {
61
+ when (codePoint.bidirectionalClass ) {
61
62
RIGHT_TO_LEFT ,
62
63
ARABIC_LETTER ,
63
64
ARABIC_NUMBER ,
@@ -131,7 +132,7 @@ internal object IdnHostnameFormatValidator : AbstractStringFormatValidator() {
131
132
132
133
val bidiLabelType: BidiLabelType =
133
134
if (isBidiDomainName) {
134
- when (getDirectionality( firstCodePoint) ) {
135
+ when (firstCodePoint.bidirectionalClass ) {
135
136
LEFT_TO_RIGHT ,
136
137
-> LTR
137
138
@@ -171,7 +172,7 @@ internal object IdnHostnameFormatValidator : AbstractStringFormatValidator() {
171
172
//
172
173
// Check absents of opposite directionality
173
174
// Point 4 https://datatracker.ietf.org/doc/html/rfc5893#section-2
174
- isExtendedArabicIndicDigit(codePoint) || EUROPEAN_NUMBER .characterData.contains( codePoint) -> - 1
175
+ isExtendedArabicIndicDigit(codePoint) || codePoint in EUROPEAN_NUMBER -> - 1
175
176
else -> 0
176
177
}
177
178
if (abs(currentArabicDigitStatus - arabicDigitStatus) > 1 ) {
@@ -239,10 +240,10 @@ internal object IdnHostnameFormatValidator : AbstractStringFormatValidator() {
239
240
-> false
240
241
241
242
else ->
242
- DerivedProperties .DISALLOWED .contains(codePoint) ||
243
- DerivedProperties .UNASSIGNED .contains(codePoint) ||
244
- DerivedProperties .CONTEXTJ .contains(codePoint) ||
245
- DerivedProperties .CONTEXTO .contains(codePoint)
243
+ codePoint in CodepointDerivedProperty .DISALLOWED ||
244
+ codePoint in CodepointDerivedProperty .UNASSIGNED ||
245
+ codePoint in CodepointDerivedProperty .CONTEXTJ ||
246
+ codePoint in CodepointDerivedProperty .CONTEXTO
246
247
}
247
248
}
248
249
@@ -253,7 +254,7 @@ internal object IdnHostnameFormatValidator : AbstractStringFormatValidator() {
253
254
if (bidiLabelType == NONE ) {
254
255
return false
255
256
}
256
- return when (val directionality = getDirectionality( codePoint) ) {
257
+ return when (val directionality = codePoint.bidirectionalClass ) {
257
258
EUROPEAN_NUMBER ,
258
259
EUROPEAN_SEPARATOR ,
259
260
COMMON_SEPARATOR ,
@@ -297,10 +298,10 @@ internal object IdnHostnameFormatValidator : AbstractStringFormatValidator() {
297
298
}
298
299
var index = unicode.length
299
300
// Zero or more characters with Bidi property NSM are allowed in the end
300
- while (index > 0 && getDirectionality( unicode.codePointBefore(index)) == NONSPACING_MARK_DIRECTIONALITY ) {
301
+ while (index > 0 && unicode.codePointBefore(index).bidirectionalClass == NONSPACING_MARK_DIRECTIONALITY ) {
301
302
index--
302
303
}
303
- val lastCodepointDirectionality = getDirectionality( unicode.codePointBefore(index))
304
+ val lastCodepointDirectionality = unicode.codePointBefore(index).bidirectionalClass
304
305
return when (bidiLabelType) {
305
306
NONE -> false
306
307
RTL ->
@@ -456,7 +457,7 @@ internal object IdnHostnameFormatValidator : AbstractStringFormatValidator() {
456
457
return false
457
458
}
458
459
var j = index
459
- while (0 < j && JoiningType . TRANSPARENT .contains( unicode.codePointBefore(j)) ) {
460
+ while (0 < j && unicode.codePointBefore(j) in CodepointJoiningType . TRANSPARENT ) {
460
461
j - = 1
461
462
}
462
463
if (j == 0 ) {
@@ -465,8 +466,8 @@ internal object IdnHostnameFormatValidator : AbstractStringFormatValidator() {
465
466
}
466
467
val beforeFirstTransparent = unicode.codePointBefore(j)
467
468
if (
468
- ! JoiningType .LEFT_JOINING .contains(beforeFirstTransparent) &&
469
- ! JoiningType .DUAL_JOINING .contains(beforeFirstTransparent)
469
+ beforeFirstTransparent !in CodepointJoiningType .LEFT_JOINING &&
470
+ beforeFirstTransparent !in CodepointJoiningType .DUAL_JOINING
470
471
) {
471
472
return true
472
473
}
@@ -476,20 +477,20 @@ internal object IdnHostnameFormatValidator : AbstractStringFormatValidator() {
476
477
// Must have joining type T after
477
478
return true
478
479
}
479
- while (j < len && JoiningType . TRANSPARENT .contains( unicode.codePointAt(j)) ) {
480
+ while (j < len && unicode.codePointAt(j) in CodepointJoiningType . TRANSPARENT ) {
480
481
j + = 1
481
482
}
482
483
if (j == len) {
483
484
// Must have joining type R or D after last T type
484
485
return true
485
486
}
486
487
val afterLastTransparent = unicode.codePointAt(j)
487
- return ! JoiningType .RIGHT_JOINING .contains(afterLastTransparent) &&
488
- ! JoiningType .DUAL_JOINING .contains(afterLastTransparent)
488
+ return afterLastTransparent !in CodepointJoiningType .RIGHT_JOINING &&
489
+ afterLastTransparent !in CodepointJoiningType .DUAL_JOINING
489
490
}
490
491
491
492
private fun isLeadingCombiningMark (codePoint : Int ): Boolean =
492
- when (getCategory( codePoint) ) {
493
+ when (codePoint.category ) {
493
494
NONSPACING_MARK ,
494
495
SPACING_MARK ,
495
496
ENCLOSING_MARK ,
@@ -519,18 +520,6 @@ internal object IdnHostnameFormatValidator : AbstractStringFormatValidator() {
519
520
return value.length
520
521
}
521
522
522
- private fun getCategory (codePoint : Int ): CharacterCategory {
523
- return CharacterCategory .entries.first {
524
- it.characterData.contains(codePoint)
525
- }
526
- }
527
-
528
- private fun getDirectionality (codePoint : Int ): CharacterDirectionality {
529
- return CharacterDirectionality .entries.first {
530
- it.characterData.contains(codePoint)
531
- }
532
- }
533
-
534
523
@Suppress(" detekt:MagicNumber" )
535
524
private fun isArabicIndicDigit (code : Int ): Boolean = code in 0x0660 .. 0x0669
536
525
0 commit comments