ΕΕΛ/ΛΑΚ - Λίστες Ταχυδρομείου

Re: Πρόγραμμα εντολών που να μετατρέπει αρχείο

Κάνω μια γενικότερη περίληψη για το θέμα με το τελικό σίγμα
και όλα τα βήματα που χρειάζεται για να επιλύσουμε το θέμα.

Στην ελληνική διάταξη στο X.Org (Linux) είχαμε πάντα το πρόβλημα, όταν
το CapsLock
ήταν πατημένο και πατούσαμε «ς», να παίρνουμε «ς» αντί το κεφαλαίο «Σ».
Μπορείτε να το δοκιμάσετε και να επιβεβαιώσετε τώρα·
1. Πατήστε CapsLock
2. Γράψτε ελληνικά, π.χ. ΣΔΛΚΦΞΕΟΡΙΞΓ
3. Πατήστε «ς» και λαμβάνετε «ς» αντί για Σ.

Η πηγή του προβλήματος είναι στον τρόπο που ο κώδικας του X.Org
αξιολογεί πότε ένας χαρακτήρας
είναι αλφαβητικός, ώστε για να το επιτρέπει να λειτουργεί το CapsLock.
Ως τώρα, το X.Org βλέπει τους χαρακτήρες στη διάταξη, π.χ. το γ και Γ
που είναι στο ίδιο πλήκτρο,
και δοκιμάζει τη μετατροπή κεφαλαίο προς πεζό για «Γ». Αν πράγματι
βγάλει «γ», τότε είναι αλφαβητικός χαρακτήρας
και έχει και σωστή αντιστοιχία πεζού-κεφαλαίου, οπότε ενεργοποιεί τη
λειτουργία CapsLock.

Το «Σ» παράγει «σ», οπότε το ς/Σ αγνοείται όταν έχουμε πατημένο το
CapsLock και παράγει μόνο «ς».

Η πηγή του προβλήματος είναι ότι θα ήταν καλύτερο να ελέγχαμε απλά αν
οι χαρακτήρες είναι απλά αλφαβητικοί αντί να επιβεβαιώνουμε ότι με
κάποιο τρόπο ότι η μετατροπή από πεζό σε κεφαλαίο (και ανάποδα).
Όπως είναι τώρα το X.Org δεν έχει ούτως ή άλλως τη δυνατότητα για
σωστή επιβεβαίωση για πεζά/κεφαλαία διότι δεν περιλαμβάνει στις
εξαρτήσεις κάποια βιβλιοθήκη Unicode.

Έτσι, αρκεί να γράψουμε μια συνάρτηση σε γλώσσα C που να μπορεί να
λέει αν ένας χαρακτήρας Χ είναι αλφαβητικός ή όχι.
Στο πρότυπο Unicode έχουμε μια σειρά από βασικούς χαρακτήρες με κωδικό
από 0-65535, και περιγράφονται στο αρχείο
http://unicode.org/Public/UNIDATA/UnicodeData.txt (είναι αρχείο CSV).
Όπως αναφέρθηκε παραπάνω στη συζήτηση, ένα από τα πεδία του CSV είναι
Ll/Lu (Letter Lower, Letter Upper), οπότε χρειάζεται ένα πρόγραμμα
εντολών που να κάνει «parsing» το CSV και να ελέγχει αν πρόκειται για
Ll ή Lu, και να παράγει ένα πίνακα της μορφής

static void
UCSIsAlphabetic( register unsigned codepoint)
{
    /* Check if character is alphabetic, as in Unicode Data version 5.1.0 */
    /* NB: Checks if character is either Ll or Lu (Letter lower/upper). */

    /* Currently using flat array where index corresponds to codepoint value. */
    /* Value is 1 if codepoint is alphabetic, 0 otherwise. */

    static unsigned char const UCSAlphabetic[] = {
      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    ...
      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
    };

    if ( UCSAlphabetic[codepoint] == 0 )
      return 0;
    else
      return 1;
}

Τη συνάρτηση αυτή την προσθέτουμε στο ίδιο αρχείο με
http://cgit.freedesktop.org/xorg/lib/libX11/tree/src/KeyBind.c#n294

Έχοντας τη συνάρτηση αυτή, τότε είμαστε σε θέση να τροποποιήσουμε τον
κώδικα στο
http://bugs.freedesktop.org/show_bug.cgi?id=22145#c11
ώστε να κοιτάει αν απλά οι χαρακτήρες sym[0], sym[1] (και sym[2],
sym[3]) είναι αλφαβητικοί.

Σίμος

