wie kann man "writing direction" bei einer beliebigen Textzeile abfragen?

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • hns schrieb:

    Außerdem würde es mich nicht wundern, wenn es nur geht wenn ein (ggf. leerer) NSParagraphStyle definiert ist.
    NSParagraphStyle ändert an dem Quelltext nichts, so hilft es auch nicht.

    meine "sehr exotische" Lösung, die aber bis jetzt bei mir nur läuft, wäre die Folgende:

    0. man bereitet aus einer ursprünglichen Zeile eine Attributed-Zeile vor

    1. man kann einer beliebigen Attributed-Zeile eine "von-links-nach-rechts"-Richtung aufzwingen:

    [attributedString addAttribute:NSWritingDirectionAttributeName value:@[@(2)] range:NSMakeRange (0,[attributedString length])];

    somit ist für die Sache aber noch nicht viel gewonnen, weil die Grundzeile damit nicht geändert wird,
    wenngleich die Verkehrung sich wohl sehen lässt, falls die ursprüngliche Zeile "von-rechts-nach-links" geschrieben wurde

    (hingegen baseWritingDirection nicht mal eine sichtbare Änderung bewirkt -
    ich habe noch nicht entdecken können, wozu es gut sein soll...)

    2. man schickt nun die attributedString in eine PDF-Datei - dort geht die Änderung schon tief genug
    und mit [pdfDocument string] kann man dann die "verkehrte" Zeile herausholen und mit der ursprünglichen vergleichen:
    - sind die Zeilen gleich, so geht es um "von-links-nach-rechts"-Ordnung,
    - sind sie ungleich, so geht es um "von-rechts-nach-links"-Ordnung

    nur darf man dabei die arabischen Zahlen nicht nehmen - die gehen nämlich auch "von-links-nach-rechts" :)
    Gruss aus Russland :)

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von Valentin V. ()

  • Valentin V. schrieb:

    Leider konnte ich bis jetzt Deinen Erfolg nicht nachmachen -
    ich versuchte Deinen Code in meinen einzugliedern und bekam nur 0 in beiden Fällen...

    Somit bitte ich Dich sehr, Dein Beispiel um einpaar Zeilen zu ergänzen, dass es eine vollständige Einheit wird,
    die man dann als das Ganze ausprobieren könnte, und danke Dir im voraus für die Mühe.
    Mach' ich gerne, aber die Ergänzungen zu den Code-Zeilen oben sind m. E. wenig hilfreich. Beachte bitte, dass die Größenänderung für den Ausgabefont applikationsbedingt ist. Ausserdem nutze ich nur ein einzeiliges Eingabefeld mit Unterstützung eines einzelnen Fonts, der vom ersten Zeichen ermittelt wird:

    Quellcode

    1. NSDictionary *stringAttributes = [attributedString fontAttributesInRange:NSMakeRange(0, 1)];
    2. NSFont *stringFont = stringAttributes[NSFontAttributeName];
    3. CGFloat tenthMillimeterSize = stringFont.pointSize * 3.52778f;
    4. NSFont *drawFont = [NSFont fontWithDescriptor:stringFont.fontDescriptor size:tenthMillimeterSize];
    5. NSTextStorage *storage = [[NSTextStorage alloc] initWithString:attributedString.string attributes:@{NSFontAttributeName : drawFont}];
    6. NSLayoutManager *manager = [[NSLayoutManager alloc] init];
    7. [storage addLayoutManager:manager];
    8. NSTextContainer *container = [[NSTextContainer alloc] init];
    9. [manager addTextContainer:container];
    10. NSRange glyphRange = [manager glyphRangeForTextContainer:container];
    11. if (@available(macOS 10.13, *)) {
    12. unsigned char bidiLevels[glyphRange.length];
    13. CGGlyph glyphArray[glyphRange.length];
    14. NSUInteger glyphCount = [manager getGlyphsInRange:glyphRange glyphs:glyphArray properties:NULL characterIndexes:NULL bidiLevels:&bidiLevels[0]];
    15. for (int i = 0; i < glyphCount; i++)
    16. {
    17. NSLog(@"--- %i, \"%hhx\"", i, bidiLevels[i]);
    18. }
    19. }
    Alles anzeigen
    Mein Test sieht nun wie folgt aus:
    • In der Systemsteuerung füge ich als Eingabequelle Hebräisch hinzu.
    • In der App gebe ich Text mit der deutschen Eingabequelle ein (per Tastatur oder -übersicht): bidiLevel = 0 für alle eingegeben Zeichen.
    • Ich wechsle die Eingabequelle auf Hebräisch: bidiLevel = 1 für alle per Tastatur oder -übersicht eingegebenen Zeichen.
    • Auch ein Kopieren / Einfügen entsprechender Eingaben über die Zwischenablage (oder Speichern in NSUserDefaults) hat den gleichen Effekt, der bidiLevel ist also mit dem Unicode-Zeichen verknüpft.
    • Die Font-Auswahl für das Eingabefeld spielt keine Rolle (ausser dass manche Fonts wie z. B. Wingdings keine Glyphen für hebräische Unicode-Character haben)
    Hier als Beispiel die Ausgabe der Debug-Konsole, wenn ich ein a zuerst mit deutscher, dann mit hebräischer Eingabequelle eingebe:

    Quellcode

    1. 2022-01-01 10:36:42.329320+0100 myApp[34027:1406578] Text: aש
    2. 2022-01-01 10:36:42.329662+0100 myApp[34027:1406578] --- 0, "0"
    3. 2022-01-01 10:36:42.329723+0100 myApp[34027:1406578] --- 1, "1"
    HTH, Mattes
    Diese Seite bleibt aus technischen Gründen unbedruckt.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von MyMattes () aus folgendem Grund: Codezeile bei cleansing aus Versehen gelöscht.