Samstag, 10. März 2018

Pathologischer Narzißmus - Karikatur menschlicher Größe

In meinen Betrachtungen über menschliche Größe habe ich auch die scheiternde und vermeintliche Größe behandelt. Das Thema verlangt jedoch wegen seiner Wichtigkeit eine gesonderte Behandlung. Besonders eine Form dieses Scheiterns, der krankhafte Narzißmus gefährdet einzelne ebenso wie unsere ganze Gesellschaft, die sich sowieso großflächig dem Narzißmus verschrieben hat.

Der Fall David Wood
Symptome der narzißtischen Persönlichkeitsstörung
Die politische Bedeutung
Die theologische Bedeutung
Vertrauen und Autorität

Der Fall David Wood

Ich will die Beschreibung dieses Phänomens mit der bewegenden Geschichte des heute 42jährigen Amerikaners David Wood einleiten, weil sie besonders eindrücklich einige typische Züge des krankhaften Narzißmus aufzeigt.

David Wood hatte von Kind auf bemerkt, daß er anders war als seine Mitschüler: Schwierigkeiten oder Leiden von anderen ließen ihn vollständig unbeeindruckt – es fehlte also das, was die Psychologen heute "Empathie" nennen. Diese gesunde Einfühlungsgabe, die die meisten Menschen von Natur aus ins Leben mitbringen, ist eine Voraussetzung für ein nicht nur gedanklich-abstrakt, sondern unmittelbar gefühlsmäßig von der Reziprozität geleitetes menschliches Handeln im Sinne der Goldenen Regel ("Behandle andere so, wie du es von ihnen erwartest, daß sie dich behandeln").

David Wood bemerkte also schon als Schüler, daß ihm diese Gabe der Empathie fehlte. Sie war in seiner seelischen Ausstattung einfach nicht vorhanden. Wo andere beispielsweise Mitgefühl empfanden, war bei ihm ein leerer Fleck.[1] Er sah sich aber nicht als defizitär - und das ist ebenfalls typisch für pathologischen Narzißmus - sondern sah diesen Mangel als Beweis seiner eigenen Überlegenheit. Er gehörte gewissermaßen einem höheren Menschentypus an, er fühlte sich als Übermensch, der nicht durch irgendwelche Sentimentalitäten in seinem Handeln gebremst wird, sondern der endlich - ungehindert von allen "falschen" Rücksichten - frei und souverän handeln kann. Wie er berichtet, festigte sich diese Ansicht bei ihm zur Gewißheit, als im Schulunterricht die Evolutionstheorie besprochen wurde: er sah sich als eine der wenigen Mutationen der Art homo sapiens, dessen Verhalten nicht mehr - wie das der Tiere und seiner Mitmenschen - durch irgendwelche emotionalen Kopplungen behindert wird, sondern der eine neue Stufe wirklicher, echter Freiheit erklommen hat. So fühlte er sich als eine evolutionäre Morgengabe einer neuen, zukünftigen Form des Menschseins. Wie er schreibt, haßte er die Gesellschaft, weil sie ihm lächerliche, seines höheren Menschseins unwürdige Regeln aufzwingen wollte. Gut und Böse waren für ihn nur gesellschaftliche Konstrukte, Konventionen von und für Sklavenmenschen.[2]

Sie werden das als Leser möglicherweise - und zu Recht - absurd finden. Er selbst sah sich in seinem Bewußtsein so, aber es muß offenbar auch in seiner Seele das Korrektiv rumort haben, das ihn aus dieser krankhaften Selbsteinschätzung zurückholen wollte. Solche Stimmen störten sein Selbstbild, er dürfte sie als atavistische Anfechtungen betrachtet haben, die ihn wieder zurück auf die normalmenschliche, für ihn also die quasi-tierische Ebene ziehen wollten.

Um diese zweifelnden Stimmen in seiner Seele endgültig zum Schweigen zu bringen, plante der damals Achtzehnjährige eine Handlung, die möglichst barbarisch sein sollte und gegen die alle menschlichen Affekte sich instinktiv auflehnen: er wollte seinen eigenen Vater umbringen, und dies auf eine möglichst brutale Weise - mit einem Hammer.

Das führte er dann entsetzlicherweise auch aus. Sein Vater - der ihm später sogar verziehen hat - überlebte die grausame Tat wie durch ein Wunder, und David Wood kam zuerst in ein Spital, wurde dann aber zu einer zehnjährigen Haftstrafe verurteilt. Im Gefängnis bekehrte er sich nach vielen langen Diskussionen mit einem Mithäftling zum Christentum. Sein christlicher Glaube ermöglicht es ihm heute, ein anständiges Leben zu führen - er ist glücklicher Familienvater und hat vier Kinder.

Wie ich seinen Lebensbericht verstehe, betrachtet er sich heute aber keineswegs als geheilt. Der blinde Fleck ist weiterhin vorhanden, aber er sieht ein, daß es sich um ein psychologisches Defizit, eine Krankheit handelt, und er hat gelernt, damit zu leben, und das, was ihm auf emotionaler Ebene fehlt, durch bewußte, rationale Überlegung auszugleichen und unter Kontrolle zu halten.

Symptome der narzißtischen Persönlichkeitsstörung

Die Lebensgeschichte von David Wood zeigt einige typische Züge der narzißtischen Persönlichkeitsstörung, zu deren Kernzügen immer ein ausgeprägtes Überlegenheitsgefühl gehört. Im Unterschied zu einem wirklich großen Menschen, der sich selbst allenfalls als Werkzeug für seine Sendung wichtig nimmt, verfällt der krankhafte Narzißt einem Kult um die eigene Größe und die eigene Person. Er ahmt also das äußere Erscheinungsbild des wirklich großen Menschen nach, ohne jedoch eine Golddeckung aufzuweisen, ohne Substanz, die dieses Gebaren rechtfertigen oder zumindest entschuldigen würde. Dennoch gelingt es ihm zu blenden und zu beeindrucken.

Stolz, Hochmut und Überlegenheitsgefühl sind die Hauptgefühle in seiner Palette der Emotionen – Empathie, Mitgefühl, Liebe dagegen fehlen vollständig. Andere Menschen werden nur als Werkzeug gesehen. Laut Sam Vaknin, einem israelischen Autor, dem die narzißtische Persönlichkeitsstörung (NPS) diagnostiziert wurde und der ihre Symptomatik daher von sich selbst gut kennt, kann ein Narzißt niemals echte Freunde haben, denn das Konzept der Freundschaft ist ihm fremd. Er wird den "Freund" immer nur als Werkzeug, als Mittel für die Durchsetzung der eigenen Zwecke sehen, letztlich dient er wie alle anderen Menschen nur seinem eigenen Amüsement. Er umschmeichelt und idealisiert ihn in der Anwerbungsphase, um ihn dann auszubeuten und, wenn er ihn nicht mehr braucht, genüßlich zu demontieren, zu desavouieren und zu vernichten.

Von Sam Vaknin kommt auch folgendes kurzes Porträt: der maligne Narzißt

verhält sich arrogant und hochmütig. Fühlt sich überlegen, allwissend, allmächtig, unbesiegbar, über dem Gesetz stehend und allgegenwärtig (magisches Denken). Zornausbrüche bei Frustration, Widerspruch oder bei Konfrontation mit Menschen, die er als ihm unterlegen oder minderwertig betrachtet.
Die narzißtische Persönlichkeitsstörung ist in der Psychologie wohlbekannt, und das Standardwerk The Diagnostic and Statistical Manual of Mental Disorders der American Psychiatric Association nennt folgende acht Merkmale der narzißtischen Persönlichkeitsstörung:
301.81 Narzißtische Persönlichkeitsstörung (englisch narcissistic personality disorder, Abk. NPD): ein verbreitetes Syndrom, zu dem die eigene Größe (in der eigenen Vorstellung und im Verhalten), das Verlangen nach Bewunderung und ein Mangel an Empathie gehören. Die NPD beginnt im frühen Erwachsenenalter und ist durch mindestens fünf der folgenden Kriterien nachweisbar. Der Narzißt
  1. hat ein übersteigertes Bewußtsein von der eigenen Wichtigkeit (übertreibt seine Leistungen und Begabungen oder erwartet, daß er auch ohne angemessene eigene Leistungen als überlegen anerkannt wird);
  2. phantasiert von grenzenlosem Erfolg, Macht, Brillianz, Schönheit oder idealer Liebe;
  3. glaubt, daß er etwas ganz Besonderes und Einzigartiges ist, und daß er darin nur von ausgewählten Menschen oder Institutionen gewürdigt werden kann;
  4. erwartet grenzenlose Bewunderung,
  5. hält sich für privilegiert und nimmt Sonderrechte für seine Person in Anspruch, erwartet eine ihn begünstigende Sonderbehandlung und besondere Berücksichtigung seiner Bedürfnisse;
  6. gebraucht andere Menschen zu seinen eigenen Zwecken (“interpersonally exploitative”, beutet andere Menschen aus);
  7. hat keine Empathie: er ist nicht bereit, Bedürfnisse und Gefühle anderer Menschen anzuerkennen, zu respektieren oder sich in sie hineinzuversetzen
  8. verhält sich arrogant und hochmütig.
Der Theologe Douglas McManaman bringt das Wesen dieser Krankheit auf den Kernpunkt [3]:
Was den Narzißten charakterisiert ist die Unfähigkeit, jemanden zu lieben.
So wie es eine gesunde und eine pathologische Selbstliebe gibt, so unterscheidet der Psychoanalytiker Erich Fromm auch gutartigen und bösartigen Narzißmus. Zusammen mit der Liebe zum Toten (Nekrophilie, im Gegensatz zur Liebe zum Leben) und der “symbiotischen Fixierung auf die Mutter” bildet der bösartige Narzißmus laut Fromm ein Syndrom, das er Verfallssyndrom nennt und als “Quintessenz des Bösen” bezeichnet: “es ist gleichzeitig der schwerste pathologische Befund und die Wurzel der bösartigsten Destruktivität und Unmenschlichkeit.” [4]

Die politische Bedeutung

Nun könnte man sich fragen: es gibt eine Menge Persönlichkeitsstörungen - auch solche mit schädlichen Wirkungen auf andere Menschen - was ist ausgerechnet am pathologischen Narzißmus so bedeutsam?

Eine Antwort liegt darin, daß pathologische Narzißten, wenn sie im Ausleben ihrer Krankheit eine gewisse Schläue und Zielstrebigkeit haben, einen enormen gesellschaftlichen Schaden anrichten können, denn ihre Krankheit begünstigt sie beim Vorwärtskommen in Hierarchien. Die Konsequenz daraus - und die Begründung - wird als Obertsches Gesetz bezeichnet (nach dem deutschen Physiker und Raumfahrtforscher Hermann Oberth) [5]:

Im Leben stehen einem anständigen Charakter so und so viele Wege offen, um vorwärtszukommen. Einem Schuft stehen bei gleicher Intelligenz und Tatkraft auf dem gleichen Platz diese Wege auch alle offen, daneben aber auch noch andere, die ein anständiger Kerl nicht geht. Er (der Unanständige) hat daher mehr Chancen, vorwärtszukommen, und infolge dieser negativen charakterlichen Auslese findet eine Anreicherung der höheren Gesellschaftsschichten mit Schurken statt. Das ethische Durchschnittsniveau einer Gesellschaftsschicht wird umso schlechter, je besser und einflußreicher sie gestellt ist.

Nur dieser Umstand vermag die Tatsache zu erklären, warum die Welt nicht schon seit mindestens fünftausend Jahren ein Paradies ist.

Die Beobachtung selbst ist von bestechender Logik: es kann gar nicht anders sein, pathologische Narzißten haben gerade wegen ihrer mangelnden Empathie einen Vorteil beim Aufstieg in der sozialen Hierarchie.

Oberths abschließendes Fazit (daß "nur deshalb die Welt kein Paradies sei") muß man deswegen nicht teilen, es ist viel zu utopisch vom Menschen gedacht. Die Welt wäre auch dann kein Paradies, wenn es gar keine pathologischen Narzißten gäbe. Sie sind aber auf jeden Fall ein breites Einfallstor für Unheil, sagen wir es klarer, für das Böse in die Gesellschaft. Auf dieser Beobachtung gründet der polnische Psychologe Andrzej Lobaczewski seine Politische Ponerologie, die "Wissenschaft vom makrosozialen Bösen".

Daß, wie es das Oberthsche Gesetz nahelegt, der pathologische Narzißmus in den Führungsschichten der Gesellschaft stärker repräsentiert ist, mag man bedauern, es ist aber unvermeidlich. Die Konsequenz des Oberthschen Gesetzes ist unausweichlich, jedenfalls solange man überhaupt zugesteht, daß eine Gesellschaft einer politischen Elite bedarf, um zu bestehen. Umso wichtiger wird es, in der Gesellschaftsordnung Mechanismen zu haben, um sich schädlicher Führungspersonen rasch zu entledigen und überhaupt ihren Einfluß auf irgendeine Art zu regulieren oder zu kontrollieren. In einer säkularen, demokratisch organisierten Gesellschaft wären solche Mechanismen etwa die Gewaltentrennung, kurze Amtszeiten für Abgeordnete, Personenwahl vor Parteienwahl, überhaupt Mechanismen zur Begrenzung des Parteieneinflusses, plebiszitäre Elemente wie Volksentscheide, sowie Subsidiarität; dies alles hatte ich in meinem Blog über direkte Demokratie näher ausgeführt.

Leider gewinnen selbst bei bester Anlage im demokratischen Staat die Kräfte langfristig die Oberhand, die sich hinter den Fassaden einnisten, dort ihre Seilschaften bilden und durch die personellen Verflechtungen Kontrollmechanismen wie Gewaltentrennung schließlich unwirksam machen. In Deutschland ist dies schon lange der Fall, vor allem wegen der übermäßigen Macht, die die Bundesrepublik den politischen Parteien zugesteht. Einer, der dies seit Jahren unerbittlich beobachtet und anprangert, ist der deutsche Verfassungsrechtler Hans Herbert von Arnim. Es scheint, daß die Demokratie nicht die Mittel hat, um diese Art von Kontrollmechanismen aus sich heraus dauerhaft zu erhalten, sie erodieren jedenfalls zusehends.

Außerdem ist zu bedenken, daß eine Demokratie auf die Dauer den Narzißmus in der ganzen Breite der Gesellschaft begünstigt. Zum Wesen des demokratischen Prinzips gehört – aufgrund der gleichen Machtverteilung durch die Wahlstimme auf alle Bürger – ein Gleichheitsgedanke, der Dinge wie Unterordnung, Gehorsam, Opfer, Verantwortung immer mehr zu einer Zumutung, einer Anmaßung, zu etwas Unerträglichem macht. Das fördert insgesamt den Narzißmus in gewaltigem Ausmaß, denn die Haltung, sich selbst ganz großartig zu finden, den individuellen Lebensgenuß als den Sinn des Lebens an sich zu definieren ("ein selbstbestimmtes Leben zu führen") und jede Art von Opfern oder Beiträgen an die Gemeinschaft als Zumutung von sich zu weisen, entspricht am besten dem Geist der Demokratie, wird am wenigsten ausgebremst und setzt sich daher auf lange Sicht durch. Nun ist nicht jeder Narzißmus ein pathologischer, aber wenn der Narzißmus insgesamt zu einem Breitenphänomen wird, steigt natürlich auch die Zahl der pathologischen Narzißten. Man kann also die politische Problematik des Narzißmus nicht auf die Eliten begrenzen. Der pathologische Narzißmus nimmt nicht nur in den Eliten, sondern in der Gesamtheit des Volkes zu, auch wenn natürlich zugestanden werden muß, daß Narzißten in gesellschaftlichen Führungspositionen ein viel höheres Schadenspotential haben.

