Es kommt etwas kleines - Lesezeit

Geöffnet als Baustelle! ;) Umbauarbeiten erfolgen noch über einige Bereiche!
Bild Lizenzfrei

Damit wir an dieser Stelle direkt eines klarstellen: Die Idee zur Umsetzung dieser Funktion habe nicht erst gehabt, als ich die entsprechenden Plugins von Marcel Beckers oder eben Krymonota gefunden habe, sondern als ich mir mal medium.com angesehen habe, die entsprechend die Lesezeit angeben. Ich habe natürlich dann im Plugin-Store nachgesehen, ob es eine entsprechende Funktion gibt und siehe da: So eine Funktion ist direkt mit Kosten verbunden. Gut 1,99 € sowie 4,99 € sind jetzt nicht die Welt, das Problem ist aber, dass diese 1,99 sowie 4,99 für die unterstützen Produkte jeweils fällig werden und das Forum ist überhaupt nicht mit dabei, ich hätte also Geld ausgeben müssen und doch auch wieder etwas Eigenes entwickeln müssen und da kann ich auch gleich die Artikel hier mit abdecken.

Ein wenig Magie, der Rest ist Fleiß

Für uns Menschen ist es relativ einfach Wörter zuzählen, in einem Programm ist das etwas kniffliger und es gibt auch verschiedene Vorgehensweisen, die am Ende auch unterschiedliche Ergebnisse liefern.


Beim ersten Weg werden einfach die Leerräume zwischen den Wörtern gezählt, das funktioniert zuverlässig, kann aber dazu führen, dass man mehr Wörter am Ende erhält, als wirklich dastehen:

Dieser Satz ergibt in Word zu 100 % 10 Wörter. Das %-Zeichen wird mit gezählt. Gut, man könnte nun darüber streiten, ersetzt man das Prozentzeichen durch ein Fragezeichen sind es immer noch zehn Wörter. Ähnlich verhält es sich mit dem Bindestrich: Dieser-Satz-würde-als-ein-Wort-gelten.


Geht man nun in die Linguistik, dann verbindet der Bindestrich zwar zwei Wörter, aber es sind immer noch zwei Wörter: Bedienelement ist ein Wort, Bedien-Element sind zwei Wörter. Nutzt man nun einen Unterstrich, dann gilt es wiederum als ein Wort. Komplizierte Regeln!


Entsprechend ist auch die Empfehlung für eine zuverlässige Wortzählung, dass man nicht die Freiräume ermittelt, sondern wirklich die Worte. Nur woraus besteht ein Wort? Die einfachste Definition ist: Buchstaben. Damit würde man aber heute so etwas t0ll3s wie 8e55er auch nicht mehr erkannt werden. Genau so wäre 77 ein Wort, also bestehen Wörter aus Buchstaben und Zahlen und man zählt eben wirklich wie viele Buchstaben und Zahlen gibt es in Kombination.


Natürlich gibt es in Programmiersprachen Buchstaben und Zahlen, die das Programm so nicht kennt, einfach die Wörter zu prüfen ohne kleinen Trick würde spätestens bei den deutschen Umlauten scheitern, auch wenn PHP dafür entsprechende Funktionen mit bringt, nur die arbeiten eben nicht zuverlässig und bei langen Texten benötigt es auch recht lange. Die Lösung ist ein einfacher regulärer Ausdruck: [\p{L}\p{N}][\p{L}\p{N}]*.

Es bleibt aber kostenintensiv - Akt in 3 Teile

Auch mit diesem einfachen regulären Ausdruck benötigt die Ermittlung der Anzahl der Wörter dennoch ein wenig Zeit und in dem Fall auch Arbeitsspeicher, weil ein Array mit allen Wörtern gebildet wird. Auf einem AMD Ryzen 2700X benötigt der Durchlauf für einen Artikel mit 10.000 Wörtern (60.000 - 70.000 Zeichen) ca. 0,1 Sekunde - die RAM-Werte liefere ich euch nach. Die Wörter sollten also nicht bei jedem Seitenaufruf durch die Nutzer gezählt werden, das führt nämlich schnell zu einer langsamen Seite. In der Regel werden 20 Artikel angezeigt, würde man nun jedes Mal die Wörter zählen, wären das 20 × 0,1 Sekunde, also 2 Sekunden!


Um also die Seite beim Aufruf möglichst nicht zu belasten, werden die Wörter beim Erstellen oder Bearbeiten eines Inhaltes gezählt. Auf der Startseite übernimmt dann ein kleines Templateplugin die Arbeit und die Formel hier ist einfach nur: Anzahl der Wörter geteilt durch Anzahl der Wörter pro Minute. A / B = Lesezeit.


Der letzte Teil des Puzzles war es dann noch herauszufinden, an welcher Stelle ich mich in den WSC - WBB - Code einklinken muss, damit ich die Wörter zählen kann. Der letzte Teil des Puzzles war es dann noch herauszufinden, an welcher Stelle ich mich in den WSC - WBB - Code einklinken muss, damit ich die Wörter zählen kann. Ein wenig tricky, am Ende läuft es aber darauf hinaus, dass ich mich in die *DatabaseAction einklinke und nach create oder update die Wörter des Inhalts zähle. Hat man das einmal verstanden, ist der Rest für jeden anderen Inhalt eigentlich nur noch Copy & Past.


Da ich Open-Source-Verfechter bin, werde ich das Paket natürlich kostenlos anbieten. Sehe ich mir allerdings auch die aktuellen Verkaufszahlen der Konkurrenz an, so scheint das Interesse nicht wirklich groß zu sein, sodass sich ein Verkauf auch nicht lohnen würde. Für 1,99 € ist die Lesezeitschätzung von Marcel Beckers gerade einmal zweimal verkauft worden und für diesen Preis müsste ich - damit es sich wirklich rechnen würde - knapp 290 Verkäufe erreichen, das ist zum jetzigen Zeitpunkt eher unrealistisch. Daher: wie immer Open-Source.

Viele Worte, wenig Sinn, die Vorstellung kommt hier hin!

So, nach so viel Text kommen wir nun zu dem eigentlichen Plugin und wie ihr sehen könnt, ist es hier bereits installiert: Bei Artikeln und bei Themen wird ein entsprechender Badge angezeigt:

Badge - Kurzer Text Artikel - Lesezeit lang.

Euch sollte dabei gleich eine Kleinigkeit auffallen: Der Badge ist nicht immer grün, sondern kann auch einmal rot sein! Ich habe eine Funktion eingebaut, die es ermöglicht auch grob zu kategorisieren. Grün steht dabei für kurze Texte - hier bis zu 5 Minuten. Orange für mittellange Texte - hier bis zu 10 Minuten und alles, was darüber liegt, in der Lesezeit wird rot dargestellt.


Ebenso könnt ihr auswählen, ob eben ein Badge verwendet wird oder ein Icon.

Natürlich seht Ihr an dieser Stelle auch die weiteren Optionen:

  • Hier könnt für Artikel oder eben Themen die Lesezeit deaktivieren.
  • Ob ein Icon oder ein Badge verwendet werden soll.
  • Die Anzahl der gelesenen Wörter pro Minute global.
  • Wie viele Minuten ein kurzer sowie eben ein mittellanger Text maximal haben dürfen

Noch bin ich nicht ganz fertig, aber jetzt am Wochenende möchte ich durchaus die erste Beta-Version veröffentlichen. Sobald das Plugin dann halbwegs stabil ist und ich eventuell ein paar zusätzliche Wünsche umgesetzt habe, kommt die Veröffentlichungen im WoltLab Plugin Store.