gdxapp4d/gdxapp4d-lib-numberxd/src/main/java/love/distributedrebirth/numberxd/Gê̄ldGetậl.java

223 lines
8.7 KiB
Java
Raw Normal View History

2022-01-30 22:00:16 +01:00
package love.distributedrebirth.numberxd;
2022-01-28 11:24:54 +01:00
import java.util.ArrayList;
import java.util.List;
2022-02-04 22:44:11 +01:00
import love.distributedrebirth.numberxd.base2t.BaseIteratorOctal;
2022-11-07 20:50:55 +01:00
import love.distributedrebirth.numberxd.base2t.part.T004ᖟ;
2022-02-04 18:00:03 +01:00
import love.distributedrebirth.numberxd.base2t.type.V009Tyte;
import love.distributedrebirth.numberxd.base2t.type.V036Teger;
2022-10-10 18:04:27 +02:00
import love.distributedrebirth.numberxd.unicode.BaseGlyphSet;
import love.distributedrebirth.numberxd.unicode.SourceGlyph;
import love.distributedrebirth.numberxd.unicode.SourceGlyphCharSet;
2022-10-31 04:39:32 +01:00
import ᒢᐩᐩ.ᒃᣔᔆᔆᒃᐤᐤᣕ.Bãß;
2022-11-05 13:41:48 +01:00
import ᒢᐩᐩ.ᔆʸᔆᐪᓫᔿ.ᒃᣔᒃᓫᒻ.ᑊᐣᓑᖮᐪᔆ.DuytsDocAuthor注;
2022-01-28 11:24:54 +01:00
2022-10-30 16:59:24 +01:00
@DuytsDocAuthor注(name = "للَّٰهِilLצسُو", copyright = "©Δ∞ 仙上主天")
public class Gê̄ldGetậl extends AbstractBaseGetậlMatrix1<Gê̄ldGetậl,V009Tyte> {
2022-01-28 11:24:54 +01:00
2022-02-04 18:00:03 +01:00
private final V036Teger value;
2022-01-28 11:24:54 +01:00
private static final Character LEFT_TO_RIGHT_MARK = 0x200E;
private static final Character RIGHT_TO_LEFT_MARK = 0x200F;
2022-02-04 22:44:11 +01:00
public Gê̄ldGetậl(BaseIteratorOctal values) {
this (new V036Teger(values));
}
2022-02-04 18:00:03 +01:00
public Gê̄ldGetậl(V036Teger value) {
this.value = value;
2022-01-28 11:24:54 +01:00
}
2022-01-28 18:47:03 +01:00
public Gê̄ldGetậl(String money) {
2022-01-28 11:24:54 +01:00
if (money == null) {
throw new NullPointerException("Can't parse null money");
}
if (money.isEmpty()) {
throw new IllegalArgumentException("Can't parse zero money length");
}
2022-10-10 18:20:48 +02:00
if (money.length() > 9) { // RL + 4 chars + 4 vowels
throw new IllegalArgumentException("Money length should not exceed 9 codepoints");
2022-01-28 11:24:54 +01:00
}
2022-01-31 19:06:09 +01:00
List<Gê̄ldGetậlÅtHebrew> result = new ArrayList<>();
2022-01-28 11:24:54 +01:00
2022-01-31 19:06:09 +01:00
Gê̄ldGetậlÅtHebrew geldDigit = null;
2022-01-28 11:24:54 +01:00
for (int i=0;i<money.length();i++) {
char codePoint = (char) money.codePointAt(i);
if (LEFT_TO_RIGHT_MARK.equals(codePoint)) {
continue;
}
if (RIGHT_TO_LEFT_MARK.equals(codePoint)) {
continue;
}
if (geldDigit != null) {
2022-01-31 19:06:09 +01:00
Gê̄ldGetậlÅtHebrewVowel vowel = Gê̄ldGetậlÅtHebrewVowel.valueOfCharacter(codePoint);
if (!Gê̄ldGetậlÅtHebrewVowel.NONE.equals(vowel)) {
2022-01-28 11:24:54 +01:00
geldDigit.setVowel(vowel);
result.add(geldDigit);
geldDigit = null;
continue;
} else {
result.add(geldDigit);
}
}
2022-10-10 18:04:27 +02:00
Gê̄ldGetậlÅtHebrewVowel vowel = Gê̄ldGetậlÅtHebrewVowel.valueOfCharacter(codePoint);
if (!Gê̄ldGetậlÅtHebrewVowel.NONE.equals(vowel)) {
continue; // ignore multiple vowels on letters
}
2022-01-31 19:06:09 +01:00
Gê̄ldGetậlÅtHebrewLetter letter = Gê̄ldGetậlÅtHebrewLetter.valueOfCharacter(codePoint);
if (Gê̄ldGetậlÅtHebrewLetter.NONE.equals(letter)) {
2022-01-28 11:24:54 +01:00
throw new IllegalArgumentException("Unknown fraction codepoint: 0x"+Integer.toHexString(codePoint));
}
2022-01-31 19:06:09 +01:00
geldDigit = new Gê̄ldGetậlÅtHebrew(letter);
2022-01-28 11:24:54 +01:00
}
if (geldDigit != null) {
result.add(geldDigit);
}
if (result.isEmpty()) {
throw new IllegalArgumentException("No hebrew money found");
}
2022-10-10 18:04:27 +02:00
Gê̄ldGetậlÅtHebrew full0 = result.get(0);
2022-01-31 19:06:09 +01:00
Gê̄ldGetậlÅtHebrew deelA = null;
Gê̄ldGetậlÅtHebrew deelB = null;
Gê̄ldGetậlÅtHebrew deelC = null;
2022-01-28 11:24:54 +01:00
if (result.size() > 1) {
deelA = result.get(1);
} else {
2022-01-31 19:06:09 +01:00
deelA = new Gê̄ldGetậlÅtHebrew();
2022-01-28 11:24:54 +01:00
}
if (result.size() > 2) {
deelB = result.get(2);
} else {
2022-01-31 19:06:09 +01:00
deelB = new Gê̄ldGetậlÅtHebrew();
2022-01-28 11:24:54 +01:00
}
if (result.size() > 3) {
deelC = result.get(3);
} else {
2022-01-31 19:06:09 +01:00
deelC = new Gê̄ldGetậlÅtHebrew();
2022-01-28 11:24:54 +01:00
}
2022-02-04 18:00:03 +01:00
value = new V036Teger();
2022-11-07 20:50:55 +01:00
value.setTytePart(T004ᖟ.PART_1, full0.toTyte());
value.setTytePart(T004ᖟ.PART_2, deelA.toTyte());
value.setTytePart(T004ᖟ.PART_3, deelB.toTyte());
value.setTytePart(T004ᖟ.PART_4, deelC.toTyte());
2022-01-28 11:24:54 +01:00
}
2022-10-10 18:04:27 +02:00
private boolean hasHebrewLetters(Gê̄ldGetậlÅtHebrew...nummers) {
for (Gê̄ldGetậlÅtHebrew nummer:nummers) {
if (Gê̄ldGetậlÅtHebrewLetter.NONE.equals(nummer.getLetter())) {
return false;
}
}
return true;
}
public double toDecimalValue() {
2022-11-07 20:50:55 +01:00
Gê̄ldGetậlÅtHebrew nummerFull0 = new Gê̄ldGetậlÅtHebrew(value.getTytePart(T004ᖟ.PART_1));
Gê̄ldGetậlÅtHebrew nummerDeelA = new Gê̄ldGetậlÅtHebrew(value.getTytePart(T004ᖟ.PART_2));
Gê̄ldGetậlÅtHebrew nummerDeelB = new Gê̄ldGetậlÅtHebrew(value.getTytePart(T004ᖟ.PART_3));
Gê̄ldGetậlÅtHebrew nummerDeelC = new Gê̄ldGetậlÅtHebrew(value.getTytePart(T004ᖟ.PART_4));
2022-10-10 18:04:27 +02:00
boolean hasFourDigits = hasHebrewLetters(nummerDeelA, nummerDeelB, nummerDeelC);
double totalDecimalValue = nummerFull0.toDecimalValue(hasFourDigits);
2022-01-31 19:06:09 +01:00
if (!Gê̄ldGetậlÅtHebrewLetter.NONE.equals(nummerDeelA.getLetter())) {
2022-01-28 11:24:54 +01:00
totalDecimalValue += nummerDeelA.toDecimalValue(false);
}
2022-01-31 19:06:09 +01:00
if (!Gê̄ldGetậlÅtHebrewLetter.NONE.equals(nummerDeelB.getLetter())) {
2022-01-28 11:24:54 +01:00
totalDecimalValue += nummerDeelB.toDecimalValue(false);
}
2022-01-31 19:06:09 +01:00
if (!Gê̄ldGetậlÅtHebrewLetter.NONE.equals(nummerDeelC.getLetter())) {
2022-01-28 11:24:54 +01:00
totalDecimalValue += nummerDeelC.toDecimalValue(false);
}
return totalDecimalValue;
}
2022-10-10 18:04:27 +02:00
public String toFractionNotation(BaseGlyphSet glyphCharset, SourceGlyphCharSet sourceCharset) {
2022-11-07 20:50:55 +01:00
Gê̄ldGetậlÅtHebrew nummerFull0 = new Gê̄ldGetậlÅtHebrew(value.getTytePart(T004ᖟ.PART_1));
Gê̄ldGetậlÅtHebrew nummerDeelA = new Gê̄ldGetậlÅtHebrew(value.getTytePart(T004ᖟ.PART_2));
Gê̄ldGetậlÅtHebrew nummerDeelB = new Gê̄ldGetậlÅtHebrew(value.getTytePart(T004ᖟ.PART_3));
Gê̄ldGetậlÅtHebrew nummerDeelC = new Gê̄ldGetậlÅtHebrew(value.getTytePart(T004ᖟ.PART_4));
2022-10-10 18:04:27 +02:00
boolean hasFourDigits = hasHebrewLetters(nummerDeelA, nummerDeelB, nummerDeelC);
StringBuilder buf = new StringBuilder();
buf.append(LEFT_TO_RIGHT_MARK);
nummerFull0.toFractionNotation(hasFourDigits, buf, glyphCharset, sourceCharset);
if (!Gê̄ldGetậlÅtHebrewLetter.NONE.equals(nummerDeelA.getLetter())) {
buf.append(Bãß.ℭỗᶇṧⱦᶏꬼȶʂ.STR_SPACE);
2022-10-10 18:04:27 +02:00
buf.append(sourceCharset.print(SourceGlyph.MATH_PLUS));
buf.append(Bãß.ℭỗᶇṧⱦᶏꬼȶʂ.STR_SPACE);
2022-10-10 18:04:27 +02:00
nummerDeelA.toFractionNotation(false, buf, glyphCharset, sourceCharset);
}
if (!Gê̄ldGetậlÅtHebrewLetter.NONE.equals(nummerDeelB.getLetter())) {
buf.append(Bãß.ℭỗᶇṧⱦᶏꬼȶʂ.STR_SPACE);
2022-10-10 18:04:27 +02:00
buf.append(sourceCharset.print(SourceGlyph.MATH_PLUS));
buf.append(Bãß.ℭỗᶇṧⱦᶏꬼȶʂ.STR_SPACE);
2022-10-10 18:04:27 +02:00
nummerDeelB.toFractionNotation(false, buf, glyphCharset, sourceCharset);
}
if (!Gê̄ldGetậlÅtHebrewLetter.NONE.equals(nummerDeelC.getLetter())) {
buf.append(Bãß.ℭỗᶇṧⱦᶏꬼȶʂ.STR_SPACE);
2022-10-10 18:04:27 +02:00
buf.append(sourceCharset.print(SourceGlyph.MATH_PLUS));
buf.append(Bãß.ℭỗᶇṧⱦᶏꬼȶʂ.STR_SPACE);
2022-10-10 18:04:27 +02:00
nummerDeelC.toFractionNotation(false, buf, glyphCharset, sourceCharset);
}
return buf.toString();
2022-01-28 11:24:54 +01:00
}
public String toHebrewString() {
return toHebrewString(false);
}
public String toHebrewString(boolean reverse) {
2022-11-07 20:50:55 +01:00
Gê̄ldGetậlÅtHebrew nummerFull0 = new Gê̄ldGetậlÅtHebrew(value.getTytePart(T004ᖟ.PART_1));
Gê̄ldGetậlÅtHebrew nummerDeelA = new Gê̄ldGetậlÅtHebrew(value.getTytePart(T004ᖟ.PART_2));
Gê̄ldGetậlÅtHebrew nummerDeelB = new Gê̄ldGetậlÅtHebrew(value.getTytePart(T004ᖟ.PART_3));
Gê̄ldGetậlÅtHebrew nummerDeelC = new Gê̄ldGetậlÅtHebrew(value.getTytePart(T004ᖟ.PART_4));
2022-01-28 11:24:54 +01:00
StringBuilder buf = new StringBuilder();
buf.append(RIGHT_TO_LEFT_MARK);
2022-10-10 18:04:27 +02:00
buf.append(nummerFull0.getLetter().getCharacter());
if (!Gê̄ldGetậlÅtHebrewVowel.NONE.equals(nummerFull0.getVowel())) {
buf.append(nummerFull0.getVowel().getCharacter());
2022-01-28 11:24:54 +01:00
}
2022-01-31 19:06:09 +01:00
if (!Gê̄ldGetậlÅtHebrewLetter.NONE.equals(nummerDeelA.getLetter())) {
2022-01-28 11:24:54 +01:00
buf.append(nummerDeelA.getLetter().getCharacter());
2022-01-31 19:06:09 +01:00
if (!Gê̄ldGetậlÅtHebrewVowel.NONE.equals(nummerDeelA.getVowel())) {
2022-01-28 11:24:54 +01:00
buf.append(nummerDeelA.getVowel().getCharacter());
}
}
2022-01-31 19:06:09 +01:00
if (!Gê̄ldGetậlÅtHebrewLetter.NONE.equals(nummerDeelB.getLetter())) {
2022-01-28 11:24:54 +01:00
buf.append(nummerDeelB.getLetter().getCharacter());
2022-01-31 19:06:09 +01:00
if (!Gê̄ldGetậlÅtHebrewVowel.NONE.equals(nummerDeelB.getVowel())) {
2022-01-28 11:24:54 +01:00
buf.append(nummerDeelB.getVowel().getCharacter());
}
}
2022-01-31 19:06:09 +01:00
if (!Gê̄ldGetậlÅtHebrewLetter.NONE.equals(nummerDeelC.getLetter())) {
2022-01-28 11:24:54 +01:00
buf.append(nummerDeelC.getLetter().getCharacter());
2022-01-31 19:06:09 +01:00
if (!Gê̄ldGetậlÅtHebrewVowel.NONE.equals(nummerDeelC.getVowel())) {
2022-01-28 11:24:54 +01:00
buf.append(nummerDeelC.getVowel().getCharacter());
}
}
if (reverse) {
2022-10-10 18:04:27 +02:00
return buf.reverse().toString(); // ImGui skips RL marker so renders wrong....
2022-01-28 11:24:54 +01:00
}
return buf.toString();
}
2022-02-04 18:00:03 +01:00
@Override
public int getMatrix1Length() {
2022-11-07 20:50:55 +01:00
return T004ᖟ.STATIC.BãßĦǿɇṽḝę̃ɬḪễïđ();
2022-02-04 18:00:03 +01:00
}
@Override
public V009Tyte getValue() {
2022-11-07 20:50:55 +01:00
return value.getTytePart(T004ᖟ.values()[matrix1]);
2022-02-04 18:00:03 +01:00
}
@Override
2022-02-04 22:44:11 +01:00
public Gê̄ldGetậl toClone(BaseIteratorOctal values) {
return new Gê̄ldGetậl(values);
}
@Override
public BaseIteratorOctal iteratorOctalsByClone() {
return value.iteratorOctalsByClone();
2022-02-04 18:00:03 +01:00
}
2022-01-28 11:24:54 +01:00
}