Die theologische Bedeutung

Wenn selbst ein Marxist wie Erich Fromm den pathologischen Narzißmus als "Quintessenz des Bösen" bezeichnet und Lobaczewski auf ihm die Wissenschaft vom "makrosozialen Bösen" begründet (eben seine politische Ponerologie), so liegt es nahe, dieses Phänomen in einen theologischen und moralischen Kontext zu stellen. Das hilft einerseits, das Phänomen in seiner Tiefe zu verstehen, andererseits kann es auch Auswege weisen.

Genau dies tut der schon erwähnte Theologe Douglas McManaman in seinem Essay Narcissism and the Dynamics of Evil.

McManaman leitet in das Thema mit einer grundsätzlichen Betrachtung über Gut und Böse ein. Er stellt klar, daß Gutsein etwas mit Sein zu tun hat: es ist das Sein selbst, das gut, d.h. im Sinne des Ziels, auf das es hin geschaffen ist, Wirklichkeit wird: “gut” ist die Vollkommenheit des Seins. Böse hingegen ist ein Mangel an Gutem, eine Unvollkommenheit, ein fehlendes Gut-Sein, ein Defekt, eine privatio boni. Das moralisch Böse setzt aber die Erkenntnisfähigkeit voraus, ein Tier kann nicht böse sein. Es muß darin aber eine bewußte Abkehr vom Guten liegen, im Sinne einer Abkehr vom Auf-Etwas-Hingeordnetsein der Dinge kann man das Böse ungeordneten Willen nennen.

Der gute Wille als Wille zum Guten ist dagegen Wohlwollen (benevolentia): gespeist von Liebe. Der von benevolentia erfüllte Mensch will das Gute des anderen, aber auch das eigene Gute. Nach einer Definition von Ulpian ist Gerechtigkeit das stete Bemühen, jedem sein Recht zukommen zu lassen (iustitia est constans et perpetua voluntas ius suum cuique tribuendi). [6] Eine unrechte Handlung dagegen verweigert dem anderen sein Recht auf irgendein Gut, sei es auf Wahrheit, auf sein Eigentum, sein Leben usw.

Wenn man es noch etwas genauer betrachtet, schmarotzt das Böse - wie in diesen Fällen - grundsätzlich von einem anderen Guten. “Nichts kann böse sein, außer etwas, das gut ist” (Augustinus).

Der Mensch erschafft sich zwar nicht selbst, wie modische Denkströmungen und zeitgeistige Philosophien es uns einflüstern, sondern ist ein Geschöpf Gottes. Dank seiner Willensfreiheit und seiner Fähigkeit der Erkenntnis des Guten und Bösen erbaut er aber durch seine Willensentschlüsse seine moralischen Persona, wie ich es nennen würde (McManaman spricht von “Charakter”). Genauer gesagt, beraubt er sich selbst seiner Seins-Substanz, je mehr er sich entschließt, böse zu handeln, z.B. andere Menschen nicht wie sich selbst zu behandeln, sondern als Mittel für eigene Zwecke zu verwenden. Mit dem Schwinden der Seins-Substanz schwindet aber auch die Selbstachtung, es kommt zum Selbsthaß.

Paradoxerweise geht der Selbsthaß mit dem Egoismus einher, einer verzerrten Form der Selbstliebe, gekennzeichnet durch Mißachtung der Goldenen Regel. Der Egoist sieht sich vor anderen Menschen als bevorrechtet an. Er hat also nicht etwa durch Verdienst oder eine besondere schicksalsgegebene Aufgabe ein Vorrecht, sondern weil er selbst so ein großartiger, überlegener Mensch ist (falls er sich überhaupt die Mühe macht, diesen eigenen Anspruch auf Sonderbehandlung und Sonderrechte zu begründen). Er selbst steht im Mittelpunkt, andere Menschen an der Peripherie und sind allein dadurch von Interesse, als sie seinen eigenen Interessen dienen können.

Der Egoist, der ein Stück seiner eigenen Existenz dafür preisgeben muß, daß er anderen ihre Rechte verweigert, wird dumpf dieses Stück Nichts, dieses Loch in seiner eigenen Seele bemerken. Um diese Wahrnehmung zu verdrängen, sucht er Bestätigung, Verehrung, Gehorsam - und genießt es, wenn andere ihn fürchten. Er weiß es auch zu verbergen, daß andere Menschen für ihn nur Mittel zum Zweck sind. Je intelligenter er ist, umso mehr kann er dem Mitmenschen den Eindruck vermitteln, er liebe ihn um seiner selbst willen.

Beim Lesen der Ausführungen McManamans muß ich unweigerlich an “Das Bildnis des Dorian Gray” denken. Es wird in poetischer Weise genau das Verhaltensmuster des Narzißten beschrieben - auf dem Dachboden verwahrt ist das wahre Bild seiner häßlichen Seele, die mit jeder seiner Taten häßlicher wird, während Dorian Gray selbst sich vor den anderen seine blühende jugendliche Schönheit bewahrt. Das ist vielleicht nicht nur als erbauliches, moralisches Märchen gemeint, sondern enthüllt die Tragik einer narzißtisch-soziopathischen Persönlichkeit.

In gewisser Weise repräsentiert diese Sorte Menschen das genaue Gegenteil des großen Menschen, den ich in meinem letzten Blog zu charakterisieren versuchte: sie versuchen gerade nicht, die ideale Form auszufüllen, auf die hin sie geschaffen sind, sondern sie weisen diese Form von sich und erbauen eine hohle Gegenform.

Um es noch mehr auf den Punkt zu bringen, könnte man sagen: der Narzißt pervertiert das christliche Hauptgebot der Liebe (Lk 10,27)

Du sollst den Herrn, deinen Gott lieben, aus deinem ganzem Herzen, aus deiner ganzen Seele, aus deiner ganzen Kraft und aus deinem ganzen Denken, und deinen Nächsten wie dich selbst.
in das größtmögliche Gegenteil: an die Stelle der Gottesliebe tritt die Ich-Vergottung, und alle Mit- und Nebenmenschen werden im Lichte der eigenen glanzvollen Persönlichkeit zu minderwertigen Menschen. Eine stärkere Antithese zum christlichen Hauptgebot der Liebe ist nicht vorstellbar.

Natürlich stellt der pathologische Narzißt für die Gesellschaft ein ungeheures Schadenspotential dar – man stelle sich nur vor: in einer Führungsposition kann er einen Angriffskrieg befehlen oder gewaltige staatliche Verbrechen anzetteln, ohne auch nur einen Funken Schuldgefühl oder schlechtes Gewissen zu empfinden. Er kann die Führungsposition der Form nach ausfüllen und – mit Hilfe der ihm übertragenen Macht – hinter dieser Fassade perversen Gelüsten nachgehen und sich hemmungslos auf Kosten anderer Menschen amüsieren.

Dennoch sollte man nicht vorschnell den pathologischen Narzißmus in ein simplifizierendes Schema einordnen, das ich bei anderer Gelegenheit das linke Fundamentalnarrativ genannt habe (das zwar ganz besonders bei Linken gepflegt wird, aber nicht weniger verlockend auf Rechte und Libertäre wirkt):

"Die herrschende Klasse lebt von der Arbeit, dem Leid, Blut, Tod und den Konflikten der Menschen und zieht daraus eigenen Profit."
Für "herrschende Klasse" setzen verschiedene Ideologien hier verschiedene Gruppen von Menschen ein. Man könnte auch die Gruppe der pathologischen Narzißten einsetzen. Der Grundfehler dieses Narrativs ist der Irrglaube, man müßte nur diese jeweils benannte Menschengruppe (die Kapitalisten, die Juden, die Hochfinanz, alle Staatsbeamten, oder eben die pathologischen Narzißten) irgendwie loswerden, unschädlich machen oder die Gesellschaft ohne sie organisieren, und schon würde alles gut, würde die Welt zum Paradies, wie Oberth ja wörtlich sagt.

Das ist eine vereinfachende Immanentisierung eines viel tiefer liegenden Sachverhalts. Leid, Schmerz und Tod gäbe es auch, wenn es auf der Welt keinen einzigen pathologischen Narzißten gäbe. Leid, Schmerz und Tod gehören zur conditio humana, sie sind, theologisch gesprochen, Folgen der Erbsünde, die dieser Welt bis zum Jüngsten Tag anhaften werden.

Um im theologischen Rahmen zu bleiben: das linke Fundamentalnarrativ ist dennoch nicht grundsätzlich falsch, es liegt ihm eine wahre Beobachtung zugrunde: daß nämlich die Welt im Griff einer Widersachermacht ist. Es ist keine konkrete Menschengruppe, die sich von Leid, Haß und Konflikten unter den Menschen nährt, sondern eine übernatürliche Macht, die in der Sprache der Religion "der Fürst dieser Welt" genannt wird, und er würde immer versuchen, sich Geltung zu verschaffen, egal wie wir unsere Gesellschaften organisieren und strukturieren, und egal welche Menschengruppen wir in Führungspositionen haben.

Aus diesem Grunde spricht übrigens die amerikanische Katholikin Ann Barnhard in einem instruktiven, gründlichen, dreistündigen Vortrag vom diabolischem Narzißmus – mit dem Beiwort diabolisch will sie betonen, daß in dieses Phänomen eine übernatürliche Komponente hineinspielt, ohne die es nicht umfassend verstanden werden kann.

Vertrauen und Autorität

Zu echter Autorität gehört nicht nur Härte, sondern auch Milde und Demut. Wer in einer Führungsposition steht, hat eine ungeheuer schwere Verantwortung vor denen, die er führt. Das Mißbrauchspotential ist gewaltig. Eine guter Herrscher muß in beständiger Sorge darum leben, das Richtige für die ihm anvertrauten Menschen zu tun. Seine Persönlichkeit sollte harmonisch ausgebildet und möglichst frei von irgendwelchen Schieflagen, Einseitigkeiten oder Einbildungen sein. Er sollte umfassendes Verständnis für und Einfühlung in die Probleme der ihm Unterstellten aufbringen. Den Gehorsam der ihm anvertrauten Menschen kann er umso mehr erwarten, je mehr er selbst sich mit seiner Aufgabe als Diener ansieht - im Dienste des Wahren, des Guten, der Gerechtigkeit, im Dienste Gottes und im Dienste seines Volkes.

Fluch über die Menschen, die nur um des Wohllebens, des sozialen Prestiges oder des Machtgenusses willen nach Führungspositionen streben! Sie schaden nicht nur sich selbst und anderen durch ihr konkretes Tun, sondern sie verderben auch allgemein das Vertrauen in die Führung, dessen eine Gesellschaft bedarf, um fortzubestehen.

So sah es noch der Preußenkönig Friedrich der Große:

Also, Wahrung des Rechtes [...] ist demnach eines Herrschers erste Obliegenheit. Über alles soll ihm seiner Völker Wohlfahrt gehen. Ihres Gedeihens oder Behagens Mehrer oder auch Begründer hätte er demnach zu sein. Aber was sollen dann all diese Begriffe Eigennutz, Hoheit, Ehrgeiz, Despotismus? So läuft es darauf hinaus, daß der Herrscher, weit entfernt, der unumschränkte Gebieter über seine Untertanen zu sein, nur ihr erster Diener ist, das Werkzeug ihres Glückes, wie jene das Werkzeug seines Ruhmes. [7]

Wenn man aufhört, Herrschaft in diesem Sinne zu verstehen, wird sie nicht mehr in der ihrer Natur gemäßen Weise ausgeübt.

Ob als Herrschender oder Beherrschter: der Narzißt hat ein grundsätzliches Problem mit Herrschaft. Gehorchen zu müssen, ist eine Beleidigung seiner vermeintlich göttlich-übermenschlichen Identität: da ballt er die Faust und schleudert den Herrschenden sein non serviam! entgegen. Ist er aber selbst in einer Herrschaftsposition (wozu es ihn natürlich drängt), verwendet er die ihm übertragene Macht in einer Art, die den Begriff und Sinn von Herrschaft karikiert und nachhaltig zersetzt.

Zusammenfassend läßt sich sagen: um sich gegen sie zu wappnen, ist es nützlich, die Tricks und Spielchen der pathologischen Narzißten – beispielsweise Projektion und Gaslighting – sicher zu erkennen. In einer großflächig dem Narzißmus verfallenen Gesellschaft kann ihr destruktives Potential gar nicht hoch genug eingeschätzt werden. Leider wird das Phänomen nicht aus der Welt verschwinden, wir werden mit diesen Menschen weiterhin leben müssen. Aber das Wissen um ihre Störung kann helfen, sie zu entschärfen.


[1] Eine interessante Frage, auf die er aber nicht eingeht, wäre, ob das immer so war, seit er sich erinnern konnte, oder ob er sich irgendwann im Jugendalter in diese Seelenverfassung hineinmanövriert hatte. Die American Psychiatric Association konstatiert jedenfalls, daß die narzißtische Persönlichkeitsstörung "im frühen Erwachsenenalter" beginnt.
[2] https://www.premierchristianity.com/Past-Issues/2016/May-2016/David-Wood-From-Nihilism-To-New-Life
[3] Douglas McManaman, Narcissism and the Dynamics of Evil. https://www.catholiceducation.org/en/culture/catholic-contributions/narcissism-and-the-dynamics-of-evil.html, zuerst in Life Magazine 2005.
[4] Erich Fromm, Die Seele des Menschen und ihre Fähigkeit zum Guten und zum Bösen, Open Publishing Rights GmbH, 2014, S. 33
[5] Hermann Oberth: Wählerfibel für ein Weltparlament, Feucht 1983, S. 52
[6] Zitiert im Codex Iuris Civilis, 1.1.10, dem römischen Bürgerrecht, auf dessen Grundsätzen und Regeln unsere Rechtsprechung bis heute basiert. Hier wird das Ulpian-Zitat zur Definition der Rechtsprechung verwendet.
[7] Friedrich II. von Preußen: Der Antimachiavell - Kapitel 3, online bei Projekt Gutenberg

Sonntag, 17. Dezember 2017

Über menschliche Größe

Zu allen Zeiten und in allen Völkern hat es große Menschen gegeben: Menschen, die durch Wort und Tat hervortraten und durch ihre besondere Ausstrahlung vielen zum Vorbild wurden. Was ist ihr Geheimnis? Was macht einen großen Menschen aus?

Die vertikale Dimension
Versuch einer Begriffsbestimmung
Scheiternde und scheinbare Größe
Der größte Mensch
Die Sendung und die Person
Quantität und Qualität
Schein-Größe im Massenzeitalter
Vom Kult des Kleinen
Ein Klima für Größe
Erziehung und Bildung
Ehe und Familie
Disziplin und Autorität
Umschlag der totalen Demokratie in die Tyrannis
Liberalismus und gute Volkserziehung
Den Weg bereiten

Die vertikale Dimension

Um sich dem Geheimnis des großen Menschen zu nähern, muß man sich zuerst von gewissen falschen, heute sehr verbreiteten Vorstellungen über Welt und Mensch lösen. Der große Mensch kann nur verstanden werden, wenn klar ist, daß alle Dinge eine Form haben, die sie, wie unvollkommen auch immer, ausfüllen, ebenso wie sie ein Ziel haben, auf das sie hin gerichtet sind. Das gilt insbesondere für den Menschen: jeder Mensch ist eine ἐντελέχεια (Entelechie), ein Wesen mit einem eingeschriebenen Ziel, auf das hin er gerichtet ist. Diese Formen oder eingeschriebenen Ziele gehören zu einer vollständigen Beschreibung der Dinge genauso dazu wie ihre Materialität und ihr Bewirktsein durch andere Dinge.