2009/6/13 Simos Xenitellis <simos [ dot ] lists [ at ] googlemail [ dot ] com>:
> 2009/6/13 Savvas Radevic <vicedar [ at ] gmail [ dot ] com>:
>> Το UnicodeData.txt είναι και σωστά διαμορφωμένο, δείχνει το αντίστοιχο
>> κεφαλαίο γράμμα δίπλα από κάθε μικρό (και vice versa):
>>
>> 03A1;GREEK CAPITAL LETTER RHO;Lu;0;L;;;;;N;;;;03C1;
>> 03A3;GREEK CAPITAL LETTER SIGMA;Lu;0;L;;;;;N;;;;03C3;
>>
>> 03C1;GREEK SMALL LETTER RHO;Ll;0;L;;;;;N;;;03A1;;03A1
>> 03C2;GREEK SMALL LETTER FINAL SIGMA;Ll;0;L;;;;;N;;;03A3;;03A3
>> 03C3;GREEK SMALL LETTER SIGMA;Ll;0;L;;;;;N;;;03A3;;03A3
>>
>> Προσέξτε το "03A3;;03A3" στο "FINAL SIGMA" και "SIGMA".
>> Επίσης, τα κεφαλαία το έχουν το αντίστοιχο μικρό στην πρότελευταια τιμή, ενώ
>> τα μικρά έχουν το αντίστοιχο κεφαλαίο
>>
>> Σύμφωνα με αυτό που πρόσθεσε η Jennie ("Lu" και "Ll"), επισύναψα ένα
>> καινούργιο sh/perl script:
>>
>>  (Πρόσθεσα τα quotes "" στις τιμές για να φαίνεται η διαφορά)
>> Για κεφαλαία:
>>>
>>> perl -nle 'print if /^.*?;.*?;Lu;/' UnicodeData.txt | perl -pe
>>> 's/(.*?);(.*?);(.*?);.*;(.*?);$/"$1" "$3" "$4"/'
>>>
>>> "03A6" "Lu" "03C6" "GREEK CAPITAL LETTER PHI"
>>> "03A7" "Lu" "03C7" "GREEK CAPITAL LETTER CHI"
>>> "03A8" "Lu" "03C8" "GREEK CAPITAL LETTER PSI"
>>> "03A9" "Lu" "03C9" "GREEK CAPITAL LETTER OMEGA"
>>> "03AA" "Lu" "03CA" "GREEK CAPITAL LETTER IOTA WITH DIALYTIKA"
>>> "03AB" "Lu" "03CB" "GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA"
>>> "03CF" "Lu" "03D7" "GREEK CAPITAL KAI SYMBOL"
>>> "03D2" "Lu" "" "GREEK UPSILON WITH HOOK SYMBOL"
>>> "03D3" "Lu" "" "GREEK UPSILON WITH ACUTE AND HOOK SYMBOL"
>>> "03D4" "Lu" "" "GREEK UPSILON WITH DIAERESIS AND HOOK SYMBOL"
>>
>> Για μικρά:
>>>
>>> perl -nle 'print if /^.*?;.*?;Ll;/' UnicodeData.txt | perl -pe
>>> 's/(.*?);(.*?);(.*?);.*;(.*?)$/"$1" "$3" "$4" "$2"/'
>>>
>>> "03DF" "Ll" "03DE" "GREEK SMALL LETTER KOPPA"
>>> "03E1" "Ll" "03E0" "GREEK SMALL LETTER SAMPI"
>>> "03F0" "Ll" "039A" "GREEK KAPPA SYMBOL"
>>> "03F1" "Ll" "03A1" "GREEK RHO SYMBOL"
>>> "03F2" "Ll" "03F9" "GREEK LUNATE SIGMA SYMBOL"
>>> "03F3" "Ll" "" "GREEK LETTER YOT"
>>>
>>> [...]
>>> "1FE2" "Ll" "" "GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA"
>>> "1FE3" "Ll" "" "GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA"
>>> "1FE4" "Ll" "" "GREEK SMALL LETTER RHO WITH PSILI"
>>> "1FE5" "Ll" "1FEC" "GREEK SMALL LETTER RHO WITH DASIA"
>>
>> Τώρα μπορείτε εύκολα να βρείτε το αντίστοιχο κεφαλαίο/μικρό :)
>
> Νομίζω ότι έχουμε μια καλή εξέλιξη.
> Πράγματι, φαίνεται ότι τα LI, Lu, κτλ επιτρέπουν να βρίσκουμε τους
> αλφαβητικούς χαρακτήρες.
>
> Υπήρξε ένα ερώτημα προηγουμένως γιατί τα θέλουμε όλα αυτά.
> Ο λόγος είναι για να διορθώσουμε κάτι στο X.Org για τα ελληνικά (και
> μαζί με αυτό και για όλες τις άλλες γλώσσες).
> Η αναφορά σφάλματος που περιγράφει το ζήτημα είναι στο
> http://bugs.freedesktop.org/show_bug.cgi?id=22145
> όπως έχει αναφερθεί ήδη.
> Αυτό που είναι σημαντικό είναι ότι προσωπικά δε θα ασχοληθώ με το ζήτημα τούτο.
> Αυτό που μπορώ να κάνω είναι να καθοδηγήσω κάποιους που θα ήθελαν να βοηθήσουν,
> και νομίζω ότι το όλο έργο είναι σχετικά βατό.
>
> Για τα
>>> "03DF" "Ll" "03DE" "GREEK SMALL LETTER KOPPA"
>>> "03E1" "Ll" "03E0" "GREEK SMALL LETTER SAMPI"
>>> "03F0" "Ll" "039A" "GREEK KAPPA SYMBOL"
>>> "03F1" "Ll" "03A1" "GREEK RHO SYMBOL"
>>> "03F2" "Ll" "03F9" "GREEK LUNATE SIGMA SYMBOL"
>>> "03F3" "Ll" "" "GREEK LETTER YOT"
>
> Θέλουμε να παράγουμε πίνακα
>
> int myarray[] = {
>
>     0x03DF, 1,   // είναι αλφαβητικό
>     0x03E0, 0
>     0x03E1, 1,
>     0x03E2, 0,
>     0x03E3, 0,
>     0x03E4, 0,
>     0x03E5, 0,
> ...
>     0x03F0, 1,
>     0x03F1, 1,
>     0x03F2, 1,
>     0x03F3, 1
> };
>
> Σίμος
>