Index: third_party/sqlite/sqlite-src-3170000/ext/fts3/unicode/parseunicode.tcl |
diff --git a/third_party/sqlite/sqlite-src-3170000/ext/fts3/unicode/parseunicode.tcl b/third_party/sqlite/sqlite-src-3170000/ext/fts3/unicode/parseunicode.tcl |
new file mode 100644 |
index 0000000000000000000000000000000000000000..0cb2c83a18f76deaf8b75ebe9c5000544b7708e1 |
--- /dev/null |
+++ b/third_party/sqlite/sqlite-src-3170000/ext/fts3/unicode/parseunicode.tcl |
@@ -0,0 +1,146 @@ |
+ |
+#-------------------------------------------------------------------------- |
+# Parameter $zName must be a path to the file UnicodeData.txt. This command |
+# reads the file and returns a list of mappings required to remove all |
+# diacritical marks from a unicode string. Each mapping is itself a list |
+# consisting of two elements - the unicode codepoint and the single ASCII |
+# character that it should be replaced with, or an empty string if the |
+# codepoint should simply be removed from the input. Examples: |
+# |
+# { 224 a } (replace codepoint 224 to "a") |
+# { 769 "" } (remove codepoint 769 from input) |
+# |
+# Mappings are only returned for non-upper case codepoints. It is assumed |
+# that the input has already been folded to lower case. |
+# |
+proc rd_load_unicodedata_text {zName} { |
+ global tl_lookup_table |
+ |
+ set fd [open $zName] |
+ set lField { |
+ code |
+ character_name |
+ general_category |
+ canonical_combining_classes |
+ bidirectional_category |
+ character_decomposition_mapping |
+ decimal_digit_value |
+ digit_value |
+ numeric_value |
+ mirrored |
+ unicode_1_name |
+ iso10646_comment_field |
+ uppercase_mapping |
+ lowercase_mapping |
+ titlecase_mapping |
+ } |
+ set lRet [list] |
+ |
+ while { ![eof $fd] } { |
+ set line [gets $fd] |
+ if {$line == ""} continue |
+ |
+ set fields [split $line ";"] |
+ if {[llength $fields] != [llength $lField]} { error "parse error: $line" } |
+ foreach $lField $fields {} |
+ if { [llength $character_decomposition_mapping]!=2 |
+ || [string is xdigit [lindex $character_decomposition_mapping 0]]==0 |
+ } { |
+ continue |
+ } |
+ |
+ set iCode [expr "0x$code"] |
+ set iAscii [expr "0x[lindex $character_decomposition_mapping 0]"] |
+ set iDia [expr "0x[lindex $character_decomposition_mapping 1]"] |
+ |
+ if {[info exists tl_lookup_table($iCode)]} continue |
+ |
+ if { ($iAscii >= 97 && $iAscii <= 122) |
+ || ($iAscii >= 65 && $iAscii <= 90) |
+ } { |
+ lappend lRet [list $iCode [string tolower [format %c $iAscii]]] |
+ set dia($iDia) 1 |
+ } |
+ } |
+ |
+ foreach d [array names dia] { |
+ lappend lRet [list $d ""] |
+ } |
+ set lRet [lsort -integer -index 0 $lRet] |
+ |
+ close $fd |
+ set lRet |
+} |
+ |
+#------------------------------------------------------------------------- |
+# Parameter $zName must be a path to the file UnicodeData.txt. This command |
+# reads the file and returns a list of codepoints (integers). The list |
+# contains all codepoints in the UnicodeData.txt assigned to any "General |
+# Category" that is not a "Letter" or "Number". |
+# |
+proc an_load_unicodedata_text {zName} { |
+ set fd [open $zName] |
+ set lField { |
+ code |
+ character_name |
+ general_category |
+ canonical_combining_classes |
+ bidirectional_category |
+ character_decomposition_mapping |
+ decimal_digit_value |
+ digit_value |
+ numeric_value |
+ mirrored |
+ unicode_1_name |
+ iso10646_comment_field |
+ uppercase_mapping |
+ lowercase_mapping |
+ titlecase_mapping |
+ } |
+ set lRet [list] |
+ |
+ while { ![eof $fd] } { |
+ set line [gets $fd] |
+ if {$line == ""} continue |
+ |
+ set fields [split $line ";"] |
+ if {[llength $fields] != [llength $lField]} { error "parse error: $line" } |
+ foreach $lField $fields {} |
+ |
+ set iCode [expr "0x$code"] |
+ set bAlnum [expr { |
+ [lsearch {L N} [string range $general_category 0 0]] >= 0 |
+ || $general_category=="Co" |
+ }] |
+ |
+ if { !$bAlnum } { lappend lRet $iCode } |
+ } |
+ |
+ close $fd |
+ set lRet |
+} |
+ |
+proc tl_load_casefolding_txt {zName} { |
+ global tl_lookup_table |
+ |
+ set fd [open $zName] |
+ while { ![eof $fd] } { |
+ set line [gets $fd] |
+ if {[string range $line 0 0] == "#"} continue |
+ if {$line == ""} continue |
+ |
+ foreach x {a b c d} {unset -nocomplain $x} |
+ foreach {a b c d} [split $line ";"] {} |
+ |
+ set a2 [list] |
+ set c2 [list] |
+ foreach elem $a { lappend a2 [expr "0x[string trim $elem]"] } |
+ foreach elem $c { lappend c2 [expr "0x[string trim $elem]"] } |
+ set b [string trim $b] |
+ set d [string trim $d] |
+ |
+ if {$b=="C" || $b=="S"} { set tl_lookup_table($a2) $c2 } |
+ } |
+} |
+ |
+ |