Die Welt hat nicht nur eine horizontale Dimension, sie schreitet nicht voran zu immer vollkommeneren Zuständen, wie es uns ein heute allgegenwärtiger naiver Geschichtsoptimismus weismachen will. Sondern die Vollkommenheit eröffnet sich dem Menschen zu jeder Zeit und in jeder Gesellschaftsform durch eine andere als diese horizontale, zeitliche Dimension. Unser Leben ist nicht nur als Übergangsform von Wert, und nicht etwa nur insofern, als es einer zukünftigen besseren Gesellschaft gedient haben wird. Das Leben bekommt seine Würde durch eine andere, zu allem Fortschritt oder auch nur vermeintlichen Fortschritt vertikale Dimension.

Wer das Hohe, das Ideale nur in einem utopischen Zielpunkt der Entwicklung des Menschengeschlechts sieht, zwingt den Menschen in die Horizontale. Seine Mitmenschen an die Hand zu nehmen und entlang der Zeitachse einem imaginierten Menschheitsziel entgegenzuschreiten, ist die Fortbewegungsart des Kriechtiers. Dabei übersieht man, daß die volle Würde und Entfaltung des einzelnen Menschen wie auch der Völker in ihrer idealen Wirklichkeit liegt, die ihnen aus ihrem reinen Sein gegeben ist, gewissermaßen jenseits der Zeitachse. Nur wer diese Vertikale anerkennt, der kann auch die Würde des Menschen begreifen, die in seiner kostbaren Einzigartigkeit begründet ist.

All diese in der Vertikalen angelegten Ideale sind bereits hier und jetzt erkennbare Wirklichkeiten und werden nicht erst in der Zukunft manifest. Sie geben dem einzelnen Sinn und Ziel und lassen Gesellschaften aufblühen, die gemäß dieser vertikalen Dimension organisiert sind.

Zivilisierte Gesellschaften sind nicht möglich ohne Herrschaft - wozu als notwendiger Gegenpart auch Unterordnung gehört. Herrschaft aber impliziert Autorität, Eliten und eine hierarchische Ordnung. Gesellschaften erblühen umso mehr, je mehr sie die Prinzipien von echter Hierarchie, von echter Autorität, von echten Eliten in ihrer ganzen Tiefe zu verkörpern suchen. Unter diesen Umständen sind große Menschen gesellschaftliche Vorbilder; sie ragen als Leuchtfeuer heraus und regen viele dazu an, selbst Großes zu leisten und ihrerseits das, was in ihnen angelegt ist, zur Entfaltung zu bringen.

Versuch einer Begriffsbestimmung

Ein Rückblick in die Geschichte lehrt, daß kulturelle Blütezeiten wie beispielsweise die Renaissance, oft mit einer winzigen Zahl von Menschen verknüpft sind, die aber ihrer Zeit gewaltige Kulturimpulse einpflanzten. Diese besonderen Menschen flammten wie aus dem Nichts plötzlich auf, ihre Wege kreuzten sich oft auf wunderbare Weise mit anderen Großen, um in schicksalhaften Synthesen noch Größeres zu vollbringen, und was sie in die Welt setzten, brachte nicht nur ihre eigene Zeit zum Erblühen, sondern lebte oft noch über Jahrhunderte nach. Was ist das Geheimnis dieser Menschen? Was macht ihre Größe aus? Was ist überhaupt ein großer Mensch?

Das Phänomen menschlicher Größe ist ein Studienbeispiel für das Wirken der Idee. Ich will eine Definition versuchen, die diesen Punkt zur Geltung bringt:

Große Menschen bringen eine Sendung, die sie in sich spüren, und der sie ihr Leben vollständig unterordnen, die sie also zum herrschenden Gedanken ihres Lebens machen, in der Welt zur Wirksamkeit.
Der konkrete Inhalt dieser Sendung ist dabei individuell verschieden und für die Definition nicht entscheidend. Maßgeblich ist nur, daß eine solche Sendung gespürt und mit aller Entschlossenheit gelebt wird. Was ich hier Sendung nenne, ist gleichsam die Form oder Artung des einzelnen Menschen, die in ihm liegt wie der ausgewachsene Baum im Samenkorn - nur daß es anders als beim Samenkorn der Mensch selbst ist, der durch eigene Aktivität und seinen Willen diese in ihm liegende Form zu erkennen und zu verwirklichen sucht. Schiller formulierte es dichterisch:
Suchst du das Höchste, das Größte, die Pflanze kann es dich lehren:
Was sie willenlos ist, sei du es wollend - das ist’s!

Scheiternde und scheinbare Größe

Definitionen gewinnen ex negativo an Klarheit: was ist nicht groß, sondern allenfalls scheinbar groß? Woran kann Größe scheitern?

Größe kann auf dreierlei Weisen ihren Begriff verfehlen:

Erstens kann man die eigene Sendung falsch wahrnehmen. Man kann sich tragischerweise einbilden, eine bestimmte Sendung zu haben, die man de facto nicht hat, und diese eingebildete Sendung sehr entschieden und durchaus mit der erforderlichen Energie verfolgen. Die Mathematischen Institute der Welt kennen die sogenannten Winkeldreiteiler: das sind Menschen, die ihr ganzes Leben dem Beweis einer mathematischen oder geometrischen Aussage verschrieben haben, die aus wissenschaftlicher Sicht längst entschieden ist. So wurde durch eine von Evariste Galois (1811-1832) entwickelte Theorie endgültig bewiesen, daß es nicht möglich ist, einen beliebig vorgegebenen Winkel mit Zirkel und Lineal zu dritteln, oder die Kreiszahl π mit Zirkel und Lineal zu konstruieren (ein klassisches Problem, das die Quadratur des Kreises genannt wird). Dennoch probieren dies Forscher bis heute unablässig und senden die umfangreichen Studienhefte, die bei ihren Nachforschungen entstehen, zur Begutachtung an Mathematikprofessoren. Wenn sich diese mit Verweis auf Galois’ Ergebnisse und auf die knappe menschliche Lebenszeit weigern, die in den Beweisversuchen notwendig enthaltenen Fehler im Detail nachzuweisen und zu erklären, fühlen sich die Winkeldreiteiler als verkannte Genies, als Opfer akademischer Arroganz. Thomas Mann hat solche zutiefst tragischen Gestalten im “Zauberberg” porträtiert:

Der entgleiste Beamte hatte sich im Lauf seiner Studien mit der Überzeugung durchdrungen, daß die Beweise, mit denen die Wissenschaft die Unmöglichkeit der Konstruktion erhärtet haben wollte, unstichhaltig seien, und daß die planende Vorsehung ihn, Paravant, darum aus der unteren Welt der Lebendigen entfernt und hierher versetzt habe, weil sie ihn dazu ausersehen, das transzendente Ziel in den Bereich irdisch genauer Erfüllung zu reißen. So stand es mit ihm. Er zirkelte und rechnete, wo er ging und stand, bedeckte Unmassen von Papier mit Figuren, Buchstaben, Zahlen, algebraischen Symbolen, und sein gebräuntes Gesicht, das Gesicht eines scheinbar urgesunden Mannes, trug den visionären und verbissenen Ausdruck der Manie. Sein Gespräch betraf ausschließlich und mit furchtbarer Eintönigkeit die Verhältniszahl pi, diesen verzweifelten Bruch, den das niedrige Genie eines Kopfrechners namens Zacharias Dase eines Tages bis auf zweihundert Dezimalstellen berechnet hatte –, und zwar rein luxuriöserweise, da auch mit zweitausend Stellen die Annäherungsmöglichkeiten an das Unerreichbar-Genaue so wenig erschöpft gewesen wären, daß man sie für unvermindert hätte erklären können. Alles floh den gequälten Denker, denn wen immer ihm an der Brust zu ergreifen gelang, der mußte glühende Redeströme über sich ergehen lassen, bestimmt, seine humane Empfindlichkeit zu wecken für die Schande der Verunreinigung des Menschengeistes durch die heillose Irrationalität dieses mystischen Verhältnisses.
Zweitens kann auch eine “Sendung zum Bösen” gelebt werden, und auch darin kann man eine gewisse relative Größe erlangen. Im politischen sind die Früchte einer Sendung zum Bösen: Zerstörung, Terror und kultureller Verfall. Die Größe, die durch eine Sendung zum Bösen entsteht, ist allerdings nur eine Abschattung, eine Karikatur wahrer Größe. Der gerissenste Meisterdieb, der größte Halunke, der zu Ruhm gekommene Quacksalber oder Hochstapler - ihre Bilder verblassen nach kurzer Zeit, und ihre Größe ist eine Art von Mimikry, eine Nachahmung der äußeren Gebärden des wahren großen Menschen. Es fehlt die Substanz. Zur wahren Größe gehört eine gute Sendung.

Drittens kann eine Sendung zwar objektiv richtig sein und auch gut, aber man kann an ihr scheitern - sei es, daß man Heranbildung der eigenen Kräfte zum Ziele hin falsch einschätzt, sei es durch Schicksalshärten wie Krankheit, Armut, Hunger, Gefangenschaft, Krieg usw., sei es durch andere, intervenierende Lebensaufgaben oder Pflichten. So hat ein Samenkorn zwar den Baum als Form in sich, wenn es aber in einem schlechten Boden wachsen soll, kann es die Form gar nicht oder nur unzulänglich ausfüllen. Das gilt nicht nur für die Voraussetzungen, sondern auch für die äußeren Umstände: ebenso wie der Boden kann auch das Klima - etwa eine Reihe dürrer Jahre - dem Baum einen Strich durch die Rechnung machen.

Der größte Mensch

Das Beispiel Jesu zeigt übrigens, daß dieser dritte Punkt, die objektive Einschätzung des Erfolgs einer Mission, schwierig ist. Nach menschlichem Ermessen war mit der Kreuzigung Christi alles verloren. Es bleibt nach menschlichen Maßstäben unverständlich, daß ein einzelner Mensch, der darüberhinaus noch als Verbrecher starb und von seinem eigenen Volk verflucht und in den Tod geschickt worden war, zur Gründungsperson einer Kirche werden konnte, die wo immer sie Einfluß erlangte, eine bedeutende zivilisierende und kultivierende Größe wurde.

Ich will kurz ins Religiöse ausgreifen: denn die Vorstellung, daß Dinge eine Form haben, nach der oder auf die hin sie geschaffen sind, ist älter als alle Philosophie, älter als Plato, und urständet in der Religion. Sie wird etwa auch von den Verfassern des Schöpfungsberichts geteilt. Denn dort lesen wir, daß Tier und Mensch “ein jegliches nach seiner Art” geschaffen wurden. Das ist mit Sicherheit nicht bloß eine Redensart, sondern enthält die Auffassung, daß allem ein Typus, eine Idee zugrundeliegt, die ein Teil seiner Wirklichkeit darstellt. Was aber ist die Form, die Art, das Urbild des Menschen? Das Urbild des Menschen ist Gott selbst. Denn gemäß Schöpfungsbericht ist der Mensch “nach Gottes Ebenbild und Gleichnis geschaffen”. Jeder Mensch trägt dieses Urbild in sich, ist “zu Gott hin geschaffen”, wie der Hl. Augustinus von Hippo es ausdrückte. Demnach ist der größte Mensch unter allen Menschen, die je gelebt haben - Jesus Christus. Denn als Sohn Gottes hat er diesen Urtyp auf die vollkommenst mögliche Weise gelebt. Seine Sendung war identisch mit seiner Person, und sein Leben zeigt die vollständige Unterordnung unter diese Sendung, bis hin zum Opfertod am Kreuz.

Die Sendung und die Person

Nun ist Jesus Christus allein dadurch ein absoluter Ausnahmemensch, daß er, der sich der Menschensohn nannte, das Urbild des Menschen, nämlich Gott, in seiner völligen Unmittelbarkeit verkörperte. Für uns andere gilt, daß wir nicht nur dieses allgemeinen Urbild, sondern auch ein konkretes Ziel, eine konkrete Bestimmung in unserem Leben haben, die auf einen bestimmten Lebens- und Wirkensbereich, auf besondere Umstände und Begabungen abgestimmt ist. So differenziert sich menschliche Größe in verschiedenen Formen aus. Wir kennen große Könige und Herrscher, große Krieger und Helden, große Künstler, große Heilige, große Forscher. Je größer sie waren, umso weniger ging es ihnen um sich selbst - umso mehr war ihnen bewußt, daß ihre Größe im Dienst einer Sendung stand, die letztlich im Willen Gottes mündete. So rühmte sich ein Künstler wie Johann Sebastian Bach, der mit seiner Musik ein Stück Himmel auf die Erde herabholte, nie seiner Begabung, sondern unterschrieb jedes seiner Werke mit dem Kürzel S.D.G. - Soli Deo Gloria (Gott allein sei die Ehre). Größe bedeutet also nicht Selbstverwirklichung im heute modischen Sinne, sondern ist im Gegenteil mit größtem Opfermut verbunden: der Bereitschaft, das eigene Selbst einem höheren Impuls, einer Mission oder Aufgabe unterzuordnen. Die Römer wußten das, wenn sie den Marcus Curtius als eines ihrer großen Vorbilder verehrten. Dieser Soldat hatte sich in eine Felsspalte geworfen, die sich mitten in Rom aufgetan hatte, um - wie es ein Orakelspruch verlangt hatte - den Göttern das zu opfern, wovon die Macht und das Wohl Roms am meisten abhänge.

So ist es kein Wunder, daß gerade das Schlachtfeld noch immer einen besonderen Bewährungsort für menschliche Größe darstellte. Soldaten, die bereit sein müssen, ihr ganzes Leben in die Waagschale zu werfen, um des größeren Wohles ihres Landes willen, werden allein durch diese ihre Aufgabe zur Größe erzogen - zur Größe des Heldenmutes, der Tapferkeit, der Kameradschaft - und auch der unbedingten Opferbereitschaft. Das ist der Stoff, aus dem große Menschen geschmiedet wurden. Ein gesundes Volk ehrt immer seine Krieger, denn auch in Phasen von trügerischer Ruhe und Frieden ist es sich - wie Marcus Curtius und die alten Römer - stets bewußt, daß seine Macht und sein Wohl von ihnen abhängen.

Quantität und Qualität

Einzelne große Menschen können Gewaltiges bewirken. Das relativiert die zahlenmäßigen Vergleiche im Politischen - “wieviel Prozent” eine bestimmte politische Kraft aufbringt, ist nicht entscheidend für ihre Durchschlagskraft. Im heute allgegenwärtigen demokratischen Denken hat jeder Mensch genau eine Stimme und daher das gleiche Gewicht, es ebnet die Unterschiede zwischen großen und kleinen Menschen ein. Die Wirklichkeit sieht anders aus, wie es schon Aesop lehrte:
Eine Füchsin, die auf ihre Fruchtbarkeit stolz war, schalt eine Löwin, daß sie nur ein einziges Junges zur Welt brächte. Die Löwin antwortete ihr darauf: »Fürwahr, ich bringe nur eines zur Welt, aber dieses einzige ist ein Löwe.«
Ein einziger großer Mensch kann für den Erfolg einer Schlacht entscheidender sein als ein Heer von Parteigängern. Auch im Kriege spielt zwar die zahlenmäßige Überlegenheit eine Rolle, aber ein unfähiger Führer kann die Truppen trotz zahlenmäßiger Überlegenheit ins Verderben führen, so wie ein kluger Stratege eine zahlenmäßige Unterlegenheit wettmachen kann.

