Groß-/Kleinschreibung eines Wortes per Makro ändern

Programmierung unter AOO/LO (StarBasic, Python, Java, ...)

Moderator: Moderatoren

suavito
***
Beiträge: 54
Registriert: So, 19.12.2004 13:12

Groß-/Kleinschreibung eines Wortes per Makro ändern

Beitrag von suavito »

Ich suche ein Makro, um die Groß-/Kleinschreibung eines Wortes zu ändern.

Hintergrund: Ein äußerst häufiger Tippfehler ist es, am Anfang eines Wortes die Shift-Taste nicht lange genug ("huhn") oder zu lange ("HUhn") gedrückt zu halten. Aus beiden Fehlervarianten soll ein korrektes "Huhn" gemacht werden.

In einer *anderen Textverarbeitung, die ich aus guten Gründen nicht mehr nutzen will* habe ich mir eine Standardfunktion auf eine der F-Tasten gelegt, auf die ich mittlerweile blind hauen kann, wenn ich feststelle, daß vorn im Wort ein Fehler ist. Weil ich schnell schreibe, erleichtert es die Fehlerkorrektur sehr, nicht erst mit Shift + Pfeil nach links an den Anfang des Wortes hüpfen zu müssen, um dort einen oder zwei Buchstaben zu löschen und einen oder zwei Buchstaben wieder einzufügen und schließlich wieder zurückzuspringen.

Wer weiß, wie es geht bzw. wo es dazu schon ein Makro gibt?

ACHTUNG: Ich weiß, wie es NICHT geht, nämlich mit lower case und title case (und none)!

Diese Schrifteffekte sind eben genau das: Effekte, keine Veränderung an der Schreibung des Wortes. Man kann sie sehen, so wie man Fett oder Kursiv sieht, aber das ist nur Make-up.

Beispiel:

"huhn" - ist das lower case?
"Huhn" - ist das title case?

Antwort: "huhn" kann sowohl lower case als auch none sein: Wenn man "Huhn" oder "HUhn" (oder noch eine andere Variante) getippt und danach lower case angewendet hat, sieht man "huhn". Aber wenn man einfach so "huhn" tippt, dann sieht es natürlich genau so aus.

Ebenso "Huhn": "huhn" tippen und title case anwenden könnte es sein, ebenso aber auch ein gleich korrekt mit Shift getipptes "Huhn".

Ist doch egal? Nein, ist es nicht.

1. führt "Huhn", wenn es per title case zum "Huhn" verkleidet wird, zum Knurren der Rechtschreibkontrolle (Verbesserungsvorschlag: "Küken"). Denn intern haben wir es ja immer noch mit einem "huhn" zu tun.

2. klappt deswegen ein Makro nicht. Die Struktur "WENN lower case DANN title case SONST umgekehrt" klappt nicht. Auch nicht, wenn man den Zustand none miteinbezieht. Weil das Makro nicht weiß, was man haben will: Jeder erste Zustand ist immer erst mal none, unabhängig davon, wieviele Großbuchstaben sich in einem Wort befinden!

Es geht nicht ohne ein echtes Durchsuchen und anschließendes Ändern des Wortes:

WENN erster Buchstabe (vom Wort, das links vom sichtbaren Cursor beginnt) groß DANN
WENN sonst noch einer groß
DANN bleibt der erste groß UND alle andere klein
SONST alle Buchstaben klein
SONST erster Buchstabe groß UND alle anderen klein

Wenn also "HUhn" da steht, wird es erst mal zu "Huhn", aus "Huhn" würde "huhn" und aus "huhn" "Huhn."

Gacker.

Anders formuliert: Gibt es eine String-Methode, um abzufragen, ob ein Buchstabe ein Groß- oder Kleinbuchtstabe ist? Und man braucht noch eine Anweisung, die den textCursor = viewCursor setzt und mit der man ein Objekt o. a. erhält, auf das die String-Methode auch anwendbar ist.

(Apropos "textCursor": Binnenmajuskeln würden von meinem Makro rigoros plattgemacht. Das ist für mich akzeptabel, diese seltenen Sonderfälle muß man dann eben vorn per Hand nachbearbeiten. Denkbar wäre aber auch, wirklich nur die ersten beiden Zeichen abzufragen - weil Fehler wie "HUHn" dann doch praktisch nie vorkommen, SO langsam ist man ja dann doch nicht - und alle anderen unverändert zu lassen.)
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Beitrag von Stephan »

Folgendes Makro macht, für das Wort in dem der sichtbare Cursor steht:
-den ersten Buchstaben groß wenn er klein ist und umgekehrt (das Makro prüft jedoch nicht ob das sinnvoll ist)
-den zweiten Buchstaben immer klein
-setzt den Cursor ans Ende des Wortes zum sofortigen Weiterschreiben

Code: Alles auswählen

Sub Main
oText = ThisComponent.text
vCursor = ThisComponent.CurrentController.getviewCursor()
Cursor = oText.createTextCursorByRange(vCursor)
Cursor.gotoStartOfWord(false)
Cursor.gotoEndOfWord(true)
eins = Mid(Cursor.String,1,1)
zwei = LCase(Mid(Cursor.String,2,1))
If eins <> LCase(eins) Then
		eins = LCase(eins)
	Else
		eins = UCase(eins)
End If
Cursor.string = _
eins & zwei & Right(Cursor.String, LEN(Cursor.String)-2)
End Sub

Gruß
Stephan
suavito
***
Beiträge: 54
Registriert: So, 19.12.2004 13:12

Beitrag von suavito »

Und wieder einmal DANKE an Dich!

Ich möchte vorschlagen, daß Dein Nick in THE MAN geändert wird.
Antworten