From d51c40760ad856182222dce06779395602ace47b Mon Sep 17 00:00:00 2001
From: Robin Leroy
Date: Fri, 7 Jun 2024 03:55:07 +0200
Subject: [PATCH 01/31] Parse Unikemet (#855)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
* Parse Unikemet
* Basic invariants
* Binary properties (Core is binary but will soon cease to be, so let’s ignore it.)
* Move the normatives and informatives (excluding kEH_Core) out of extra
* Extra! Extra! Read all about it!
---
unicodetools/data/ucd/dev/PropertyAliases.txt | 11 +++++--
.../data/ucd/dev/PropertyValueAliases.txt | 32 ++++++++++++++++++-
.../unicode/props/PropertyParsingInfo.java | 4 ++-
.../org/unicode/props/PropertyStatus.java | 14 ++++++--
.../java/org/unicode/props/UcdProperty.java | 11 +++++++
.../org/unicode/props/UcdPropertyValues.java | 8 +++++
.../text/UCD/ToolUnicodePropertySource.java | 7 ++++
.../unicode/props/ExtraPropertyAliases.txt | 8 +++++
.../props/ExtraPropertyValueAliases.txt | 9 ++++++
.../unicode/props/IndexUnicodeProperties.txt | 13 ++++++++
.../unicode/text/UCD/UnicodeInvariantTest.txt | 9 ++++++
11 files changed, 120 insertions(+), 6 deletions(-)
diff --git a/unicodetools/data/ucd/dev/PropertyAliases.txt b/unicodetools/data/ucd/dev/PropertyAliases.txt
index addbb0253..69dbb8d2e 100644
--- a/unicodetools/data/ucd/dev/PropertyAliases.txt
+++ b/unicodetools/data/ucd/dev/PropertyAliases.txt
@@ -1,5 +1,5 @@
# PropertyAliases-16.0.0.txt
-# Date: 2024-04-30, 21:48:30 GMT
+# Date: 2024-06-06, 21:52:48 GMT
# © 2024 Unicode®, Inc.
# Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries.
# For terms of use and license, see https://www.unicode.org/terms_of_use.html
@@ -99,6 +99,11 @@ cjkIRG_VSource ; kIRG_VSource
cjkRSUnicode ; kRSUnicode ; Unicode_Radical_Stroke; URS
isc ; ISO_Comment
JSN ; Jamo_Short_Name
+kEH_Cat ; kEH_Cat
+kEH_Desc ; kEH_Desc
+kEH_HG ; kEH_HG
+kEH_IFAO ; kEH_IFAO
+kEH_JSesh ; kEH_JSesh
na ; Name
na1 ; Unicode_1_Name
Name_Alias ; Name_Alias
@@ -179,6 +184,8 @@ IDSB ; IDS_Binary_Operator
IDST ; IDS_Trinary_Operator
IDSU ; IDS_Unary_Operator
Join_C ; Join_Control
+kEH_NoMirror ; kEH_NoMirror
+kEH_NoRotate ; kEH_NoRotate
LOE ; Logical_Order_Exception
Lower ; Lowercase
Math ; Math
@@ -213,6 +220,6 @@ XO_NFKC ; Expands_On_NFKC
XO_NFKD ; Expands_On_NFKD
# ================================================
-# Total: 135
+# Total: 142
# EOF
diff --git a/unicodetools/data/ucd/dev/PropertyValueAliases.txt b/unicodetools/data/ucd/dev/PropertyValueAliases.txt
index 0c001de16..0c42297a1 100644
--- a/unicodetools/data/ucd/dev/PropertyValueAliases.txt
+++ b/unicodetools/data/ucd/dev/PropertyValueAliases.txt
@@ -1,5 +1,5 @@
# PropertyValueAliases-16.0.0.txt
-# Date: 2024-04-30, 21:48:30 GMT
+# Date: 2024-06-06, 22:21:34 GMT
# © 2024 Unicode®, Inc.
# Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries.
# For terms of use and license, see https://www.unicode.org/terms_of_use.html
@@ -1674,4 +1674,34 @@ XIDS; Y ; Yes ; T
# @missing: 0000..10FFFF; cjkRSUnicode;
+# kEH_Cat (kEH_Cat)
+
+# @missing: 0000..10FFFF; kEH_Cat;
+
+# kEH_Desc (kEH_Desc)
+
+# @missing: 0000..10FFFF; kEH_Desc;
+
+# kEH_HG (kEH_HG)
+
+# @missing: 0000..10FFFF; kEH_HG;
+
+# kEH_IFAO (kEH_IFAO)
+
+# @missing: 0000..10FFFF; kEH_IFAO;
+
+# kEH_JSesh (kEH_JSesh)
+
+# @missing: 0000..10FFFF; kEH_JSesh;
+
+# kEH_NoMirror (kEH_NoMirror)
+
+kEH_NoMirror; N ; No ; F ; False
+kEH_NoMirror; Y ; Yes ; T ; True
+
+# kEH_NoRotate (kEH_NoRotate)
+
+kEH_NoRotate; N ; No ; F ; False
+kEH_NoRotate; Y ; Yes ; T ; True
+
# EOF
diff --git a/unicodetools/src/main/java/org/unicode/props/PropertyParsingInfo.java b/unicodetools/src/main/java/org/unicode/props/PropertyParsingInfo.java
index 68ff0d963..cdae87a0e 100644
--- a/unicodetools/src/main/java/org/unicode/props/PropertyParsingInfo.java
+++ b/unicodetools/src/main/java/org/unicode/props/PropertyParsingInfo.java
@@ -516,7 +516,9 @@ static void parseSourceFile(
} else {
indexUnicodeProperties.getFileNames().add(fullFilename);
UcdLineParser parser = new UcdLineParser(FileUtilities.in("", fullFilename));
- if (fileName.startsWith("Unihan") || fileName.startsWith("k")) {
+ if (fileName.startsWith("Unihan")
+ || fileName.startsWith("Unikemet")
+ || fileName.startsWith("k")) {
parser.withTabs(true);
}
PropertyParsingInfo propInfo;
diff --git a/unicodetools/src/main/java/org/unicode/props/PropertyStatus.java b/unicodetools/src/main/java/org/unicode/props/PropertyStatus.java
index da2e3c175..3bd97f746 100644
--- a/unicodetools/src/main/java/org/unicode/props/PropertyStatus.java
+++ b/unicodetools/src/main/java/org/unicode/props/PropertyStatus.java
@@ -131,6 +131,7 @@ public enum PropertyScope {
UcdProperty.Emoji_KDDI,
UcdProperty.Emoji_SB);
+ // TODO(egg): These lists are not up to date!
private static final EnumSet CONTRIBUTORY_PROPERTY =
EnumSet.of(
UcdProperty.Jamo_Short_Name,
@@ -230,7 +231,10 @@ public enum PropertyScope {
UcdProperty.Named_Sequences_Prov,
UcdProperty.Regional_Indicator,
UcdProperty.Standardized_Variant,
- UcdProperty.Vertical_Orientation);
+ UcdProperty.Vertical_Orientation,
+ // Unikemet
+ UcdProperty.kEH_Cat,
+ UcdProperty.kEH_Desc);
private static final EnumSet NORMATIVE_PROPERTY =
EnumSet.of(
@@ -290,7 +294,13 @@ public enum PropertyScope {
UcdProperty.kIRG_MSource,
UcdProperty.kIRG_TSource,
UcdProperty.kIRG_USource,
- UcdProperty.kIRG_VSource);
+ UcdProperty.kIRG_VSource,
+ // Unikemet
+ UcdProperty.kEH_HG,
+ UcdProperty.kEH_IFAO,
+ UcdProperty.kEH_JSesh,
+ UcdProperty.kEH_NoMirror,
+ UcdProperty.kEH_NoRotate);
private static final EnumSet IMMUTABLE_PROPERTY =
EnumSet.of(
UcdProperty.Name,
diff --git a/unicodetools/src/main/java/org/unicode/props/UcdProperty.java b/unicodetools/src/main/java/org/unicode/props/UcdProperty.java
index 0e18f8867..03aebe1e7 100644
--- a/unicodetools/src/main/java/org/unicode/props/UcdProperty.java
+++ b/unicodetools/src/main/java/org/unicode/props/UcdProperty.java
@@ -105,6 +105,14 @@ public enum UcdProperty {
kDaeJaweon(PropertyType.Miscellaneous, "cjkDaeJaweon"),
kDefinition(PropertyType.Miscellaneous, "cjkDefinition"),
kEACC(PropertyType.Miscellaneous, "cjkEACC"),
+ kEH_Cat(PropertyType.Miscellaneous, "kEH_Cat"),
+ kEH_Desc(PropertyType.Miscellaneous, "kEH_Desc"),
+ kEH_FVal(PropertyType.Miscellaneous, "kEH_FVal"),
+ kEH_Func(PropertyType.Miscellaneous, "kEH_Func"),
+ kEH_HG(PropertyType.Miscellaneous, "kEH_HG"),
+ kEH_IFAO(PropertyType.Miscellaneous, "kEH_IFAO"),
+ kEH_JSesh(PropertyType.Miscellaneous, "kEH_JSesh"),
+ kEH_UniK(PropertyType.Miscellaneous, "kEH_UniK"),
kFanqie(PropertyType.Miscellaneous, "cjkFanqie"),
kFenn(PropertyType.Miscellaneous, null, ValueCardinality.Unordered, "cjkFenn"),
kFennIndex(PropertyType.Miscellaneous, null, ValueCardinality.Unordered, "cjkFennIndex"),
@@ -341,6 +349,9 @@ public enum UcdProperty {
White_Space(PropertyType.Binary, Binary.class, null, "WSpace", "space"),
XID_Continue(PropertyType.Binary, Binary.class, null, "XIDC"),
XID_Start(PropertyType.Binary, Binary.class, null, "XIDS"),
+ kEH_Core(PropertyType.Binary, Binary.class, null, "kEH_Core"),
+ kEH_NoMirror(PropertyType.Binary, Binary.class, null, "kEH_NoMirror"),
+ kEH_NoRotate(PropertyType.Binary, Binary.class, null, "kEH_NoRotate"),
// Unknown
;
diff --git a/unicodetools/src/main/java/org/unicode/props/UcdPropertyValues.java b/unicodetools/src/main/java/org/unicode/props/UcdPropertyValues.java
index a8f161963..c5414864f 100644
--- a/unicodetools/src/main/java/org/unicode/props/UcdPropertyValues.java
+++ b/unicodetools/src/main/java/org/unicode/props/UcdPropertyValues.java
@@ -1433,6 +1433,14 @@ public static Joining_Type_Values forName(String name) {
// kDaeJaweon
// kDefinition
// kEACC
+ // kEH_Cat
+ // kEH_Desc
+ // kEH_Func
+ // kEH_FVal
+ // kEH_HG
+ // kEH_IFAO
+ // kEH_JSesh
+ // kEH_UniK
// kFanqie
// kFenn
// kFennIndex
diff --git a/unicodetools/src/main/java/org/unicode/text/UCD/ToolUnicodePropertySource.java b/unicodetools/src/main/java/org/unicode/text/UCD/ToolUnicodePropertySource.java
index 582d42eec..ef3e215a6 100644
--- a/unicodetools/src/main/java/org/unicode/text/UCD/ToolUnicodePropertySource.java
+++ b/unicodetools/src/main/java/org/unicode/text/UCD/ToolUnicodePropertySource.java
@@ -309,6 +309,13 @@ public String _getValue(int codepoint) {
"cjkIRG_VSource",
"cjkIRG_VSource",
"kIRG_VSource");
+ add(iup.getProperty("kEH_Cat"));
+ add(iup.getProperty("kEH_Desc"));
+ add(iup.getProperty("kEH_HG"));
+ add(iup.getProperty("kEH_IFAO"));
+ add(iup.getProperty("kEH_JSesh"));
+ add(iup.getProperty("kEH_NoMirror"));
+ add(iup.getProperty("kEH_NoRotate"));
add(iup.getProperty("Emoji"));
add(iup.getProperty("Emoji_Presentation"));
add(iup.getProperty("Emoji_Modifier"));
diff --git a/unicodetools/src/main/resources/org/unicode/props/ExtraPropertyAliases.txt b/unicodetools/src/main/resources/org/unicode/props/ExtraPropertyAliases.txt
index db657d34b..32f5964cc 100644
--- a/unicodetools/src/main/resources/org/unicode/props/ExtraPropertyAliases.txt
+++ b/unicodetools/src/main/resources/org/unicode/props/ExtraPropertyAliases.txt
@@ -17,6 +17,10 @@ RETS ; RGI_Emoji_Tag_Sequence ; Emoji_Tag_Sequence
REZS ; RGI_Emoji_Zwj_Sequence ; Emoji_Zwj_Sequence
# RE ; RGI_Emoji
+kEH_Core ; kEH_Core
+kEH_NoMirror ; kEH_NoMirror
+kEH_NoRotate ; kEH_NoRotate
+
# ================================================
# Enumerated Properties
# ================================================
@@ -162,3 +166,7 @@ cjkVietnameseNumeric ; kVietnameseNumeric
cjkZhuangNumeric ; kZhuangNumeric
# 16.0
cjkFanqie ; kFanqie
+
+kEH_Func ; kEH_Func
+kEH_FVal ; kEH_FVal
+kEH_UniK ; kEH_UniK
\ No newline at end of file
diff --git a/unicodetools/src/main/resources/org/unicode/props/ExtraPropertyValueAliases.txt b/unicodetools/src/main/resources/org/unicode/props/ExtraPropertyValueAliases.txt
index 98613a31c..ec9b190fb 100644
--- a/unicodetools/src/main/resources/org/unicode/props/ExtraPropertyValueAliases.txt
+++ b/unicodetools/src/main/resources/org/unicode/props/ExtraPropertyValueAliases.txt
@@ -85,6 +85,10 @@
# @missing: 0000..10FFFF; Emoji_Component ; No
# @missing: 0000..10FFFF; Extended_Pictographic ; No
+# @missing: 0000..10FFFF; kEH_Core ; No
+# @missing: 0000..10FFFF; kEH_NoMirror ; No
+# @missing: 0000..10FFFF; kEH_NoRotate ; No
+
# End of binary properties.
# @missing: 0000..10FFFF; Canonical_Combining_Class; Not_Reordered
@@ -194,3 +198,8 @@ Do_Not_Emit_Type ; Precomposed_Form ; Precomposed_Form
Do_Not_Emit_Type ; Deprecated ; Deprecated
Do_Not_Emit_Type ; Discouraged ; Discouraged
Do_Not_Emit_Type ; Preferred_Spelling ; Preferred_Spelling
+
+
+# @missing: 0000..10FFFF; kEH_Func ;
+# @missing: 0000..10FFFF; kEH_FVal ;
+# @missing: 0000..10FFFF; kEH_UniK ;
diff --git a/unicodetools/src/main/resources/org/unicode/props/IndexUnicodeProperties.txt b/unicodetools/src/main/resources/org/unicode/props/IndexUnicodeProperties.txt
index 71f5ffe73..d66101597 100644
--- a/unicodetools/src/main/resources/org/unicode/props/IndexUnicodeProperties.txt
+++ b/unicodetools/src/main/resources/org/unicode/props/IndexUnicodeProperties.txt
@@ -368,3 +368,16 @@ emoji/*/emoji-sequences; RGI_Emoji_Tag_Sequence
emoji/*/emoji-zwj-sequences; RGI_Emoji_Zwj_Sequence
#emoji/*/emoji-test ; Emoji_Short_Name
+
+FileType ; Unikemet ; PropertyValue
+Unikemet ; kEH_Cat
+Unikemet ; kEH_Core
+Unikemet ; kEH_Desc
+Unikemet ; kEH_Func
+Unikemet ; kEH_FVal
+Unikemet ; kEH_JSesh
+Unikemet ; kEH_HG
+Unikemet ; kEH_IFAO
+Unikemet ; kEH_NoMirror
+Unikemet ; kEH_NoRotate
+Unikemet ; kEH_UniK
\ No newline at end of file
diff --git a/unicodetools/src/main/resources/org/unicode/text/UCD/UnicodeInvariantTest.txt b/unicodetools/src/main/resources/org/unicode/text/UCD/UnicodeInvariantTest.txt
index 3b3f3c35a..9f6ba19f5 100644
--- a/unicodetools/src/main/resources/org/unicode/text/UCD/UnicodeInvariantTest.txt
+++ b/unicodetools/src/main/resources/org/unicode/text/UCD/UnicodeInvariantTest.txt
@@ -1090,6 +1090,15 @@ Let $japaneseSimplifiedRadicals = \p{Name=/CJK RADICAL J-SIMPLIFIED/}
In $chineseSimplifiedRadicals, Equivalent_Unified_Ideograph ∈ [\p{kRSUnicode=/^[0-9]+'\.0$/} $radicalsWithUnifiableSimplifications]
In $japaneseSimplifiedRadicals, Equivalent_Unified_Ideograph ∈ \p{kRSUnicode=/^[0-9]+''\.0$/}
+# Egyptian hieroglyph invariants
+
+Let $unikemetScope = [\p{Block=/^Egyptian.Hieroglyphs/} - \p{gc=Cn}]
+$unikemetScope = [ [\p{gc=Lo} & \p{sc=Egyp}] - \p{Name=/^EGYPTIAN HIEROGLYPH (FULL |HALF |TALL |WIDE )?(BLANK|LOST SIGN)$/} ]
+$unikemetScope = \P{kEH_Cat=@none@}
+$unikemetScope = \P{kEH_UniK=@none@}
+\p{kEH_NoMirror} ⊂ $unikemetScope
+\p{kEH_NoRotate} ⊂ $unikemetScope
+
# InPC-InSC-gc invariants
# See https://www.unicode.org/L2/L2023/23200-category-invariants.pdf.
\p{InPC=/(Left|Right)/} ⊆ [\p{gc=Mc}\p{gc=Lo}\p{gc=Lm}]
From 5a4870ea20f4998128a61142a103ee6f18fbf879 Mon Sep 17 00:00:00 2001
From: Robin Leroy
Date: Fri, 7 Jun 2024 13:21:04 +0200
Subject: [PATCH 02/31] =?UTF-8?q?Parse=20Tangut=20and=20N=C3=BCshu=20sourc?=
=?UTF-8?q?es=20(#856)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../org/unicode/props/PropertyParsingInfo.java | 1 +
.../main/java/org/unicode/props/UcdProperty.java | 4 ++++
.../java/org/unicode/props/UcdPropertyValues.java | 4 ++++
.../org/unicode/props/ExtraPropertyAliases.txt | 6 ++++++
.../unicode/props/ExtraPropertyValueAliases.txt | 5 +++++
.../org/unicode/props/IndexUnicodeProperties.txt | 9 +++++++++
.../org/unicode/text/UCD/UnicodeInvariantTest.txt | 14 ++++++++++++++
7 files changed, 43 insertions(+)
diff --git a/unicodetools/src/main/java/org/unicode/props/PropertyParsingInfo.java b/unicodetools/src/main/java/org/unicode/props/PropertyParsingInfo.java
index cdae87a0e..6c794380e 100644
--- a/unicodetools/src/main/java/org/unicode/props/PropertyParsingInfo.java
+++ b/unicodetools/src/main/java/org/unicode/props/PropertyParsingInfo.java
@@ -518,6 +518,7 @@ static void parseSourceFile(
UcdLineParser parser = new UcdLineParser(FileUtilities.in("", fullFilename));
if (fileName.startsWith("Unihan")
|| fileName.startsWith("Unikemet")
+ || (fileName.endsWith("Sources") && !fileName.startsWith("Emoji"))
|| fileName.startsWith("k")) {
parser.withTabs(true);
}
diff --git a/unicodetools/src/main/java/org/unicode/props/UcdProperty.java b/unicodetools/src/main/java/org/unicode/props/UcdProperty.java
index 03aebe1e7..fd9e5b7a3 100644
--- a/unicodetools/src/main/java/org/unicode/props/UcdProperty.java
+++ b/unicodetools/src/main/java/org/unicode/props/UcdProperty.java
@@ -190,6 +190,7 @@ public enum UcdProperty {
kRSKanWa(PropertyType.Miscellaneous, "cjkRSKanWa"),
kRSKangXi(PropertyType.Miscellaneous, "cjkRSKangXi"),
kRSKorean(PropertyType.Miscellaneous, "cjkRSKorean"),
+ kRSTUnicode(PropertyType.Miscellaneous, "kRSTUnicode"),
kRSUnicode(
PropertyType.Miscellaneous,
null,
@@ -197,6 +198,7 @@ public enum UcdProperty {
"cjkRSUnicode",
"Unicode_Radical_Stroke",
"URS"),
+ kReading(PropertyType.Miscellaneous, "kReading"),
kSBGY(PropertyType.Miscellaneous, null, ValueCardinality.Unordered, "cjkSBGY"),
kSMSZD2003Index(PropertyType.Miscellaneous, "cjkSMSZD2003Index"),
kSMSZD2003Readings(PropertyType.Miscellaneous, "cjkSMSZD2003Readings"),
@@ -208,9 +210,11 @@ public enum UcdProperty {
ValueCardinality.Unordered,
"cjkSpecializedSemanticVariant"),
kSpoofingVariant(PropertyType.Miscellaneous, "cjkSpoofingVariant"),
+ kSrc_NushuDuben(PropertyType.Miscellaneous, "kSrc_NushuDuben"),
kStrange(PropertyType.Miscellaneous, "cjkStrange"),
kTGH(PropertyType.Miscellaneous, null, ValueCardinality.Unordered, "cjkTGH"),
kTGHZ2013(PropertyType.Miscellaneous, "cjkTGHZ2013"),
+ kTGT_MergedSrc(PropertyType.Miscellaneous, "kTGT_MergedSrc"),
kTaiwanTelegraph(PropertyType.Miscellaneous, "cjkTaiwanTelegraph"),
kTang(PropertyType.Miscellaneous, null, ValueCardinality.Unordered, "cjkTang"),
kTotalStrokes(PropertyType.Miscellaneous, null, ValueCardinality.Ordered, "cjkTotalStrokes"),
diff --git a/unicodetools/src/main/java/org/unicode/props/UcdPropertyValues.java b/unicodetools/src/main/java/org/unicode/props/UcdPropertyValues.java
index c5414864f..37020e727 100644
--- a/unicodetools/src/main/java/org/unicode/props/UcdPropertyValues.java
+++ b/unicodetools/src/main/java/org/unicode/props/UcdPropertyValues.java
@@ -1508,11 +1508,13 @@ public static Joining_Type_Values forName(String name) {
// kPhonetic
// kPrimaryNumeric
// kPseudoGB1
+ // kReading
// kRSAdobe_Japan1_6
// kRSJapanese
// kRSKangXi
// kRSKanWa
// kRSKorean
+ // kRSTUnicode
// kRSUnicode
// kSBGY
// kSemanticVariant
@@ -1521,11 +1523,13 @@ public static Joining_Type_Values forName(String name) {
// kSMSZD2003Readings
// kSpecializedSemanticVariant
// kSpoofingVariant
+ // kSrc_NushuDuben
// kStrange
// kTaiwanTelegraph
// kTang
// kTGH
// kTGHZ2013
+ // kTGT_MergedSrc
// kTotalStrokes
// kTraditionalVariant
// kUnihanCore2020
diff --git a/unicodetools/src/main/resources/org/unicode/props/ExtraPropertyAliases.txt b/unicodetools/src/main/resources/org/unicode/props/ExtraPropertyAliases.txt
index 32f5964cc..80faee3c7 100644
--- a/unicodetools/src/main/resources/org/unicode/props/ExtraPropertyAliases.txt
+++ b/unicodetools/src/main/resources/org/unicode/props/ExtraPropertyAliases.txt
@@ -167,6 +167,12 @@ cjkZhuangNumeric ; kZhuangNumeric
# 16.0
cjkFanqie ; kFanqie
+kTGT_MergedSrc ; kTGT_MergedSrc
+kRSTUnicode ; kRSTUnicode
+
+kSrc_NushuDuben ; kSrc_NushuDuben
+kReading ; kReading
+
kEH_Func ; kEH_Func
kEH_FVal ; kEH_FVal
kEH_UniK ; kEH_UniK
\ No newline at end of file
diff --git a/unicodetools/src/main/resources/org/unicode/props/ExtraPropertyValueAliases.txt b/unicodetools/src/main/resources/org/unicode/props/ExtraPropertyValueAliases.txt
index ec9b190fb..8d659c98f 100644
--- a/unicodetools/src/main/resources/org/unicode/props/ExtraPropertyValueAliases.txt
+++ b/unicodetools/src/main/resources/org/unicode/props/ExtraPropertyValueAliases.txt
@@ -199,6 +199,11 @@ Do_Not_Emit_Type ; Deprecated ; Deprecated
Do_Not_Emit_Type ; Discouraged ; Discouraged
Do_Not_Emit_Type ; Preferred_Spelling ; Preferred_Spelling
+# @missing: 0000..10FFFF; kTGT_MergedSrc ;
+# @missing: 0000..10FFFF; kRSTUnicode ;
+
+# @missing: 0000..10FFFF; kSrc_NushuDuben ;
+# @missing: 0000..10FFFF; kReading ;
# @missing: 0000..10FFFF; kEH_Func ;
# @missing: 0000..10FFFF; kEH_FVal ;
diff --git a/unicodetools/src/main/resources/org/unicode/props/IndexUnicodeProperties.txt b/unicodetools/src/main/resources/org/unicode/props/IndexUnicodeProperties.txt
index d66101597..018f9614d 100644
--- a/unicodetools/src/main/resources/org/unicode/props/IndexUnicodeProperties.txt
+++ b/unicodetools/src/main/resources/org/unicode/props/IndexUnicodeProperties.txt
@@ -369,6 +369,15 @@ emoji/*/emoji-zwj-sequences; RGI_Emoji_Zwj_Sequence
#emoji/*/emoji-test ; Emoji_Short_Name
+
+FileType ; TangutSources ; PropertyValue
+TangutSources ; kTGT_MergedSrc
+TangutSources ; kRSTUnicode
+
+FileType ; NushuSources ; PropertyValue
+NushuSources ; kSrc_NushuDuben
+NushuSources ; kReading
+
FileType ; Unikemet ; PropertyValue
Unikemet ; kEH_Cat
Unikemet ; kEH_Core
diff --git a/unicodetools/src/main/resources/org/unicode/text/UCD/UnicodeInvariantTest.txt b/unicodetools/src/main/resources/org/unicode/text/UCD/UnicodeInvariantTest.txt
index 9f6ba19f5..65d0004eb 100644
--- a/unicodetools/src/main/resources/org/unicode/text/UCD/UnicodeInvariantTest.txt
+++ b/unicodetools/src/main/resources/org/unicode/text/UCD/UnicodeInvariantTest.txt
@@ -1090,6 +1090,20 @@ Let $japaneseSimplifiedRadicals = \p{Name=/CJK RADICAL J-SIMPLIFIED/}
In $chineseSimplifiedRadicals, Equivalent_Unified_Ideograph ∈ [\p{kRSUnicode=/^[0-9]+'\.0$/} $radicalsWithUnifiableSimplifications]
In $japaneseSimplifiedRadicals, Equivalent_Unified_Ideograph ∈ \p{kRSUnicode=/^[0-9]+''\.0$/}
+# Tangut invariants
+
+Let $tangutSourcesScope = [\p{Block=/^Tangut(.Supplement)?$/} - \p{gc=Cn}]
+$tangutSourcesScope = [ [\p{gc=Lo} & \p{sc=Tangut}] - \p{name=/^TANGUT COMPONENT-/} ]
+$tangutSourcesScope = \P{kTGT_MergedSrc=@none@}
+$tangutSourcesScope = \P{kRSTUnicode=@none@}
+
+# Nüshu invariants
+
+Let $nüshuSourcesScope = [\p{Block=Nushu} - \p{gc=Cn}]
+$nüshuSourcesScope = [\p{gc=Lo} & \p{sc=Nushu}]
+$nüshuSourcesScope = \P{kSrc_NushuDuben=@none@}
+$nüshuSourcesScope = \P{kReading=@none@}
+
# Egyptian hieroglyph invariants
Let $unikemetScope = [\p{Block=/^Egyptian.Hieroglyphs/} - \p{gc=Cn}]
From 8215285feec2d776a48cd1d6e48fb7a8e45a8b5a Mon Sep 17 00:00:00 2001
From: Robin Leroy
Date: Fri, 7 Jun 2024 18:20:09 +0200
Subject: [PATCH 03/31] =?UTF-8?q?Prepare=20the=20JSPs=20for=20=CE=B2=20(#8?=
=?UTF-8?q?57)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
docs/help/changes.md | 36 +++++++++----------
.../unicode/text/UCD/VersionedProperty.java | 13 +++++--
.../org/unicode/text/utility/Settings.java | 2 +-
3 files changed, 28 insertions(+), 23 deletions(-)
diff --git a/docs/help/changes.md b/docs/help/changes.md
index 32a91caa6..c4cf6cafe 100644
--- a/docs/help/changes.md
+++ b/docs/help/changes.md
@@ -3,42 +3,38 @@
The Unicode Utilities have been modified to support both properties from the
released version of Unicode (via ICU) and from the new Unicode beta.
-To get the beta version of the property, insert β *after* the property name.
+To get the beta version of the property, insert `Uβ:` *before* the property name.
+The explicit version number for the β can be used;
+the resulting property is then only valid when that specific β is current.
Examples:
-| `\p{Word_Break=ALetter}` | Released version of Unicode |
-| `\p{Word_Breakβ=ALetter}` | Beta version of Unicode |
+| Query | Result |
+|---|---|
+| `\p{Word_Break=ALetter}` | Released version of Unicode. |
+| `\p{Uβ:Word_Break=ALetter}` | Beta version of Unicode; error outside of beta review. |
+| `\p{U16β:Word_Break=ALetter}` | Beta version of Unicode 16.0; error during the beta review of any other version. |
For example, to see additions to that property value in the beta version, use:
-[`\p{Word_Breakβ=ALetter}-\\p{Word_Break=ALetter}`](https://util.unicode.org/UnicodeJsps/list-unicodeset.jsp?a=%5Cp%7BWord_Break%CE%B2%3DALetter%7D-%5Cp%7BWord_Break%3DALetter%7D&g=&i=)
+[`\p{Uβ:Word_Break=ALetter}-\p{Word_Break=ALetter}`](https://util.unicode.org/UnicodeJsps/list-unicodeset.jsp?a=%5Cp%7BU%CE%B2%3AWord_Break%3DALetter%7D-%5Cp%7BWord_Break%3DALetter%7D&g=&i=)
## Caveats
-The support is not complete done, and there are some known problems.
-
-1. Some properties are not supported in beta versions. See
-
- for the list.
-2. When characters are listed, the new blocks and subheads don't show up.
-3. If you use a property that has a β version but no ICU version, you get no
- error: just an empty listing.
-4. The beta properties don't yet have the "shorthands" for cases like \\p{Lu}.
- So make sure the property is listed, eg \\p{gcβ=Lu}
- 1. Example:
- [`\p{gcβ=Lu}-\\p{gc=Lu}`](https://util.unicode.org/UnicodeJsps/list-unicodeset.jsp?a=%5Cp%7Bgc%CE%B2%3DLu%7D-%5Cp%7Bgc%3DLu%7D&g=&i=)
-5. Tools for segmentation, etc. use the release properties; there isn't a way
+The support is not completely done, and there are some known problems.
+
+1. The General_Category groupings such as \\p{Uβ:L} are not correctly implemented.
+ Only actual values, such as \\p{Uβ:Lu} etc., work.
+2. Tools for segmentation, etc. use the release properties; there isn't a way
to have them use the beta properties.
-6. There are probably others...
+3. There are probably others...
If you find a problem, please file a ticket at
-: make sure to start the summary with
-"Unicode Utilities: "
+https://github.com/unicode-org/unicodetools/issues.
[Back to Unicode Utilities Help Home](index)
\ No newline at end of file
diff --git a/unicodetools/src/main/java/org/unicode/text/UCD/VersionedProperty.java b/unicodetools/src/main/java/org/unicode/text/UCD/VersionedProperty.java
index 25164d073..1aedb2410 100644
--- a/unicodetools/src/main/java/org/unicode/text/UCD/VersionedProperty.java
+++ b/unicodetools/src/main/java/org/unicode/text/UCD/VersionedProperty.java
@@ -8,6 +8,7 @@
import java.util.Set;
import java.util.TreeMap;
import java.util.function.Supplier;
+import java.util.stream.Collectors;
import org.unicode.props.IndexUnicodeProperties;
import org.unicode.props.UnicodeProperty;
import org.unicode.props.UnicodeProperty.Factory;
@@ -51,6 +52,7 @@ public static VersionedProperty forJSPs(Supplier oldestLoadedUcd) {
result.throwOnUnknownProperty = false;
result.defaultVersion = Settings.lastVersion;
result.versionAliases.put("dev", Settings.latestVersion);
+ result.versionAliases.put(Settings.latestVersionPhase.toString(), Settings.latestVersion);
result.oldestLoadedUcd = oldestLoadedUcd;
for (String latest = Settings.latestVersion;
;
@@ -96,8 +98,15 @@ public VersionedProperty set(String xPropertyName) {
version = aliased;
} else {
version = names[0].substring(1);
- if (versionAliases.containsValue(version)) {
- throw new IllegalArgumentException("Invalid version " + version);
+ if (versionAliases.containsValue(
+ VersionInfo.getInstance(version).getVersionString(3, 3))) {
+ throw new IllegalArgumentException(
+ "Unreleased version "
+ + version
+ + "; use suffix: "
+ + versionAliases.keySet().stream()
+ .map(v -> "U" + v)
+ .collect(Collectors.joining(", ")));
}
}
xPropertyName = names[1];
diff --git a/unicodetools/src/main/java/org/unicode/text/utility/Settings.java b/unicodetools/src/main/java/org/unicode/text/utility/Settings.java
index 8729fbe06..d32ace265 100644
--- a/unicodetools/src/main/java/org/unicode/text/utility/Settings.java
+++ b/unicodetools/src/main/java/org/unicode/text/utility/Settings.java
@@ -41,7 +41,7 @@ public String toString() {
}
};
- public static final ReleasePhase latestVersionPhase = ReleasePhase.ALPHA;
+ public static final ReleasePhase latestVersionPhase = ReleasePhase.BETA;
public static final String lastVersion = "15.1.0"; // last released version
From ac73480d92d18cca3aae40610e2e4e3982080df9 Mon Sep 17 00:00:00 2001
From: Ned Holbrook
Date: Tue, 25 Jun 2024 12:42:14 -0700
Subject: [PATCH 04/31] Make emoji-ordering-rules.txt an internal data file
(#858)
---
.../dev/internal/emoji-ordering-rules.txt | 441 ++++++++++++++++++
.../unicode/tools/emoji/GenerateEmoji.java | 9 +-
2 files changed, 445 insertions(+), 5 deletions(-)
create mode 100644 unicodetools/data/emoji/dev/internal/emoji-ordering-rules.txt
diff --git a/unicodetools/data/emoji/dev/internal/emoji-ordering-rules.txt b/unicodetools/data/emoji/dev/internal/emoji-ordering-rules.txt
new file mode 100644
index 000000000..697ba5dd2
--- /dev/null
+++ b/unicodetools/data/emoji/dev/internal/emoji-ordering-rules.txt
@@ -0,0 +1,441 @@
+
+
+
+
\ No newline at end of file
diff --git a/unicodetools/src/main/java/org/unicode/tools/emoji/GenerateEmoji.java b/unicodetools/src/main/java/org/unicode/tools/emoji/GenerateEmoji.java
index c43e08bd7..3699aa909 100644
--- a/unicodetools/src/main/java/org/unicode/tools/emoji/GenerateEmoji.java
+++ b/unicodetools/src/main/java/org/unicode/tools/emoji/GenerateEmoji.java
@@ -1520,10 +1520,8 @@ private static void showOrdering(
+ "The categories are broad and not exclusive: and any character will match multiple categories.
"
+ "The emoji modifier sequences are omitted for brevity, "
+ "because they are simply ordered after their emoji modifier bases. "
- + "In the CLDR collation rules, the emoji modifiers cause a secondary difference. See also the machine-readable files: "
- + "emoji-ordering.txt"
- + " and "
- + "emoji-ordering-rules.txt. "
+ + "In the CLDR collation rules, the emoji modifiers cause a secondary difference. See also the machine-readable file "
+ + "emoji-ordering.txt. "
+ "To make suggestions for improvements, please file a "
+ getCldrTicket("collation", "Emoji ordering suggestions")
+ ".
\n",
@@ -3520,7 +3518,8 @@ static void printCollationOrder() throws IOException {
}
}
try (PrintWriter outText =
- FileUtilities.openUTF8Writer(Emoji.CHARTS_DIR, "emoji-ordering-rules.txt")) {
+ FileUtilities.openUTF8Writer(
+ GenerateEmojiData.getOutputDir(), "internal/emoji-ordering-rules.txt")) {
outText.append(
" see Cn errors
- /** U1 for UseSTD3ASCIIRules: Replaces V7 for disallowed_STD3_*. */
+ /** U1 for UseSTD3ASCIIRules: Replaces V7 for ASCII other than lowercase LDH. */
U1(0),
A3(UIDNA_ERROR_PUNYCODE),
@@ -689,6 +686,9 @@ private void checkLabelValidity(String label, IdnaChoice idnaChoice, Set
// or deviation.
switch (type) {
case valid:
+ if (disallowedSTD3.contains(cp)) {
+ errors.add(Errors.U1);
+ }
break;
case deviation:
if (idnaChoice == IdnaChoice.transitional) {
@@ -696,7 +696,7 @@ private void checkLabelValidity(String label, IdnaChoice idnaChoice, Set
}
break;
default:
- errors.add(disallowedSTD3.contains(cp) ? Errors.U1 : Errors.V7);
+ errors.add(Errors.V7);
}
}
}
diff --git a/unicodetools/src/test/java/org/unicode/propstest/TestInvariants.java b/unicodetools/src/test/java/org/unicode/propstest/TestInvariants.java
index db5b191e1..9548c6fc4 100644
--- a/unicodetools/src/test/java/org/unicode/propstest/TestInvariants.java
+++ b/unicodetools/src/test/java/org/unicode/propstest/TestInvariants.java
@@ -316,6 +316,26 @@ public void CheckProps(
boolean same = true;
for (String value : values) {
UnicodeSet oldSet = oldStatus.getSet(value);
+ if (ucdProperty == UcdProperty.Idn_Status && Settings.latestVersion.equals("16.0.0")) {
+ // Until Unicode 15.1, we had conditional Status values
+ // disallowed_STD3_valid and disallowed_STD3_mapped.
+ // At runtime, if UseSTD3ASCIIRules=true, they resolved to disallowed;
+ // if UseSTD3ASCIIRules=false, they resolved to valid or mapped, respectively.
+ // Unicode 16 replaces them with valid/mapped and handles UseSTD3ASCIIRules=true
+ // while checking the Validity Criteria.
+ switch (value) {
+ case "disallowed_STD3_valid":
+ case "disallowed_STD3_mapped":
+ continue;
+ case "valid":
+ case "mapped":
+ UnicodeSet disallowedSTD3 = oldStatus.getSet("disallowed_STD3_" + value);
+ oldSet.addAll(disallowedSTD3);
+ break;
+ default:
+ break;
+ }
+ }
UnicodeSet newSet = currentStatus.getSet(value);
same &= oldSet.equals(newSet);
if (!newSet.containsAll(oldSet)) {
diff --git a/unicodetools/src/test/java/org/unicode/unittest/TestIdnaTest.java b/unicodetools/src/test/java/org/unicode/unittest/TestIdnaTest.java
index 7027a6a71..d7e8ba448 100644
--- a/unicodetools/src/test/java/org/unicode/unittest/TestIdnaTest.java
+++ b/unicodetools/src/test/java/org/unicode/unittest/TestIdnaTest.java
@@ -105,6 +105,17 @@ public void testBackwardsCompatibility() {
}
{
Idn_Status_Values lastStatus = idnaStatusLast.get(x);
+ // Until Unicode 15.1, we had conditional Status values
+ // disallowed_STD3_valid and disallowed_STD3_mapped.
+ // At runtime, if UseSTD3ASCIIRules=true, they resolved to disallowed;
+ // if UseSTD3ASCIIRules=false, they resolved to valid or mapped, respectively.
+ // Unicode 16 replaces them with valid/mapped and handles UseSTD3ASCIIRules=true
+ // while checking the Validity Criteria.
+ if (lastStatus == Idn_Status_Values.disallowed_STD3_valid) {
+ lastStatus = Idn_Status_Values.valid;
+ } else if (lastStatus == Idn_Status_Values.disallowed_STD3_mapped) {
+ lastStatus = Idn_Status_Values.mapped;
+ }
Idn_Status_Values currentStatus = idnaStatus.get(x);
boolean skip = changingIn16.contains(c0);
if (!skip) {
From 5cc9f4998483ae557ae459eede7abc2d4d0c4ed4 Mon Sep 17 00:00:00 2001
From: Markus Scherer
Date: Tue, 6 Aug 2024 16:11:18 -0700
Subject: [PATCH 25/31] uni16 Index.txt Ken jul10
---
unicodetools/data/ucd/dev/Index.txt | 18 ++++++++++++++++++
1 file changed, 18 insertions(+)
diff --git a/unicodetools/data/ucd/dev/Index.txt b/unicodetools/data/ucd/dev/Index.txt
index 707a232e4..3ddd0548e 100644
--- a/unicodetools/data/ucd/dev/Index.txt
+++ b/unicodetools/data/ucd/dev/Index.txt
@@ -358,6 +358,7 @@ Arrowheads, Modifier Letter 02C2
Arrows 2190
Arrows, Dingbat 2794
Arrows, Double 21CD
+Arrows, Legacy Computing 1F8B3
Arrows, Long 27F5
Arrows, Mathematical 2B30
Arrows, Miscellaneous 2B00
@@ -1826,6 +1827,7 @@ Eastern Arabic-Indic Digits 06F0
Editorial Symbols, New Testament 2E00
egressive airflow 2191
Egyptian Hieroglyphs 13000
+Egyptian Hieroglyphs Extended-A 13460
Egyptian Hieroglyph Format Controls 13430
EIGHTH NOTE 266A
EIGHTH NOTES, BEAMED 266B
@@ -2077,6 +2079,7 @@ FILL SPACE, IDEOGRAPHIC HALF 303F
FILLER, HANGUL 3164
FILM FRAMES 1F39E
Finger Dingbats, Pointing Index 261A
+fingerprint 1FAC6
fingers crossed 1F91E
finite function 21FB
finite function diacritic 20E6
@@ -2222,6 +2225,7 @@ GAMMA, LATIN CAPITAL LETTER 0194
GAMMA, LATIN SMALL LETTER 0263
gamma, latin small letter baby 0264
GAMMA, MODIFIER LETTER SMALL 02E0
+Garay 10D40
gas station 26FD
GEAR 2699
GEMINI 264A
@@ -2388,6 +2392,7 @@ GURMUKHI EK ONKAR 0A74
Gurmukhi Independent Vowels 0A05
gurmukhi khanda 262C
GURMUKHI TIPPI 0A70
+Gurung Khema 16100
H WITH BREVE BELOW, LATIN SMALL LETTER 1E2B
H WITH CARON, LATIN SMALL LETTER 021F
H WITH CEDILLA, LATIN SMALL LETTER 1E29
@@ -2470,6 +2475,7 @@ Hanunoo 1720
Harakat, Arabic 064B
harbor symbol 2693
hardhat 1F477
+harp 1FA89
HARPOON ABOVE, COMBINING LEFT 20D0
HARPOON ABOVE, COMBINING RIGHT 20D1
HARPOON WITH BARB DOWNWARDS, COMBINING LEFTWARDS 20ED
@@ -2520,6 +2526,7 @@ HERMITIAN CONJUGATE MATRIX 22B9
Hexagram Symbols, Yijing / I Ching 4DC0
Hieroglyphs, Anatolian 14400
Hieroglyphs, Egyptian 13000
+Hieroglyphs, Egyptian Extended-A 13460
High Surrogates D800
HIGH VOLTAGE SIGN 26A1
HIGH-REVERSED-9 QUOTATION MARK, DOUBLE 201F
@@ -2910,6 +2917,7 @@ Keyboard Symbols 2324
Keyboard Symbols 2380
Keyboard Symbols 2396
KEYCAP, COMBINING ENCLOSING 20E3
+keyhole 1CEB1
KHANDA 1FAAF
khanda, gurmukhi 262C
khanda ta, bangla 09CE
@@ -2938,6 +2946,7 @@ Khutsuri, Georgian 10A0
Kievan Musical Symbols 1D1DE
killer, myanmar 1039
KIP SIGN 20AD
+Kirat Rai 16D40
kissen 2311
KOALA 1F428
kome, japanese 203B
@@ -3163,6 +3172,7 @@ LEFTWARDS ARROW OVERLAY, COMBINING 20EA
LEFTWARDS BULLET, BLACK 204C
LEFTWARDS HARPOON WITH BARB DOWNWARDS, COMBINING 20ED
Legacy Computing, Symbols for 1FB00
+Legacy Computing Supplement, Symbols for 1CC00
LENTICULAR BRACKET, LEFT BLACK 3010
LENTICULAR BRACKET, LEFT WHITE 3016
LENTICULAR BRACKET, RIGHT BLACK 3011
@@ -3599,6 +3609,8 @@ Myanmar 1000
Myanmar Consonants 1000
Myanmar Dependent Vowel Signs 102C
Myanmar Digits 1040
+Myanmar Digits (Pao) 116D0
+Myanmar Digits (Pwo Karen) 116DA
Myanmar Extended-A AA60
Myanmar Extended-B A9E0
Myanmar Independent Vowels 1021
@@ -3833,6 +3845,7 @@ OHM SIGN, INVERTED 2127
OI, LATIN SMALL LETTER 01A3
OK HAND SIGN 1F44C
Ol Chiki 1C50
+Ol Onal 1E5D0
Old Hungarian 10C80
Old Italic 10300
Old Permic 10350
@@ -5122,6 +5135,7 @@ SUN WITH RAYS, WHITE 263C
Sundanese 1B80
Sundanese Supplement 1CC0
sunna, telugu 0C02
+Sunuwar 11BC0
Superscript Digits 2070
Superscript Letter Diacritics, Latin Medieval 1DD3
Superscript Letter Diacritics, Medieval 0363
@@ -5266,6 +5280,8 @@ Symbols, Keyboard 2396
Symbols, Khmer 19E0
Symbols, Kievan Musical 1D1DE
Symbols, Latin-1 Punctuation and 00A0
+Symbols, Legacy Computing 1FB00
+Symbols, Legacy Computing Supplement 1CC00
Symbols, Letterlike 2100
Symbols, Lock 1F50F
Symbols, Mail 1F4E4
@@ -5586,6 +5602,7 @@ Tirhuta 11480
TIRONIAN SIGN CAPITAL ET 2E52
TIRONIAN SIGN ET 204A
TITLO LEFT HALF, COMBINING CYRILLIC FE2E
+Todhri 105C0
TODO SOFT HYPHEN, MONGOLIAN 1806
Tone Letters 02E5
Tone Letters, Modifier A700
@@ -5653,6 +5670,7 @@ TRUE 22A8
TSHEG BSTAR, TIBETAN MARK DELIMITER 0F0C
TSHEG, TIBETAN MARK INTERSYLLABIC 0F0B
TUGRIK SIGN 20AE
+Tulu-Tigalari 11380
TURBAN, MAN WITH 1F473
turbofan 274B
TURKEY 1F983
From dd0c36ae3566b8173a21179d1dfa4c7eae3e28b6 Mon Sep 17 00:00:00 2001
From: Markus Scherer
Date: Wed, 7 Aug 2024 11:51:28 -0700
Subject: [PATCH 26/31] Unihan 16 20240731
---
unicodetools/data/ucd/dev/USourceData.txt | 9 +-
unicodetools/data/ucd/dev/USourceGlyphs.pdf | Bin 2114646 -> 2110316 bytes
unicodetools/data/ucd/dev/USourceRSChart.pdf | Bin 2026487 -> 2053762 bytes
.../data/ucd/dev/Unihan/kDefinition.txt | 2 +-
unicodetools/data/ucd/dev/Unihan/kGB3.txt | 4 +-
.../data/ucd/dev/Unihan/kPhonetic.txt | 745 +++++++++++++++---
6 files changed, 659 insertions(+), 101 deletions(-)
diff --git a/unicodetools/data/ucd/dev/USourceData.txt b/unicodetools/data/ucd/dev/USourceData.txt
index 01513aadc..c431961b4 100644
--- a/unicodetools/data/ucd/dev/USourceData.txt
+++ b/unicodetools/data/ucd/dev/USourceData.txt
@@ -1,8 +1,10 @@
# USourceData-16.0.0.txt
-# Date: 2024-04-11, 00:00:00 GMT [KL]
+# Date: 2024-07-31, 00:00:00 GMT [KL]
#
# © 2024 Unicode®, Inc.
-# For terms of use, see http://www.unicode.org/terms_of_use.html
+# Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries.
+# For terms of use and license, see https://www.unicode.org/terms_of_use.html
+#
# For documentation, see http://www.unicode.org/reports/tr45/
#
# This file contains basic data for U-source ideographs
@@ -37,9 +39,6 @@
# Field 8: kTotalStrokes property value (see UAX #38)
# Field 9: First residual stroke
#
-# The full format for this file and information on parsing the source
-# field are available at .
-#
# Additions prior to Unicode 6.3.0: 952
UTC-00001;ExtE;U+2B88A;4.2;;;kCowles 4762;;5;4
UTC-00002;ExtB;U+221A1;5.13;;⿱乳年;kCowles 2892;;14;3
diff --git a/unicodetools/data/ucd/dev/USourceGlyphs.pdf b/unicodetools/data/ucd/dev/USourceGlyphs.pdf
index fb12c84e20b9b2934f1e42df3bdbb57afec54755..f9380c6ef705d0a6ab59a068dba4bde06f0154b2 100644
GIT binary patch
delta 39660
zcmb@sbC9IX*Dcz%rfp8!wr$(C&1&1K>1odNv~Alqrfu8q)9?HHzH?99_~OR><5a}T
z$jY5rxpVExe0HpS79)c|&kh1XQOT9WBqP{4Cx
zVpwQqCRRoTV&)VjNNj-ISPfhtF$&1Eq4Qki%|-oqV)}3SBdk#T-%==_xq0aikBL4|
zrK#HQ+cXwvs>OIw7$^l=vd;{)gF9s$q!!Ap{zggPT##+`-b#
zikO9i?TZx_mVasSOPsI)XGRD$6nCsnwtI#aG05W&wR0$lP-lZMF@-R#^gSFP>8
zFn+!om%`J6A07ZqrBYyI^ETYAdyo^`|Y$TT`GP54+5+t|BQzSZ5k!Gt4FIez`0tx^5xFiyH
zf)0*^97~oBxpE;hu?Xpt6^S+6K>C13J}J_{e@mid98x$=P`tcDq}v%w
z{I|;)FcSiIsUhI*7Ay~#j5v2vD?$M(znTOU;UA6sh=@MR|}C3-jqev$Z@-Jb99if2^!){HYYOhi|oSt`aic
z=h6?dgS>$(zJmMSwtIQ}t0*Fe(8uTKKb6)(ol-|%okIPCM_YSZrOjZ6Ga6I!luDsS
zuxBteZ^&ef;&LJPrKhC9xHnc?S)|~??Vqm?m6{9&{l9XIpQ*BL`?v+aii~*I0ItIb
z!41$40fyWFflqJWmNx;yPdFwJncsls{~_`zC@BB#8Ynatc9#DgY!=Rcg3bDGu;+hF
z*x)gvOBn9^hRnRDLG(-)dI62r&O|UNFbeP#t0@yZ{j1Pa!SoksHy8ZKNY;JXvIZiR
zi1Qejq+Hds&X0=IghMZoqP=gxY9kBtaFuoGqKgp<=X{`L#i)&9hT$r|l?3^UnZStC
zAtgnUk4lJNz?GobBhHd+V9U%%1Kf*+Wa*VcYH9057I5oD*Rdt03z1?rVlaR7Xt9A9
zjUp}@Pa;rikww6_E8S_rOo}_ZvaV0Qnx6s5xF(Hx*9i}RRky3AQJe|swueQ>4sTBl
zua<6gy!|3d)43WBL(T#GdwIb>Q`9AZoK{dX>zEut9~C
zS9cKfyr9542w*0irbyl~EFZt{m;y05zpzgVdB;fdhMBZuZ6T*NBd2y%sL&jmmrrnd
zcDIaA@EwJ&PYQjKN;?-l(tsnd|K(nxBO0q9E
z`t9pbZdSQg_#Xny%JJ`B{^vY~gJxmk_zEn?zi|ysVn*s^LJ+UoLHizm&J`b;Xk-D_
zSPDN4N`etO+I=p)QduzfYM5kzACU+WG%X||94u6#6eM!~ZP*5D3;kCK=r$Lj+bi$ZYBha)iV6em7pde$f3_r``)@qR^*jg2vA*$EpusA#)+U=8gU7XB
z$j7Xv?m?tQOB{q9xTK^Jsiq0;
0J`3k#D5
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
HRG0lfwmBmr
delta 43708
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