Die Größe ist daher in gewisser Weise ein natürliches Gegenstück zur Menge, zu den Vielen. Sie hebt die Menge nicht auf, aber gibt dem ganzen Haufen Ziel und Richtung - oder macht ihm das eigene Ziel wenigstens sichtbar, hilft ihm, sich zu focussieren. Sich selbst überlassen, ohne Vorbilder, Anleitung und Führung zu haben, geraten die Menschen in einer taumelnden Abwärtsbewegung hin zum berühmten letzten Menschen Nietzsches, der all seine Spannkraft und Formkraft verloren hat, der seine Tage auf Watte gebettet in einem belanglosen, widernatürlichen Einerlei dahinbringt:

»Wir haben das Glück erfunden« – sagen die letzten Menschen und blinzeln.

Sie haben die Gegenden verlassen, wo es hart war zu leben: denn man braucht Wärme. Man liebt noch den Nachbar und reibt sich an ihm: denn man braucht Wärme.

Krankwerden und Misstrauen-haben gilt ihnen sündhaft: man geht achtsam einher. Ein Thor, der noch über Steine oder Menschen stolpert!

Ein wenig Gift ab und zu: das macht angenehme Träume. Und viel Gift zuletzt, zu einem angenehmen Sterben.

Man arbeitet noch, denn Arbeit ist eine Unterhaltung. Aber man sorgt dass die Unterhaltung nicht angreife.

Man wird nicht mehr arm und reich: Beides ist zu beschwerlich. Wer will noch regieren? Wer noch gehorchen? Beides ist zu beschwerlich.

Kein Hirt und Eine Heerde! Jeder will das Gleiche, Jeder ist gleich: wer anders fühlt, geht freiwillig in's Irrenhaus. »Ehemals war alle Welt irre« – sagen die Feinsten und blinzeln.

Man ist klug und weiss Alles, was geschehn ist: so hat man kein Ende zu spotten. Man zankt sich noch, aber man versöhnt sich bald – sonst verdirbt es den Magen.

Man hat sein Lüstchen für den Tag und sein Lüstchen für die Nacht: aber man ehrt die Gesundheit.

»Wir haben das Glück erfunden« – sagen die letzten Menschen und blinzeln –

Schein-Größe im Massenzeitalter

Und obwohl er das Glück erfunden zu haben meint, ist der Massenmensch zutiefst unglücklich. Er fühlt sich - zu Recht - um seine Würde betrogen, um das, was sein Menschsein ausmacht. Wenn aber der Zeitgeist jede Form von Idealismus in den Boden gestampft hat, kann er sich nicht auf das Wesen echter Größe besinnen. Er versucht, die äußeren Formen der großen Menschen nachzuahmen: daß jemand in einer bestimmten Sache vor allen anderen hervorsticht, daß er etwas Besonderes ist, daß Menschen ihn bewundern, daß er reich ist und erfolgreich und so seinem langweiligen Dasein als Massenmensch entrinnen kann. So entstehen der heutige Star-Kult (dem keine aufrichtende Kraft innewohnt, da er allein nach dem Erfolg bei der Masse strebt, also in der Horizontalen verbleibt), Hot Dog Eating Contests, das Guinness Buch der Rekorde - der Rekord um des Rekordes willen, eine traurige Karikatur echter Größe. Und doch zeigen diese Aktivitäten - bei aller verkommenen Reduktion auf das bloße Erheischen von Aufmerksamkeit - daß die Sehnsucht nach Größe im Menschen angelegt ist. Es ist nichts Verwerfliches darin, nach Exzellenz zu streben!

Größe setzt oft eine hohe Begabung voraus, aber diese Tatsache an sich macht nicht das Wesen der Größe aus, sie ist nur eine Begleiterscheinung. Größe ist nicht bloß die Zelebrierung einer Besonderheit. Sie ist nicht Sache eines Kuriositätenkabinetts, nicht irgendeine ins Extrem ausgeprägte Spezialität, die in der gaffenden Menge ein “Ah” und “Oh” hervorruft, sondern Größe ist im Gegenteil eine besonders vollkommen instanziierte Gesamtform des Menschseins. Man sollte bei menschlicher Größe nicht an eine besondere Spezialbegabung denken, als vielmehr an das volle Ergreifen des Menschseins an sich, etwa im Sinne des von Goethe formulierten Ideals:

Wenn die gesunde Natur des Menschen als ein Ganzes wirkt, wenn er sich in der Welt als einem großen, schönen, würdigen und werten Ganzen fühlt, wenn das harmonische Behagen ihm ein reines, freies Entzücken gewährt, dann würde das Weltall, wenn es sich selbst empfinden könnte, als an sein Ziel gelangt aufjauchzen und den Gipfel des eigenen Werdens und Wesens bewundern.
Daß diese Art von Größe nichts mit dem Haschen nach Rekorden und Superlativen zu tun hat, bestätigt auch “der letzte Samurai” Yukio Mishima (1925-1970):
Heute sind die Baseballspieler und die Fernsehstars die großen gefeierten Leute. Wenn einer über spezielle Fähigkeiten verfügt, mit denen er die Öffentlichkeit fasziniert, mag er immer seine komplexe Persönlichkeit darangeben und zu einer Marionette dieser Technik werden, er entspricht damit dem Ideal unserer Zeit. Insofern besteht zwischen dem (darbietenden) Künstler oder Unterhaltungskünstler und dem Techniker kein Unterschied.
Das Agens der Größe, ihre treibende Kraft, ist die tief gespürte innere Sendung - und niemals ist es bloß der Wunsch, dem Dasein als einer von vielen, als sterblicher, einmal im Nichts des Vergessens verschwindender Mensch zu entkommen. Wer sich nur aus dem Wunsch nach Aufmerksamkeit ans Licht der Öffentlichkeit kämpft, gibt nur ein trauriges Zerrbild wahrer Größe ab, eine Parodie, da er sich von den wahrhaft Großen nur dieses eine abgeschaut hat: daß sie eben auch die Aufmerksamkeit der Vielen haben (worauf es ihnen aber nie primär ankam). Wieviel wird zerstört in Menschenseelen, die zu solchen falschen Helden aufblicken!

Vom Kult des Kleinen

Noch schädlicher aber als alles Streben nach Rekorden und Aufmerksamkeit - sind es doch pervertierte Formen eines im Kern immerhin guten Antriebs zur Größe - ist der grassierende Kult des Kleinen, politisch gefördert durch die Gleichheitsideologie und unser demokratisches Zeitalter. Bedeutet Größe, wie oben definiert, das Streben nach Ausfüllen der Form, so setzt die Kleinheit dem die Vergessenheit der Form entgegen. Das paßt weltanschaulich sehr gut zum Materialismus, der alle Zielursachen in der Welt zum bloßen Anschein erklären will, der “in Wahrheit” (hier also doch “in Wahrheit”!) durch Säfte und Kräfte rein mechanisch zustandekomme. Immer in der Pose moralischer Empörung über alle Ungleichheiten wird schließlich alles Höherstehende, alles Edle, alles Bedeutende abgeschliffen, was dem einzelnen Menschen Würde und Tiefe geben könnte. So spricht der übellaunige Zwerg zum Riesen: “Ich bin klein, und du bist groß, das ist ungerecht. Wenn du das nicht einsiehst, wenn du dich nicht freiwillig kleinmachst und mit einem Buckel herumläufst, wenn du deine Lektion in Bescheidenheit nicht lernst, bist du böse. Auf jeden Fall muß deine Größe kleingeredet und dem Spott preisgegeben werden, da ich sie nicht ertrage.” Getarnt durch die Rede von Humanität und Mitmenschlichkeit, befördert dieser Kult der Bedeutungslosigkeit eine mächtige kulturelle Abwärtsbewegung: denn dem einzelnen wird ja jede Motivation genommen, seine Anlagen zu entwickeln.

Ein Klima für Größe

Eine Gesellschaft wird dann am besten gedeihen, wenn sie der Größe Raum gibt - man muß sich ermuntert fühlen, in allem Tun nach Exzellenz zu streben. Aber nicht nach der Exzellenz des Rekordes, die keine wahre Größe ist. Es ist keine Größe, durch schlaue Geschäftigkeit ein Millionenvermögen anzusammeln, auch wenn das heute vielfach als Größe angesehen wird. Es ist keine Größe, mit künstlerischen oder gastronomischen Produktionen den heutigen Massengeschmack zu treffen. Menschen, die darin gut sind, mögen zwar für kurze Zeit Popularität genießen, aber von Dauer ist ihr Werk nicht.

Wahre Größe hat auch immer eine Rückbindung an die Gemeinschaft, in der und für die sie erblüht. Die oben aufgezählten Beispiele der Größe zeigen das: große Könige, große Kämpfer, große Forscher, große Heilige - sie alle hatten nicht ihr eigenes Wohl im Auge, sie waren keine "net wealth optimizer", sondern was sie schufen und für was sie lebten, war immer auch ein Dienst an ihrer Gemeinschaft, diente dem summum bonum und nicht nur ihrem eigenen net wealth.

Erziehung und Bildung

Einen wichtigen Anteil daran, ein positives Verhältnis zur Größe zu vermitteln, tragen die Erziehung und die Bildung - durch die Eltern wie durch staatliche Lehranstalten. Wenn hier gute Gärtnerarbeit geleistet wird, profitiert die ganze Gesellschaft von den Früchten.

Auch das Gedenken an große Menschen vergangener Zeiten muß einen angemessenen Platz in der Gegenwart haben.

Um das positive Gemeinschaftsgefühl in der Seele zu verankern, in den sich das Handeln einfügen sollte, gibt es nach wie vor kein besseres Lern- und Übungsfeld als die Familie. Die Versuche, die Familie abzuschaffen und an ihre Stelle ein "kollektives Bewußtsein" der Weltgemeinschaft herbeireden zu wollen, sind vor allem eines: leeres Gerede. Die Familie ist der Ort, in dem geboren wird, also Leben weitergegeben wird von den Früheren an die Zukünftigen. Die Eltern stehen da als "priesterliche Mittler zwischen dem, was vorher war und dem was sein wird" (Pfr. Hans Milch). Dieser Ort, an dem neues Leben entsteht, ist die Keimzelle der Gesellschaft, der Nation, deren Wortherkunft von nasci, geboren werden, schon deutlich sagt, daß sie durch eine gemeinsame Herkunft begründet ist, durch gemeinsame kulturelle wie auch biologische Traditionslinien, die es in die Zukunft hinein zu erhalten und zu pflegen gilt.

Was wir heute vorfinden, ist in alledem das gerade Gegenteil. Es ist, als legten es herausfordernde Gegenmächte geradezu darauf an, alles Große und Erhabene zu verhöhnen, zu verspotten, in den Dreck zu ziehen und alles Streben nach Größe zu verhindern.

Der Eindruck, daß hier im Verborgenen feindliche Kräfte oder Gruppen wirken, ist sicher kein Hirngespinst - ich bin überzeugt von der Existenz solcher Gegenmächte, aber sie können sich nur entfalten aufgrund der Zustimmung der Vielen, die ohne äußere Anleitung in eine freie Abwärtsbewegung geraten, weil ihnen die Selbstdisziplin und moralische Spannkraft dafür fehlen, ein Leben oberhalb der nackten Bedürfnisbefriedigung zu leben. Die Dinge, sich selbst überlassen, fallen den Gesetzen des Abbaus und Verfalls anheim, sie werden zum Opfer von Rost und Motten, verlieren ihren Glanz, verderben, verrotten und verfaulen, wenn nicht beständige pflegende oder veredelnde Arbeit an ihnen geleistet wird. Das gilt wie für jedes Ding so auch für den Menschen.

Ehe und Familie

Einige starke Verfallskräfte sind geistig im Kulturmarxismus der Frankfurter Schule zu verorten. Eine ihrer Früchte, die Emanzipationsbewegung klagte über einen gesellschaftlichen Zwang, der Frauen angeblich zu Heim, Herd und zum Kinderkriegen drängen würde - und etablierte dafür einen gesellschaftlichen Zwang für Frauen, Heim, Herd und Kinder wie die Pest zu meiden, weil es sich um unwürdige Sklavenarbeit handele, die eine gewaltige mythische, in Urzeiten zurückreichende Verschwörung der Männer, das sogenannte Patriarchat, ihnen aufgebürdet habe. Eine heutige Partnerschaft hat demnach auch nichts mehr mit einer traditionellen Ehe und Familie zu tun, die immer vor allem als ein schicksalhaft gegebenes Spannungs- und Übungsfeld der Sozialität, der Liebe, der Treue, der Moralität angesehen wurde, als eine Lebensgemeinschaft, die durch ein bindendes Versprechen über die Launen der einzelnen erhoben ist und sich in der genannten priesterlichen Mittlerstellung zwischen Vergangenheit und Zukunft befindet.

Im Unterschied hierzu ist eine heutige Partnerschaft eine zum gegenseitigen sexuellen Nießbrauch eingegangene Wohngemeinschaft zweier oder mehrerer Menschen beliebigen Geschlechts, die auch jederzeit beendet werden kann, wenn es sich für einen der Beteiligten “nicht mehr richtig anfühlt” oder er sich durch die Beziehung in seinem Drang nach Freiheit und Selbstbestimmung eingeengt fühlt. Dink (double income no kids) ist das Ideal heutiger Lebensabschnittsbeziehungen. Wer sich doch Kinder erlaubt, zur Abwechslung, weil sonst die Monotonie und Sinnlosigkeit der Lebensführung allzu offenkundig würde, hat zu wenig Zeit für sie und sucht sie so bald wie möglich an staatliche Einrichtungen abzuschieben, weil sie ihn stressen. Dann geht es zwar für ihn wieder, aber die nach Aufmerksamkeit hungernden Kinder, denen die eigenen Eltern ihr Recht auf eine familiäre Hülle genommen haben, werden zu einer schweren Last für chronisch überforderte Erzieher, Tagesmütter, Betreuerinnen und Lehrer. Lehrer sehen sich plötzlich in der Aufgabe, Erziehungsleistungen zu vollbringen, die früher selbstverständlich von den Familien erwartet wurden. Insbesondere wurde es versäumt, Disziplin und Gehorsam einzuüben. Das macht es Lehrern, selbst wenn sie es wollten, kaum noch möglich, die Kinder zu Leistungen anzuspornen, bei denen sie an ihre Grenzen kommen.

Viele Lehrer wollen das aber auch gar nicht, denn die marxistischen Dozenten an ihrer Pädagogischen Hochschule haben ihnen beigebracht, daß ein guter Unterricht vor allem egalitär und inklusiv sein muß, daß der Lehrer sich am besten auf die Stufe des Kindes begibt (“es da abholt, wo es steht”) und ihm so wenig Vorgaben wie möglich macht. Das begabte Kind sollte, um möglichst nicht anzuecken, sein Licht unter den Scheffel stellen und sich mit dem allgemeinen Durchschnittsniveau zufriedengeben. Nur so könne endlich die neue Gesellschaft gleicher Menschen entstehen, in der es kein soziales Oben und Unten mehr gebe, sondern alle Menschen den gleichen Rang haben und sich brüderlich die Hände reichen.

Disziplin und Autorität

Bernhard Bueb, langjähriger Leiter des Internats Schloß Salem, schrieb in seiner Studie Lob der Disziplin (2006), wie der in der Menschennatur verankerten, auf Autorität und Gehorsam gegründeten traditionellen Pädagogik ab 1968 andere, oft experimentelle Erziehungsparadigmen folgten und die Ansicht schließlich allgemein wurde,
Erziehung bis in die letzten Winkel der Kinderzimmer zu demokratisieren. Das Gespräch, die Verabredung, die Vereinbarung und die Diskussion bilden seither das Fundament der Erziehung. Eltern und Lehrer geben sich als Partner von Kindern und Jugendlichen, das natürliche Machtgefälle wird zugunsten eines vernünftigen Diskurses unter Gleichen aufgehoben. Eltern ließen sich - vor allem in den siebziger und achtziger Jahren - nicht mehr als Vater und Mutter ansprechen, sondern mit Vornamen, in der einen oder anderen Schule duzten Schüler die Lehrer. Hierarchien wurden auf ein Minimum reduziert. Dieser demokratische Geist in der Erziehung ist inzwischen Gemeingut geworden, ein Stück deutscher pädagogischer Kultur, deren Kinder wir mehr oder minder alle sind. Gemeinsam ist allen die zu lobende Bemühung, Kinder und Jugendliche zu achten, sie nicht zu unterdrücken oder zu demütigen, sondern ihnen ein Umfeld zu schaffen, das ihr Aufwachsen fördert. Ebenso gemeinsam ist aber allen, ihren Anspruch auf Erziehung im täglichen Leben bis zu den kleinen Regelungen des Umgangs und Zusammenlebens zu rechtfertigen. Sekundärtugenden wie Ordnung, Pünktlichkeit, Fleiß oder höfliche Umgangsformen gelten nicht mehr selbstverständlich. Die Forderung nach Disziplin und Gehorsam gilt als undemokratisch und daher inhuman.
All dies ist offensichtlich Gift für eine Kultur, die um Pflege von Größe bemüht sein will. Der Passus macht zudem deutlich, daß diese der menschlichen Natur zuwiderlaufende Entwicklung einer Totalisierung des demokratischen Gedankens entspringt. Demokratie, die als Mehrheitsprinzip in sich wertneutral lediglich eine Methode der gemeinschaftlichen Entscheidungsfindung darstellt, wird zur höchsten, allgültigen moralischen Norm erhoben. Das ist einer der Punkte, an dem Moral zu Hypermoral umschlägt.

Umschlag der totalen Demokratie in die Tyrannis

Mit dieser Tendenz der Demokratie zur maßlosen Übertreibung ihres eigenen Prinzips spreche sich die Demokratie schließlich ihr eigenes Todesurteil aus und schlage in die Tyrannis um, beschrieb schon Platon in seiner Politeia: der Drang nach Freiheit von aller Unterordnung finde keine natürliche Gegenkraft oder Grenze mehr, breite sich also immer weiter aus und dringe in jeden Winkel der Gesellschaft ein, sogar bis in das Familienleben,
(...) wenn etwa ein Vater sich gewöhnt, einem Knaben ähnlich zu werden, und sich vor seinen Söhnen fürchtet, wenn dagegen ein Sohn den Vater spielt und weder Scham noch Furcht vor seinen Eltern hat, damit er nämlich frei sei, wenn der Abhängige sich dem gleichstellt, von dem er abhängig ist, und der Bürger sich seinen Abhängigen gleichstellt, und ebenso zum Ausländer auf gleiche Weise.

Und es bleibt dabei nicht allein, sondern es ereignen sich auch noch andere Kleinigkeiten folgender Art: Der Lehrer fürchtet seine Schüler und schmeichelt ihnen, die Schüler haben keine Achtung vor den Lehrern und so auch vor ihren Erziehern. Und überhaupt spielen die jungen Leute die Rolle der Alten und wetteifern mit ihnen in Wort und Tat, während die Alten sich in die Gesellschaft der jungen Burschen herbeilassen, dabei von Witzeleien und Späßen überfließen, ähnlich den Jungen, damit sie nur ja nicht als griesgrämig, nicht als herrisch erscheinen.

Darauf sagte ich weiter, aber das Äußerste was an Freiheit in einem solchen Staate zum Vorschein kommen kann, tritt ein, wenn bekanntlich die Abhängigen ebenso frei sind wie die, von denen sie abhängig sind. Wie weit aber auch in dem Verhalten der Weiber zu Männern und der Männer zu den Weibern, wie weit da die Gleichheit und Freiheit geht, das hätte ich beinahe vergessen zu erwähnen. (...)

Wenn du alle diese Erscheinungen zusammen nimmst, fuhr ich fort, siehst du nun ein, was das Allerschlimmste hierbei ist? Daß sie die Seele der Bürger so empfindlich machen, dass sie,wenn ihnen jemand auch nur den mindesten Zwang antun will, sich alsbald verletzt fühlen und es nicht ertragen, ja endlich, wie du wohl weißt, verachten sie gar alle Gesetze, die geschriebenen wie die ungeschriebenen, um nur keinen Gebieter in irgend einer Beziehung über sich zu haben.

Das also, sagte ich, ist denn der Anfang, woraus die Staatsform der Tyrannis erwächst, wie ich glaube.

Liberalismus und gute Volkserziehung

In liberalen Kreisen klagt man oft über die “Erziehungsmedien” und die unerwünschte Volkserziehung (zur Dramatisierung gern mit einem kleinen Nazi-, “Stürmer”- oder Goebbels-Vergleich aufgehübscht) und strebt an, den Einfluß des Staates auf ein Minimum zu reduzieren, indem man behauptet, Staat an sich sei schlecht, und je weniger Staat, umso besser. Es stimmt zwar, daß unsere heutigen Staaten mit ihrer Macht und den zur Verfügung gestellten Steuergeldern großteils Unsinn, Verschwendung und Verbrechen produzieren. Daß dies aber immer so sein müsse, daß Unsinn, Verschwendung und Verbrechen also quasi zu den Merkmalen von Staatlichkeit an sich gehöre, heißt es mit der Kritik zu übertreiben. Eine alte römische Rechtsregel lautet: abusus non tollit usum - der Mißbrauch hebt den rechten Gebrauch nicht auf. Die pauschale Verurteilung aller Staatlichkeit, nur weil unsere gegenwärtigen Staaten sich hinter einer mehr und mehr bröckelnden Fassade von Demokratie, Gewaltentrennung und Rechtsstaatlichkeit als vollkommen verrottet erweisen, schüttet gleichsam das Kind mit dem Bade aus.

Die Geisteskrankheit, die zu solchen Urteilen verleitet, ist die erwähnte Blindheit für die Form, die Idee, den Sinn, den Zweck, die Natur einer Sache, der wir in der Neuzeit verfallen sind. Daraus, daß sich eine Sache als pervertiert zeigt, folgt aber nicht, daß sie von ihrem ursprünglichen Aufbau her notwendig dahin führt, also diese Perversion bereits in sich trägt. Es ist also nicht die Volkserziehung an sich etwas Schlechtes, ebensowenig wie staatliche Autorität an sich etwas Schlechtes ist - sondern die Menschen, die heute die Volkserziehung betreiben und die heute herrschen, üben ihr Amt sehr schlecht aus. Der Grund dafür liegt darin, daß sie nicht mehr das summum bonum im Auge haben, das Ideal, das allein ein Volk mit seinen Führern einen kann. Hinter aller Größe steht nämlich ein Größtes, auf das hin alles gerichtet ist. Wenn dies nicht mehr gesehen wird, verfällt auch die Demokratie zu einem Kampf verschiedener Cliquen oder Lobbies gegeneinander.

Der Liberalismus als Kult um eine inhaltlich unbestimmte menschliche Freiheit, als ein bis ins Lächerliche übertriebenes “frei von”, ohne jedes “frei zu”, ist also der eigentliche Totengräber der Demokratie: sie frißt sich umso mehr selbst auf, je mehr sie diesem unbestimmten Freiheitsdrang freien Lauf läßt. Der Kult um die inhaltlich unbestimmte Freiheit ist eine geistige Faulheit, geboren aus der Feigheit, selbst Stellung zu beziehen und Verantwortung zu übernehmen.

Den Weg bereiten

Dennoch halte ich es für möglich, daß wir dieser bedrohlichen Abwärtsbewegung noch Einhalt gebieten können. Nicht nur aus dem bisher Beschriebenen, sondern grundsätzlich ist es ja klar, daß Qualität Quantität sticht: es ist keine große Zahl von Menschen nötig, um eine Gegenkraft aufzubauen. Eine wenn auch zunächst kleine Gegenkultur, die sich dem allgemeinen Verfall entgegenstellt, indem sie zu den naturgemäßen Formen der Erziehung, der Bildung, des Umgangs miteinander zurückkehrt und die das Christentum pflegt, um sich zu Gott hin auszurichten, tut nicht nur das, was jeder einzelne bei genauer Gewissensbetrachtung als das für ihn persönlich Richtige erkennen dürfte, sondern er wirkt als Ferment und bereitet den Weg für die Zeit, wenn die schon heute sichtbar zunehmende Unzufriedenheit mit den herrschenden Verhältnissen zu einem Elitenwechsel führt.

Das mag zwar zuweilen nicht einfach sein, aber es ist sinnvoll und ursprünglich und führt uns heraus aus den flachen, seichten Gewässern, deren Erosionskräfte bald alle menschliche und gesellschaftliche Substanz verschlissen haben können. Natürlich gilt es bei aller Arglosigkeit auch klug zu sein, denn in nichts ist das herrschende System besser als im Einsaugen und Unschädlichmachen von Widerstand - Botho Strauß beschreibt diese Gefahr in seinem Anschwellenden Bocksgesang (1993):

Es ist überhaupt keine Frage, daß man glücklich und verzweifelt, ergriffen und erhellt leben kann wie eh und je, freilich nur außerhalb des herrschenden Kulturbegriffs. Was sich stärken muß, ist das Gesonderte. Das Allgemeine ist mächtig und schwächlich zugleich. Der Widerstand ist heute schwerer zu haben, der Konformismus ist intelligent, facettenreich, heimtückischer und gefräßiger als vordem, das Gutgemeinte gemeiner als der offene Blödsinn, gegen den man früher Opposition oder Abkehr zeigte.
Bereitet den Weg! So will ich adventlich mit Johannes dem Täufer schliessen, der den Menschen damals das Μετανοεῖτε zurief: ändert euren Sinn, eure enge und falsche Art, die Dinge zu sehen, ihr Menschen! Seht die Welt wieder richtig! So wurde für viele das Krumme gerade, die Lüge schwand dahin, Blinde wurden sehend und Lahme gehend. Damals im Menschheitsadvent wurde das allergrößte Urbild des Menschen Gestalt. Im Kleinen passiert das auch beim politischen Aufbruch, den wir erwarten und auf den wir hinarbeiten: die Verblendung durch Reduktionismus, Relativismus, Materialismus, Atheismus, in die wir uns jahrhundertelang grimmig immer tiefer hineingefressen haben, schwindet dahin - immer mehr Blinde nehmen heute die rote Pille und sehen die Dinge, wie sie wirklich sind, und Mutlose schöpfen Kraft und werden aktiv. Und auch diesmal geht es darum, die Natur, auf die hin die Menschen und die Völker angelegt sind, zu erkennen und zu leben. Das ist die aktive Re-Aktion, der wir uns verschrieben haben, weil wir das Lebendige lieben.

Samstag, 27. Mai 2017

Anwendungen mit HTML-UI

HTML - ein UI-Format, das bleiben wird
Zum Beispiel ein Property Editor
Ein Rückblick
Der HTML-Code der Anwendung
Anzeige- und Änderungsmodus
Model View Controller
Buttons
Feldauswahl
Tabellen
Editierbarkeit mit contenteditable
Einen Wert löschen
Die node-webkit-Anwendung
Dateiauswahl
Das Datenmodell - die Klasse Properties
Der Dateivergleich
Unit Tests

HTML - ein UI-Format, das bleiben wird

In klassischen Entwicklungsumgebungen werden dem Anwendungsentwickler meist spezielle Werkzeuge für die Entwicklung der Oberfläche bereitgestellt: er darf aus irgendwelchen standardisierten Paletten Eingabecontrols wie Tabellen, Eingabefelder, Auswahlknöpfe, Schaltflächen auswählen und auf einen Oberflächentwurf ziehen, er darf Beschriftungen und sonstige Texte vorsehen, er darf Bereiche und Feldgruppen definieren, er darf per Mausclick Feldinhalte an sein Datenmodell binden und vom Control ausgelöste Ereignisse mit seinem Code verknüpfen usw.

Solche Werkzeuge sind ja sicher ganz nett (wobei ich meist als erstes auf ihre Unvollkommenheiten, auf schlechte Benutzerführung und auf fehlende Features stoße), aber letztlich muß eine so entworfene Oberfläche in einem maschinenlesbaren Format abgespeichert werden, das die Anwendung nachher zum Rendern benutzt. Die für Entwickler interessante Frage ist daher nicht nach dem UI und den Regeln, die ihm seine Entwicklungsumgebung zum Malen erlaubt, sondern nach der vollständigen Referenz über alle Möglichkeiten, die das konkrete Format, wie derartige Oberflächen dann gespeichert werden, bietet.

Nun gibt es ein maschinenlesbares, lebendiges, sehr flexibles, umfassend dokumentiertes, an Möglichkeiten unglaublich facettenreiches und noch immer weiter wachsendes Format zur Entwicklung von Benutzeroberflächen: es handelt sich um die Sprachtriade HTML, CSS und JavaScript. Durch die mittlerweile weitgehend standardkonforme Implementierung in allen gängigen Browsern haben diese Formate eine breite Basis. Auch auf Kleingeräten haben sie sich längst durchgesetzt. Man kann die CSS-Stilregeln der Oberflächen mit wenig Aufwand so gestalten, daß derselbe HTML-Code je nach Größe des Displays unterschiedlich dargestellt wird. Und wen die Browser-Sandbox zu sehr einschränkt, der kann seine App oder nativ entwickelte Anwendung mit einem HTML-Viewer ausrüsten, um die Oberfläche in seiner eigenen Umgebung zu präsentieren.

Die Webstandards leben und werden weiterentwickelt - die Entwicklungen der letzten Jahre sind ermutigend. HTML5, CSS3 und ES6 werden von den User-Agents dieser Welt mittlerweile doch tatsächlich so verstanden, wie es spezifiziert wurde![3]

Zum Beispiel ein Property Editor

Ich will in diesem Blog eine Anwendung zur Anzeige und Pflege von Property Files vorstellen, wobei ich die vielen kleinen Dinge en detail bespreche, die bei so einer Oberfläche auftreten. Die Entwicklung folgt den ES6-Standards für JavaScript. Die Anwendung kann in einem Browser aufgerufen werden, dann fungiert sie aber als reine Anzeigetransaktion, da ein Browser es nicht erlaubt, Dateien zu sichern. Dieselbe Anwendung - derselbe HTML-,CSS- und JavaScript-Code kann aber auch als node-webkit-Anwendung aufgerufen werden, dann können Daten auch editiert und Änderungen gespeichert werden.

Property Files werden gern als sprachspezifische Textressourcen für eine Anwendung eingesetzt, daher kann man einen Property Editor in der Rubrik Internationalisierung einordnen. Da sie manuell als Klartextdateien bearbeitet werden, ist ein Werkzeug nützlich, das die Schlüssel/Wert-Paare mehrerer Property Files miteinander vergleicht, so dass fehlende oder mehrfach gepflegte Werte schnell erkannt werden.

Hier ein Screenshot der fertigen Anwendung, deren Quelltextdateien ich bei github mit dem Repositorynamen property-editor führe.

Ein Rückblick

Vor sieben Jahren stellte ich auf diesem Blog einige Konzepte für die Pflege von tabellenförmigen Daten in einer Webanwendung vor. Ich hatte dazu einen kleinen, nach wie vor lauffähigen Prototypen verfaßt, an dem die Konzepte sichtbar werden sollten.

Meine Absicht war, ohne irgendwelche magischen Tools und Bibliotheken auszukommen, sondern möglichst direkt die Standards des Webs zu verwenden - und das sind nach wie vor HTML, CSS und JavaScript, weiter nichts - um die Tabellenpflege zu entwerfen. [1]

Die Änderungsvormerkungen (was muss beim späteren Druck auf Sichern geändert, was gelöscht, was eingefügt werden) hatte ich mittels CSS-Klassen direkt im HTML-DOM verwaltet, so daß ein und dieselben dynamisch vergebenen CSS-Markierungen nicht nur beim Sichern vom JavaScript-Code abgegrast werden, um die zu ändernden Daten für den Server zu sammeln, sondern jederzeit auch dem Benutzer den Änderungszustand seiner Daten vor Augen führen:

Die Kommunikation mit dem Server - zum Lesen und Abspeichern der Daten - führte ich damals schon mit dem JSON-Format durch, das mittlerweile in Webanwendungen omnipräsent ist und das etwas schwerfälligere XML weitgehend abgelöst hat.[2]

Das konkrete Datenformat dient als level of indirection dazu, die Benutzeroberfläche zu entkoppeln: auf der Gegenseite stand für meinen Prototypen minimalistisch gehaltener Perl-Code zum Parsen von JSON und zum Verwalten der Daten in einer CSV-Datei. Es könnte aber auch eine ganz andere Implementierung zum Einsatz kommen, in einer anderen Programmiersprache, nicht per CGI oder mit einem anderen Server aufgerufen (tatsächlich läuft die Beispielapplikation mittlerweile nicht mehr auf Apache, sondern auf nginx), mit einem anderen Datenformat für die Persistenzebene usw.

Der HTML-Code der Anwendung

Das Markup der Anwendung definiert feste Bestandteile und Container für dynamisch gefüllte Inhalte.

Durch die Wechselwirkung mit JavaScript verschwimmt die Grenze zwischen "statischem" HTML und HTML-Template. Das ist so gewollt. Wo allerdings JavaScript HTML-Code in größerem Stil generieren soll, weit über bloße Strukturtags hinaus (wie etwa <table>, <tr> und <td> zur Strukturierung von Tabellendaten), empfiehlt sich der Einsatz von Templates. Hierzu wird man in HTML5 durch das neu eingeführte <template-Tag ermutigt. Der Einsatz hochkomplexer Parsergeneratoren wie handlebars ist zweifellos spannend, aber meist überdimensioniert, wo der standardmäßige DOM-Zugriff bereits ausreicht, um konkrete Instanzen des Templates zu erzeugen, in das HTML-DOM zu importieren und einzufügen.

In unserer Beispielapplikation wird kein Template benötigt. Was hier dynamisch erzeugt wird, ist nur die Tabelle mit den Schlüsseln und Werten, ohne ausgefeilte Extras. Mehr zur Tabellendarstellung folgt weiter unten.

Viele überflüssige Schlacken können in HTML5 weggelassen werden, so die Angaben type="text/css" in Stylesheet-Referenzen und type="text/javascript" in JavaScript-Elementen, denn dies sind die Defaults. Worauf man aber nicht verzichten sollte, ist die Angabe der Zeichencodierung. Ausdrücklich warnt das W3C:

You should always specify a character encoding on every HTML document, or bad things will happen. You can do it the hard way (HTTP Content-Type header), the easy way ( declaration), or the new way ( attribute), but please do it. The web thanks you.

Nach dem Laden auszuführendes JavaScript muß überhaupt nicht mehr an Events wie load oder DOMContentLoaded gebunden werden, sondern kann direkt vor das schließende </body>-Element eingebaut werden. Dann ist der HTML-Code bereits vollständig in die DOM-Struktur transformiert, so daß alle gewünschten, die erste Anzeige des Dokuments vorbereitenden Aktionen noch ausgeführt werden können.

Aus diesen Grundsätzen abgeleitet, bekommt das für den Property-Editor benötigte index.html-Dokument schließlich die folgende Gestalt:

<!DOCTYPE html>
<html language="en">
  <head>
   <meta charset="utf-8"/>
   <title>Comparing Property Files</title>
   <link rel="stylesheet" href="main.css" />
   <script src="ui.js"></script>
    <script src="i18n.js"></script>
  </head>
  <body>

    <h1>Comparing Property Files</h1>
   
    <div class="input-area">
      <div>
        <input type="file" multiple id="property-files">
        <label class="button" for="property-files" data-action="choose-files">
          Choose files
        </label>
        <div class="additional-info" id="selected-files">No files selected</div>
      </div>
      <div id="toolbar">
        <button data-action="reload">Reload</button>
        <button data-action="save">Save</button>       
      </div>
    </div>

    <div id="table-container"></div>
  
    <script src="control.js"></script>
  </body>
</html>

Anzeige- und Änderungsmodus

Dasselbe UI soll - als Webanwendung im Browser aufgerufen - ein reines Hilfsmittel zur Anzeige und zum Vergleich von Property Files sein, aber in einer geeigneten Umgebung, die auch das Speichern erlaubt (wie etwa node-webkit), im Änderungsmodus betrieben werden können.

Diese Unterscheidung mache ich, indem ich im Querystring der URL den Wert edit vermerke, also z.B. index.html?edit aufrufe statt bloß index.html. Dieser wird im Client ausgewertet und ist danach als Konstante im gesamten JavaScript control.js verfügbar:

   const editMode       = /\bedit\b/.test(document.location.search)
Den Anzeigemodus erhalte ich, wenn ich die URL ohne Queryteil aufrufe:
http://ruediger-plantiko.net/property-editor/
Dieselbe Webseite präsentiert sich im Änderungsmodus, wenn ich im Queryteil das Wort edit übergebe:
http://ruediger-plantiko.net/property-editor/?edit

Der augenscheinlichste Unterschied, daß man sich im Änderungsmodus befindet, ist die Anwesenheit eines (wenn auch anfangs noch inaktiven) Save-Buttons. Wenn man Property-Files eingelesen hat, zeigen sich weitere Unterschiede: die Zellen sind editierbar, Zellen, Schlüssel und ganze Zeilen sind auch löschbar. Die komplette Oberfläche für den Änderungsmodus funktioniert im Browser - mit der einen, entscheidenden Ausnahme der Save-Funktion. Denn einem Browser ist es nicht erlaubt, Dateien auf dem Computer des Benutzers zu speichern. Das wird nur möglich, wenn wir dasselbe UI in Form einer node-webkit-Anwendung betreiben. Mehr dazu weiter unten.

Diesen Weg - mit dem edit-Parameter im Querystring - habe ich gewählt, weil sich Anzeige- und Änderungsmodus nur geringfügig unterscheiden. Bei größeren Unterschieden würde ich zwei separate HTML-Dokumente entwerfen, eines für den Anzeige-, eines für den Änderungsmodus. Das JavaScript läßt sich trotzdem wiederverwenden, und es kann vom HTML-Dokument den gewünschten Modus als Attribut des <script>-Elements auslesen. Beispielsweise könnte man den Änderungsmodus als Boolesches Attribut data-edit entwerfen (seine Präsenz möge den Änderungsmodus anzeigen):

<script src="control.js" data-edit>
Im Script selbst kann man dann zu Beginn dieses Attribut einlesen (document.currentScript enthält immer das <script>-Element des gerade ausgeführten JavaScript-Codes):
const editMode = document.currentScript.hasAttribute("data-edit")

Model View Controller

Das MVC-Paradigma ist im Grunde nichts weiter als eine praktische Anwendung von separation of concerns. Der Kerm von MVC ist die Trennung der "eigentlichen Logik" (Model) von den für den Betrieb einer Benutzeroberfläche notwendigen Programmteilen (View, Controller).

Für diese Entkopplung ist nicht immer ein ausgefeiltes MVC-Framework nötig: in einfachen Fällen genügt es, die eigentliche Anwendungslogik in ein eigenes UI-freies Softwaremodul zu verlegen, das von einem einzigen Controllermodul control.js aus aufgerufen wird. Dieses Controllermodul ist seinerseits nicht nur mit dem Awendungsmodul, sondern auch mit der konkreten Oberfläche gekoppelt. Es reagiert auf Eingaben und sonstige Dialog-Ereignisse, ruft abhängig von diesen Ereignissen Anwendungslogik auf und aktualisiert dann die Oberfläche, was etwa aufgrund geänderter Anwendungsdaten nötig wird.

Statt einen Ereignisbus als weitere Komponente zu entwerfen, mit dem sich Models und UI-Methoden für "change"-Events registrieren können, kann man im einfachsten Fall die gewünschten Reaktionen auch direkt als Funktionsaufruf implementieren. Eine Funktion eines anderen Moduls aufzurufen, ist immerhin auch eine Benachrichtigung, der Unterschied zum Event besteht allein in der stärkeren Kopplung. Ein Event Bus kann nützliche Dienste zur Entkopplung leisten - vor allem, wenn zur Laufzeit mehrere Models von wechselndem Objekttyp involviert sind. In einfachen Fällen sollte man aber auch einfache Lösungen wählen – hier also die fest verdrahteten Zusammenhänge.

Die Anwendungslogik des Property Editors enthält das Modul i18n. Das Controllermodul heißt control.js. Potentiell wiederverwendbare Funktionen im Bereich des HTML-UI befinden sich im Modul ui.js. Die konkrete Oberfläche selbst besteht aus einem HTML-File index.html und einem CSS-File main.css.

Buttons

Als das entscheidende, einen Button definierende Merkmal dürfte unwidersprochen gelten, daß man ihn drücken kann!

Damit dieses Drücken auch Sinn und Zweck hat, sollte mit dem Druck eine Aktion verbunden sein. Auf HTML-DOM-Ebene bedeutet dies, daß eine Funktion für das click-Event eines Buttons registriert ist. Nun können mehrere Buttons dieselbe Aktion auslösen, z.B. Blätterbuttons, die aus Usability-Gründen oberhalb und unterhalb einer Tabelle angeboten werden.

Um einen Button als für eine bestimmte Aktion zuständig zu erklären, könnte man ihm im HTML-Code ein Custom-Attribut data-action geben (Custom-Attribute sollen immer mit dem Präfix data- versehen werden), das ausdrückt, welche Aktion er auslösen soll. Üblich ist außerdem, Buttons in einem gemeinsamen Bereich, einer Toolbar zu plazieren:

<div id="toolbar">
  <button data-action="reload">Reload</button>
  <button data-action="save">Save</button>        
</div>
Im Controller verknüpfen wir die Aktionen mit ihren Behandlerfunktionen, wobei die eigentliche Realisierung an den allgemeinen UI-Modul ui.js delegiert wird:
// -------------------------------------------------------------------
// Define handlers for user events
// -------------------------------------------------------------------
   function setHandlers() {
     var clickHandlers = {
        "reload": handleReload,
        "save": handleSave
     }
     ui.registerHandlers("click",clickHandlers)
     inputFiles.addEventListener("change",handleChooseFiles)
     
     tableContainer.addEventListener("input",handleInput)
     if (editMode) tableContainer.addEventListener("mouseover",handleOnMouseOver)
     
   }
Hier haben wir eine Funktion setHandlers(), die für alle möglichen User-Events die Behandlerfunktionen definiert - nicht nur für die Buttons, sondern auch für das Dateiauswahlfeld, das hier eine Sonderrolle spielt, für Textänderungen in den Datenzellen, und für das mouseover-Event, wenn der Mauszeiger über Tabellenzellen bewegt wird. Für die Buttons reload und save wird, wie erwähnt, die allgemeine Logik aus ui.js verwendet.

Die allgemeine Funktion registerHandlers bekommt für ein bestimmtes Event, z.B. click, einen JavaScript-Hash von Aktionen und zugeordneten Behandlerfunktionen übergeben. registerHandlers ermittelt aus dem Aktionskey wie save einen CSS-Selector wie [data-action="save"] und verwendet diesen, um alle Elemente zu ermitteln, die für das Event registriert werden sollen. In der Loop über die Elemente wird die Standardfunktion addEventListener benutzt, um für jedes Element die angegebene Behandlerfunktion zu registrieren.

Nun gibt es auch bei der Eventbehandlung gemeinsame Teile. Um Codeduplikationen in den Eventbehandlern zu vermeiden, empfiehlt es sich, diese nicht direkt zu registrieren, sondern einen generischen Callback, innerhalb dessen sie dann aufgerufen werden. Hier ist das die Funktion mainCallback, die hier nur ein elementares Fehlerhandling macht (wenn eine unterwartete Ausnahme austritt, wird der Text dieser Ausnahme in einem alert angezeigt. Dies kann durch eine elaborierte Funktion ersetzt werden, indem man beim Aufruf dem Optionen-Hash eine eigene Funktion mainCallback übergibt.

// ----------------------------------------------------------------------------
// Handle user events ("action"s)
// ----------------------------------------------------------------------------  
  function registerHandlers(event,handlers,opt={}) {

    setDefaultOptions()

    for (let action of Object.keys(handlers)) {
      let elements = getElementsByAction(action,opt.selector)
      if (elements.length) {
        for (let e of getElementsByAction(action,opt.selector)) {
          e.addEventListener(event,evt=>mainCallback.call(e,evt,handlers[action]))
        }  
      } else {
        console.log(`No element found for action ${action}`)
      }
    }    

    function setDefaultOptions() {
      opt.mainCallback = opt.mainCallback || mainCallback
    }

  }  
  
// CSS Selector to return elements for a given action (changeable by module consumer)
  function actionSelector(action) {
    return `[data-action="${action}"]`
  }

// Shorthand to give an array of all elements for an action
  function getElementsByAction(action,selector=actionSelector) {
    return Array.from( document.querySelectorAll(selector(action)))
  }  

// Main callback, wraps all single registered callbacks
// Rewritable by module consumer
  function mainCallback(event,callback) {
     try {
       callback.call(this,event)
     } catch (e) {
       alert(e.message)
     }
  }

Feldauswahl

Eine weitere Eigenschaft von Buttons ist - neben ihrer gleichsam essentiellen Eigenschaft, clickbar zu sein - in manchen Fällen aber gerade nicht clickbar zu sein - oder sogar völlig zu veschwinden. Die Ableitung solcher funktionaler Attribute eines UI-Controls aus dem aktuellen Zustand der Applikation ist die Feldauswahl.

Auch hier gibt es wieder einen speziellen und einen allgemeinen Teil. Um mit dem allgemeinen Teil anzufangen: eine allgemeine Funktion fieldSelection bekommt für disabled bzw. invisible je einen Hash mit der Angabe (als Boolescher Wert), für welche actions der betreffende Zustand zu setzen und für welche er zurückzusetzen ist:

// ----------------------------------------------------------------------------
// Field selection: which fields are disabled, which are invisible
// ----------------------------------------------------------------------------  
function fieldSelection(opt) {  
  evaluateFieldSelection(opt.disabled,(e,state)=>{e.disabled=state})
  evaluateFieldSelection(opt.invisible,(e,state)=>{e.style.display=state?"none":""})
}

function evaluateFieldSelection(actions,setState) {
  if (typeof actions != "object") return
  for( let action in actions) {
    for (let e of getElementsByAction(action)) {
      setState(e,actions[action])
    }
  }
}
Die Regeln selbst sind natürlich anwendungsspezifisch. In unserer Beispielapplikation hängen die Zustände der Buttons nur vom allgemeinen editMode sowie von der Information ab, ob es für irgendeines der angezeigten Property-Files eine Datenänderung (durch den Benutzer) gibt. Diese Funktion fieldSelection() wird im Anschluß am Ende jedes Ereignisbehandlers aufgerufen, der (wenigstens potentiell) die Datenänderung ermöglicht:
// -------------------------------------------------------------------
// Make parts of the UI invisible or disabled, depending on the mode
// -------------------------------------------------------------------
  function fieldSelection() {
    var dataLoss = getDataLoss()
    ui.fieldSelection({
      invisible:{
        "save":!editMode
      },
      disabled:{
        "reload":!tableContainer.querySelector("table"),
        "save":editMode && !dataLoss
      }
    })
    
  }

Tabellen

Die dataTables von Allan Jardine sind unbestritten der Mercedes unter den Tabellenpräsentationen. Sortieren (auch nach mehreren Spalten), Suchen, Filtern, fixierbare Zeilen und Spalten, Blättern, Datenquelle auf dem Client oder Server, editierbare Zellen und formatierbare Zellinhalte: es wäre schön, wenn es eine in den Browser eingebaute, über Standard-Sprachelemente ansprechbare Komponente gäbe, die all das bietet. Aber davon sind wir noch weit entfernt.[4]

Andererseits genügen oft die Standardfunktionen der HTML-<table> für eine einfache Darstellung tabellenförmiger Daten: immerhin gibt es eingebaut bereits Kopf- und Fußzeilen, über Zeilen wie auch über Spalten verbindbare Zellen, Beschriftungen, editierbare Zellen und ein komfortables, auf Tabellendaten zugeschnittenes DOM-API.

Für strukturierte Daten nehmen wir das gute alte Standardbeispiel, einen Umsatzbericht: ein Unternehmen habe in seiner Nordgruppe 15.273 Mio. $, in der Südgruppe nur 10.358 Mio. $ erwirtschaftet. Diese Daten mögen von irgendwoher kommen, z.B. durch einen Ajax-Request vom Server. Dann liegen sie in Form von JavaScript-Daten vor, z.B.

[
  ["North","15.273 M$"],
  ["South","10.358 M$"]
]
Schön wäre nun die Möglichkeit, diese Daten in ein Tabellenobjekt zu übernehmen (das dann in den HTML-DOM eingebunden wird), etwa so:
var t = new ui.Table()
  t.addHeader(["Region","Revenue"])
  t.addData([
    ["North","15.273 M$"],
    ["South","10.358 M$"]
  ])

Nehmen wir ferner an, wir haben einen Bereich (repräsentiert durch ein <div>-Element) als Behälter für eine dynamisch zu erstellende Tabelle, auf den wir im JavaScript mit einer Konstanten tableContainer zugreifen. Dann würden wir die Tabelle mit dieser appendChild().Anweisung präsentieren:

tableContainer.appendChild( t.table )
Mit einer Prise CSS für thead td, tbody td und tbody td:first-child gewürzt, erscheinen die Daten dann wie folgt:

Hier nun der JavaScript-Code für eine Klasse, die das leistet - wir verwenden die Klassen-Syntax von ES6 sowie die eingebauten DOM-API-Funktionen für Tabellen wie insertRow(), insertCell() usw. Die Klasse ist eine Art Scharnier zwischen den Rohdaten und dem Markup für deren Präsentation.

class Table {

  constructor() {
    this.table = createElement("TABLE")
    this.thead = this.table.createTHead()
    this.tbody = this.table.createTBody()
  }

// Expects an array, containing the header texts
  addHeaders(headers) {
     var tr = this.thead.insertRow()
     for (let col of headers) {
       tr.insertCell().textContent = col
     }
     return this
  }

// Expects an array of arrays, containing cell data
  addData(data) {
    for (let row of data) {          
      let tr = this.tbody.insertRow()
      for (let cell of row) {            
        tr.insertCell().textContent = cell
      }
    }
    return this 
  }
}
Mit dieser Klasse ist ein Grundstock gelegt, der sich bei Bedarf erweitern läßt. So genügte es mir schon für diese Anwendung nicht mehr, nur Werte als Tabellendaten zu übergeben: ich wollte auch pro Zelle ein Objekt mit Attributwerten übergeben können, etwa eine oder mehrere CSS-Stilklassen für das <td>-Element. Daher habe ich die Methode addData() wie folgt umgeschrieben:
  addData(data) {
    for (let row of data) {           
      let tr = this.tbody.insertRow()
      for (let cell of row){             
        let td = tr.insertCell()
        if (typeof cell == "object") {
          setAttributes(td,cell)
        } else {
          td.textContent = cell
        }
      }
    }
    return this  
  }
...
// ----------------------------------------------------------------------------
// Set attributes on a (given) element
// ----------------------------------------------------------------------------  
   function setAttributes(e,atts) {
     if (atts) {
       for (let a in atts) {
         if (a=="childNodes") {
           for (let n of atts[a]) e.appendChild(n)
         } else if (a=="textContent" || a=="innerHTML") {
           e[a] = atts[a]   
         } else if (a=="classList") {
           atts[a].forEach(c=>e.classList.add(c))        
         } else {
           e.setAttribute(a,atts[a])
         }
       }
     }
   }
Die Funktion setAttribute(), die hierbei abfiel, ist für beliebige Elemente verwendbar, nicht nur für den konkreten Fall der Tabellenzellen.

Editierbarkeit mit contenteditable

Wenn man einem HTML-Element (hier: den mit <td> beschriebenen Tabellenzellen) das Boolesche Attribut contenteditable gibt, so verwandelt sich ihr textförmiger Inhalt in ein Eingabefeld, wenn der Benutzer darauf klickt. Er kann dann Text eingeben, und standardmäßig wird er bereits in das Element übernommen, wenn der Benutzer seine Eingabe abschließt, indem er beispielsweise den Focus wechselt.

Wenn die Eingaben darüberhinaus noch im eigenen JavaScript-Code weiterverwendet werden sollen, kann man sich für das Ereignis input registrieren, das allerdings nach jeder Eingabe ausgelöst wird, also nach jedem eingegebenen Buchstaben eines Wortes. Ein Ereignis für eine vollständig abgeschlossene Eingabe gibt es nicht (also für den Zeitpunkt, wenn sich das Eingabefeld wieder schließt und das Element wieder in ein reines Textanzeigeelement verwandelt).

In unserer Anwendung geben wir im editMode allen generierten Zellen das Attribut contenteditable. Nach den Benutzereingaben wollen wir die geänderten Texte in das jeweilige Properties-Objekt übernehmen. Dazu registrieren wir uns für das input-Event auf der Ebene des tableContainer-Elements:

tableContainer.addEventListener("input",handleInput)
Nun ist der tableContainer nur ein Bereich, der potentiell mit einer Tabelle gefüllt wird und dann erst editierbare Tabellenzellen enthält. Wir kommen aber mit dieser einen Registrierung auf Ebene des umfassenden Bereichs aus, weil nicht abgefangene Events aufsteigen (bubbling up), bis sie auf einen Ereignisbehandler stoßen. Das erste, was wir daher im Eventbehandler prüfen, ob das originale Element, das das Event ausgelöst hat, wirklich eine Tabellenzelle ist:
// -------------------------------------------------------------------
// The user edited cell content
// -------------------------------------------------------------------
   function handleInput(e) {
     var cell = e.target
     if (cell.nodeName != "TD") return
     // Value before change 
     var oldValue = cell.getAttribute("data-old-value")
     // Current value = value after change
     var newValue = getCellText( cell )
     // Leave if there were no changes     
     if (newValue == oldValue) return
     // Key (first column) or value (subsequent columns) changed?
     if (cell.cellIndex == 0) {
        // Key changed
        if (newValue.match(/\S/)) {
          updateKey( cell )
        }
     } else {
        // Value changed
        var key = getCellText( cell.parentNode.firstElementChild )
        updatePropertyValue(
          cell.cellIndex-1,
          key,
          newValue)
     }    
     // Save this change
     cell.setAttribute("data-old-value",newValue)
     // Mark blank cells   
     cell.classList.toggle("empty",!/\S/.test(newValue))
     // Recompute button states
     fieldSelection()
   }
Danach müssen wir unterscheiden, ob ein Schlüssel (erste Spalte der Tabelle, also cell.cellIndex == 0) oder ein Wert (cell.cellIndex > 0) geändert wurde. Im ersten Fall müssen die in den einzelnen Property-Files angegebenen Werte dem neuen Schlüsselwert zugeordnet werden, während die alte Schlüssel/Wert-Paarung gelöscht wird. Wurde ein Wert geändert, muß dagegen diese Änderung nur in dem betroffenen Property-Objekt nachgezogen werden.

Einen Wert löschen

Das contenteditable-Attribut reicht nicht aus, um dem Benutzer auch die Möglichkeit zu bieten, einen Wert oder eine ganze Zeile von Schlüssel/Wert-Paaren zu löschen. Hierfür sehen wir im editMode ein kleines am rechten Rand der Zelle vor, das als Schaltfläche zum Löschen fungiert.

Die HTML-Struktur einer Zelle, die die Löschfunktion anbietet, ist nun

<td data-old-value="Behalten" title="Defined in row 1" contenteditable="true">
  Behalten
  <div class="delete" contenteditable="false">✖</div>
</td>

Aus Effizienzgründen ist es sinnvoll, die "Verzierung" mit der Löschfunktion erst dann einzubauen, wenn sie auch wirklich benötigt wird, d.h. beim Event mouseover. Wir registrieren also den Behandler

if (editMode) tableContainer.addEventListener("mouseover",handleOnMouseOver)
Wieder prüfen wir, wenn das Ereignis ausgelöst wird, zuerst, ob das auslösende Element wirklich eine Tabellenzelle ist:
  // In change mode, offer the "delete" icon
  function handleOnMouseOver(e) {
    var cell = e.target;
    // Only on table cell level
    if (cell.nodeName != "TD") return
    // If the value is missing anyway, "delete" makes no sense
    if (cell.classList.contains("missing")) return
    // An empty cell requires a real text node as first child
    // Otherwise, the "contentEditable" attribute won't work properly
    if (cell.classList.contains("empty")) setCellText(cell," ")
    // Not if the icon had already been created earlier
    var deleteArea = cell.querySelector(".delete")
    if (!deleteArea) {
      // First mouseover: create it
      deleteArea = document.createElement("div")
      // Mark the div as delete area
      deleteArea.className = "delete"
      // It's not editable, unlike the rest of the cell
      deleteArea.contentEditable = false
      // The icon as unicode symbol: 
      deleteArea.textContent = "✖"
      // Plug it into cell
      cell.appendChild(deleteArea)
      // Attach the "handleDelete" function
      deleteArea.addEventListener("click",handleDelete)
    }    
  }
Wurde das Ereignis wirklich in einer Zelle ausgelöst, so bauen wir das Lösch-Handle ein, falls es nicht bereits existierte (von einem früheren mouseover erzeugt), und registrieren den Behandler handleDelete zur Ausführung des Löschens.

Dieses Lösch-Handle fällt nun etwas aus dem Rahmen: es gehört zwar zu der Zelle, die wir mit contenteditable markiert haben, ist aber selbst nicht editierbar. Es muß also von der Editierbarkeit explizit ausgeschlossen werden. Auch können wir nun den in der Zelle eingegebenen Text nicht einfach mit dem Attribut textContent ansprechen, da dieses Attribut auch die Textinhalte untergeordneter Elemente liefert. Daher brauchen wir eigene Funktionen zum Lesen und Schreiben von Text in den Zellen:

// -------------------------------------------------------------------
// Read a value from a table cell
// -------------------------------------------------------------------
  function getCellText(cell) {
    // Check the first text node only
    var text = cell.firstChild && cell.firstChild.data || ""
    // If the cell is marked empty, the content is ""
    if (!text.match(/\S/) && cell.classList.contains("empty")) return ""
    return text
  }
  
// -------------------------------------------------------------------
// Set a table cell with a value
// -------------------------------------------------------------------
  function setCellText(cell,text) {
    if (cell.childNodes.length == 0 || cell.firstChild.nodeType == Node.TEXT_NODE) {
      var textNode = document.createTextNode(text)
      cell.insertBefore(textNode,cell.firstChild)
    }
    else {
      cell.firstChild.data = text
    }
  }
Was geschieht nun bei Click auf "Löschen"?
// -------------------------------------------------------------------
// Delete one or several key/value pairs
// -------------------------------------------------------------------
  function handleDelete(e) {
    if (!e.target.classList.contains("delete")) return
    var cell = e.target.parentElement
    var row = cell.parentElement
    var key = getCellText( row.firstElementChild )
    var value = getCellText( cell )
    // Does the cell belong to the column of a single properties file? 
    var index = cell.cellIndex
    if (index > 0) {
      // Delete value in a single properties file
      propList[index-1].deleteValue(key,value)
    } else {
      // Delete values of that row from all properties files 
      propList.forEach((p,i)=>p.deleteValue(key,getCellText(row.cells[i+1])))
    }    
    compare(propList)
    e.stopPropagation()
    fieldSelection()
  }
Die Information über die zu löschenden Werte werden ermittelt, danach wird die deleteValue()-Methode der entsprechenden Property-Objekte aufgerufen. Ist dies erfolgt, wird der Vergleich der Property-Objekte neu aufgerufen, und schließlich die Feldauswahl. Das weitere Aufsteigen des Click-Events in der DOM-Hierarchie muß hier unbedingt verhindert werden (mittels e.stopPropagation(), da das Click-Event sonst auch noch den Editiermodus für die betreffende Zelle öffnen würde, wenn es beim <td>-Element angekommen ist.

Die node-webkit-Anwendung

Die JavaScript-Plattform node-webkit (auch unter dem neuen Namen nwjs.io) würde es erlauben, eine Anwendung mit HTML-UI zusammen mit der nodejs-Laufzeit in eine ausführbare Datei zu packen (genauer: je Zielsystem eine, also eine für Windows, eine für Linux, eine für Mac). Diese Lösung finde ich unelegant, da der Hersteller einer Software riesige redundante Datenmengen im Weltnetz herumschleudert: wenn er effizient und ohne Redundanzen entwickelt, benötigt die Logik seiner Applikation vielleicht nur 50 KB, aber die ausführbare Datei kann locker tausendmal so groß werden. Dem steht natürlich der Vorteil gegenüber, daß der Anwender keinen separaten Installationsaufwand hat, da er node und webkit nicht separat installieren muß. Als Vorteil könnte man auch ansehen, daß node und webkit in der ausführbaren Version auf einem festen, eingefrorenen Stand sind. Es kann nicht zu einem Abbruch der Anwendung aufgrund inkompatibler Erweiterungen von node und webkit kommen.

Wie auch immer. Meine bevorzugte Version ist ein Icon nwjs auf dem Desktop, auf das ich per Drag und Drop den Ordner mit meinen Anwendungsressourcen ziehen kann, um sie zu öffnen und auszuführen. Einzig notwendig ist dafür, daß der Ordner ein package.json File mit Angaben für die nwjs-Laufzeit enthält. Wichtigste Angabe ist main, das eine URL für das Start-HTML (das index.html) enthalten muß, mit dem die Applikation beginnt. Dies ist in der Regel eine File-URL, kann aber auch eine http-URL sein. Für eine Anwendung wie diese, deren Ressourcen vollständig aus dem Web geladen werden, genügt es, daß der Ordner die Datei package.json enthält.

So sieht das package.json für den Property Editor aus:

{  
  "name": "propcmp",  
  "main": "http://ruediger-plantiko.net/property-editor/?edit",
  "node-remote": "http://ruediger-plantiko.net",
  "window": {
    "width":1800,
    "height":1200
  }
}
Man kann Angaben zur Fenstergröße, aber auch zum Resizing machen, könnte einen Fenstertitel angeben, weitere Browser-Plugins zulassen u.a.m. Es gibt eine Spezifikation für derartige Package-Files von CommonJS-Anwendungen, allerdings interpretiert nwjs nur einen Teil der dort spezifizierten Felder.

Dateiauswahl

Die Applikation ist eine reine Client-Applikation. Datenquelle ist das Dateisystem. Die Daten, die der Benutzer anzeigen oder bearbeiten will, sind .poperties-Dateien auf seiner Festplatte. Nun ist in Browser das Arbeiten mit dem Dateisystem gewissen Restriktionen unterworfen, aber die Auswahl und das Einlesen von Dateien sind möglich. Was im Browser aber nicht geht, ist das Speichern und die Verwendung von Dateinamen im JavaScript-Layer.

In HTML5 wurde eine File API eingeführt, eine Klasse für dateiartige Objekte, Spezialisierung der Klasse Blob, die beliebige, nicht änderbare Rohdaten repräsentiert. Es können Dateiobjekte mit JavaScript-generiertem Inhalt erzeugt werden, z.B. kann man Graphiken dynamisch generieren und im Browser anzeigen oder zum Download anbieten, ohne daß der Server hierfür etwas tun müßte. Dateiobjekte können auch mit der Klasse FileReader gelesen und ausgewertet werden – und natürlich an den Server hochgeladen werden.

Zur Eingabe von Dateien gibt es das Element <input type="file">. Es ist an den Dateiauswahldialog des jeweiligen Betriebssystems angeschlossen. Mehrfachauswahl ist mit dem Booleschen Attribut multiple möglich. Hat der User seine Auswahl durch Druck auf "Öffnen" bestätigt, löst das Element ein change-Event aus und stellt die ausgewählten Dateien in Form von File-Objekten in seinem DOM-Listenattribut files zur Verfügung. Diese files kann man dann in seinem Ereignisbehandler verwenden.

Leider ist man mit diesem Dateiauswahldialog sehr nah am Betriebssystem, verläßt gleichsam die reine Browser-Ebene. Die Darstellung des Dialogs und des <input type="file">-Elements lassen sich kaum beeinflussen. Das <input type="file">-Element wird wie ein Standardbutton dargestellt, die Zuweisung von Stilklassen für Rahmen, Hintergrundfarbe usw. bleibt wirkungslos.

Die einfachste Lösung für dieses Problem ist, dem Eingabeelement einen <label> zuzuordnen und das Eingabeelement selbst unsichtbar zu machen. Indem das <label>-Element mit dem for-Attribut dem (unsichtbaren) Eingabeelement zugeordnet wird, übernimmt es dessen Funktion (auch bei Click auf den Label erscheint der Auswahldialog, und nach erfolgter Auswahl löst das Eingabeelement das change-Event aus).

Mit diesem Wissen implementiert man also eine Dateiauswahlmöglichkeit im HTML-Dokument wie folgt:

   <div>
     <input type="file" multiple id="property-files">
     <label class="button" for="property-files" data-action="choose-files">
       Choose files
     </label>
     <div class="additional-info" id="selected-files">No files selected</div>
   </div>
Das Element <div class="additional-info" id="selected-files"> soll dabei die Namen der vom Benutzer ausgewählten Dateien anzeigen, es muß bei jedem change aktualisiert werden.

Das <label class="button"> ist dann per CSS so eingerichtet, daß es wie ein Button aussieht (was gar nicht so schlimm gelogen ist, da es ja auch wie ein Button funktioniert):

button, label.button {
    background-color: blue;
    color: white;
    padding: 4px 8px;
    font-weight: bold;
    font-size:11pt;
    margin: 7px 1px;
    border: solid gray 1px;
    cursor:pointer;
}
input[type=file] {
  display:none;
}
Die Registrierung des change-Behandlers erfolgt dann ganz normal über addEventListener:
     const inputFiles     = document.getElementById("property-files")
  ...
  inputFiles.addEventListener("change",handleChooseFiles)
Der Ereignisbehandler selbst liest dann die Dateien ein, stellt sie dar und aktualisiert den Statustext #selected-files:
// -------------------------------------------------------------------
// The user selected some files via button "Choose files"
// -------------------------------------------------------------------
   function handleChooseFiles(evt) {
     var files = Array.from(this.files)
     var status
     if (files.length) {
       status = files.map(f=>f.name).join(',')
       reload(files)
     }
     else {
       status = "No files selected"
     }
     document.getElementById("selected-files").textContent = status      
   }

Die Entwickler von node-webkit haben wegen dieser Unzulänglichkeiten im HTML erwogen, ein eigenes API für die Dateiauswahl zu entwickeln, was natürlich technisch möglich wäre. Letztlich haben sie zugunsten der Standardkompatibilität entschieden, die Dateiauswahl ebenfalls wie die Browser über das Element <input type="file"> zu steuern. Der obige Code verhält sich also in einer node-webkit-Anwendung identisch wie in einem Browser.

Anzumerken ist noch, daß ein File-Objekt im normalen Webmodus aus Sicherheitsgründen die Information über den Pfad der Datei verbirgt. Bekommt die Webseite aber höhere Zugriffsrechte, so enthält das File-Objekt auch ein Attribut path mit dem Dateipfad. Dies ist zum Beispiel der Fall, wenn die Seite als UI einer nwjs-Anwendung eingesetzt wird.

Das Datenmodell - die Klasse Properties

Als Modell für .properties-Dateien verwende ich eine Klasse i18n.Properties. Sie nimmt im Konstruktor einen Dateinamen und einen Array von Textzeilen entgegen, woher auch immer dieser Array kommt. Es gibt also keine Verknüpfung mit der File-Klasse, die Textzeilen könnten auch aus einer <textarea> genommen werden, in die sie der Benutzer manuell eingibt, oder per HTTP-Request von einer entfernten Quelle (z.B. als Konfigurationsdatei für eine Web-Anwendung, die beim Laden gelesen wird). Die Klasse wird darüberhinaus auch von der konkreten Codierung des Zeilenumbruchs unabhängig, die ja je Betriebssystem variieren kann.

Die Textzeilen werden nun einzeln dem Parser vorgelegt, der in einer eigenen Klasse PropertyRow implementiert ist, und durch Instanzen dieser Klasse ersetzt: das ist buchstäblich ein Array.map(), der den Text der Zeile in ein geparsedes Objekt verwandelt.

Mit Hilfe eines regulären Ausdrucks läßt sich der Parser für die .properties-Syntax sehr kompakt notieren:

  parseRow(row) {
    var o = {}
    // Parse text line into structured PropertyRow object
    // Using a regex, which represents the rules
    // - Arbitrary whitespace at the beginning allowed
    // - Followed by a 'key=value' instruction, where key must not contain '#'
    // - Or followed by a '#' and arbitrary more characters ( = comment )
    // - A line consisting only of whitespace is allowed 
    row.replace(
      /\s*(?:(?:([^#=\s]+)\s*=(.*))|#\s*(.*?)\s*$)/,
      (match,key,value,comment)=>
        Object.assign(o, {
          key:key,
          value:value,
          comment:comment
        }))
    if (Object.keys(o).length == 0) {
      o = (/\S/.test(row)) ? { error:true, input:row } : { blank: true, comment: "" }
    }
    if (o.key && !/\S/.test(o.value)) o.empty = true
    return o
  }

Im Konstruktor der Klasse PropertyRow wird das vom Parser erzeugte einfache JavaScript-Objekt in die gerade entstehende Instanz von PropertyRow injiziert:

  constructor(row) {
    if (row!==undefined) {
      Object.assign(this,this.parseRow(row))
    }
  }

Für Zeilen, die ein Schlüssel/Wert-Paar enthalten, werden Schlüssel und Wert als eigene Komponenten key und value fortgeschrieben. Kommentare, erkennbar an ihrer Einleitung mit einem Doppelkreuz #, landen in der Komponente comment. Leerzeilen werden mit dem Booleschen Attribut blank markiert. Ist nur der Wert leer, erhält das PropertyRow-Objekt das Attribut empty.

Zeilen, die nicht dem erlaubten Format entsprechen, werden als fehlerhaft markiert, bleiben aber im Array erhalten, solange ihre Entfernung durch Aufruf der Methode stripErrors() nicht ausdrücklich gefordert wird.

Das Properties-Objekt ist auch modifizierbar. Sobald erstmalig etwas geändert wurde, wird eine Kopie der Instanz erzeugt und im Attribut old gespeichert. Das virtuelle Attribut dataLoss gibt die Information zurück, ob etwas geändert wurde:

//-----------------------------------------------------------------------    
// Have data been changed
//-----------------------------------------------------------------------    
    get dataLoss() {
      return !!this.old
    }
Das Properties-Objekt kann nach den Schlüsseln sortiert werden. Dabei werden Kommentare, die einem Name/Wert-Paar vorangehen, mitsortiert. Eine Präambel aus Kommentaren, die das Dokument einleitet, bleibt auch beim Sortieren am Anfang stehen. Das Ende der Präambel muß allerdings durch eine Leerzeile erkannt werden, da sie sonst mit dem einleitenden Kommentar des ersten Name/Wert-Paars verwechselt werden kann.

Der Dateivergleich

Die Hauptfunktion der ganzen Anwendung ist der Vergleich mehrerer Property Files. Dafür wurde sie auch geschrieben: wenn Property Files für die Ablage sprachabhängiger Texte verwendet werden, ist es nützlich, ein Werkzeug zu haben, das die Texte in den verschiedenen Sprachen vergleicht. Sind die Texte zu einem Schlüsselwert in allen Sprachen gepflegt? Kommen Texte zu einem Schlüssel mehrfach vor (was eigentlich weder erwünscht noch erlaubt ist, aber natürlich passieren kann)?

Für diese Aufgabe gibt es die Funktion i18n.compareProperties(propList). Das Argument propList ist ein Array von Properties-Objekten. Das Ergebnis ist eine nach Schlüsseln sortierte Tabelle (als Array von Arrays), mit den Schlüsselwerten als erster Spalte und danach einer Spalte für jedes der übergebenen Properties-Objekte. Kommen Schlüssel mehrfach vor, so werden zu diesem Schlüssel mehrere Zeilen erzeugt - gerade soviele, um alle Vielfachheiten in allen Properties-Objekten darzustellen.

In jeder Zelle ab der zweiten Spalte wird ein JavaScript-Objekt übergeben, das im Attribut value den Wert und in title einen Kommentar (z.B. den Hinweis, in welcher Zeile der Datei dieser Eintrag gefunden wurde) enthält. Enthält der Wert nur Leerzeichen, so ist das Boolesche Attribut empty gesetzt. Fehlt zum Schlüssel dieser Zeile ein Wert, so ist das Boolesche Attribut missing gesetzt (das kann auch so sein, wenn für einen Schlüssel in einem Dokument mehrere Werte existieren, in einem anderen nur einer).

Die Übergabestruktur ist nicht HTML-spezifisch, die Funktion könnte daher auch in völlig anderen UIs verwendet werden.

Unit Tests

Um das Modul i18n mit Unit Tests abzusichern, verwende ich das Testframwework Mocha in Kombination mit der Chai Assertion Library (in seinem "klassischen" TDD flavour).

Mocha läßt sich sowohl als Kommando unter nodejs aufrufen, als auch im Web in einer Testseite. Am Anfang meines Testfiles i18n.test.js kann ich die Tatsache, ob es gerade im Desktop unter nodejs oder im Browser in der Testrunner-Seite aufgerufen wird, daran, ob die globale Variable window existiert (Browser) oder nicht existiert (Desktop). Je nach Umgebung lade ich das zu testende Modul i18n mittels nodejs, oder weiß bereits, daß es existiert (weil es in der Testseite via <script> includiert wurde).

// Setup the test frameworks, depending on environment
if (typeof window == "undefined") {  
  // My desktop environment (mocha / nodejs)
  let mut = process.env.MODULE_UNDER_TEST
  i18n = require(mut).i18n
  assert = require('chai').assert
} else {  
  // Browser (via testrunner page)
  i18n = window.i18n
  assert = chai.assert
}
Im Editor UltraEdit habe ich mir einen Menüpunkt make test konfiguriert, der genau dieses Kommando im aktuellen Verzeichnis aufruft. Die Aktion test ist im Makefile wie folgt definiert:
test:
 @H:/uedit32/tools/nodejs-test.bat H:/Documents/i18n/i18n.js
.PHONY: test
Das Batchfile nodejs-test.bat, auf das ich mich hier beziehe, enthält folgende Anweisungen:
@echo off
set NODE_PATH=C:/Program Files/nodejs/node_modules
set MODULE_UNDER_TEST=%1
"C:/Program Files/nodejs/node_modules/.bin/mocha" -u tdd
Im Ultraedit werden mir nun während des Entwickelns die Ergebnisse der Unit Tests im Ausgabefenster angezeigt:

Ich kann aber auch diese HTML-Testseite im Browser aufrufen, dort kann ich mit der Developer Toolbar den Code auch debuggen:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title>Property Files - Unit Tests</title>
    <link rel="stylesheet" type="text/css" href="mocha.css">
  </head>
  <body>
  <h1>Property Files - Unit Tests</h1>
  <div class="samples">   
    <div id="mocha"></div>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/mocha/3.4.1/mocha.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/chai/3.5.0/chai.min.js"></script>

    <!-- Code to test: -->
    <script src="../i18n.js"></script>
    <!-- Test files: -->
    <script>
      mocha.setup("tdd")
    </script>
    <script src="i18n.test.js"></script>
    <script>
      mocha.run();
    </script>
  </body>
</html>
Hier ist der Link auf die Testrunnerseite
http://ruediger-plantiko.net/property-editor/test/
Die Resultatseite erscheint so in einem Chrome Browser:

Fußnoten

[1] Lediglich dem JavaScript mußte ich in jener Zeit noch mit dem Framework Prototype etwas auf die Beine helfen, und auch nur, um es flüssiger und lesbarer zu machen - inzwischen sind auch solche Frameworks, auch das verbreitete jQuery, weitgehend überflüssig.
[2] Wobei XML weiterhin bleiben wird, es hat seine ganz besonderen Stärken wie Typsicherheit dank XML Schema und die gute Transformierbarkeit in andere Formate dank XSLT. Behalten wir seine Nähe zu HTML im Hinterkopf - und daß es auch in allen gängigen Browsern nativ unterstützt wird.
[3] Selbst das Sorgenkind IE/Edge ist mittlerweile zu einem tolerierbaren Erwachsenen herangewachsen, über dessen Leistungen man zwar nicht in Begeisterungsstürme verfällt, aber der immerhin seine Arbeit mehr oder weniger befriedigend macht.
[4] Soweit ich das überblicke, scheint es noch nicht einmal einen Working Draft für eine solche Komponente zu geben.