Speed Reading mit AutoIt

  • Diskussion zum Thema

    Skript
    [autoit]

    #NoTrayIcon

    [/autoit] [autoit][/autoit] [autoit]

    Global Const $GUI_ENABLE = 64
    Global Const $GUI_DISABLE = 128

    [/autoit] [autoit][/autoit] [autoit]

    Global $oIE, $Form1, $btnStart, $btnPause, $inputWPM, $editText, $b = False, $nWPM, $aWords, $iWord = 0, $iTimer = -1
    Global $sHTML = '<center style="font-family: Courier New;font-size: 24px"><span id="text">%%</span></center>'

    [/autoit] [autoit][/autoit] [autoit]

    $oIE = ObjCreate("Shell.Explorer.2")
    If @error Then Exit MsgBox(16, "Error", "Sorry, but you need to have the 'Shell.Explorer.2' object installed to use this program.")

    [/autoit] [autoit][/autoit] [autoit]

    $Form1 = GUICreate("AutoIt Speed Reading Demo", 400, 320)
    GUICtrlCreateObj($oIE, 20, 20, 360, 80)
    GUISetFont(10, 1000, 0, "Courier New")
    $btnStart = GUICtrlCreateButton("Start", 20, 120, 80, 20)
    $btnPause = GUICtrlCreateButton("Pause", 110, 120, 80, 20)
    GUICtrlSetState($btnPause, $GUI_DISABLE)
    $inputWPM = GUICtrlCreateInput("", 200, 120, 180, 20)
    GUICtrlSendMsg($inputWPM, 0x1501, 0, "Words / Minute")
    $editText = GUICtrlCreateEdit("The quick brown fox jumps over the lazy dog.", 20, 150, 360, 130)
    $labelInfo = GUICtrlCreateLabel("", 20, 290, 360, 20)
    GUISetState(@SW_SHOW, $Form1)

    [/autoit] [autoit][/autoit] [autoit]

    $oIE.navigate("about:blank")
    Sleep(10)
    UpdateHTML("Hello World!")

    [/autoit] [autoit][/autoit] [autoit]

    Do
    Switch GUIGetMsg()
    Case -3
    ExitLoop
    Case $btnStart
    If $b Then
    _Stop()
    Else
    ParseText()
    _Start()
    $iWord = 0
    GUICtrlSetData($btnStart, "Stop")
    GUICtrlSetState($btnPause, $GUI_ENABLE)
    $b = True
    EndIf
    Case $btnPause
    If $b Then
    AdlibUnRegister("DisplayNextWord")
    GUICtrlSetData($btnPause, "Resume")
    $b = False
    Else
    _Start()
    GUICtrlSetData($btnPause, "Pause")
    $b = True
    EndIf
    EndSwitch
    Until False
    AdlibUnRegister("DisplayNextWord")
    $oIE = 0
    Exit

    [/autoit] [autoit][/autoit] [autoit]

    Func _Start()
    $nWPM = Number(GUICtrlRead($inputWPM))
    If ($nWPM < 60) Then $nWPM = 250
    AdlibRegister("DisplayNextWord", Floor(60000/$nWPM))
    If ($iTimer < 0) Then $iTimer = TimerInit()
    EndFunc
    Func _Stop()
    AdlibUnRegister("DisplayNextWord")
    GUICtrlSetData($labelInfo, StringFormat("You just read %d word(s) in %s!", $iWord, _FormatSeconds(TimerDiff($iTimer)/1000)))
    $iTimer = -1
    GUICtrlSetState($btnPause, $GUI_DISABLE)
    GUICtrlSetData($btnStart, "Start")
    $b = False
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func ParseText()
    Local $text = GUICtrlRead($editText), $i, $a, $b
    Local $html = '\1<span style="color: #FF0000;">\2</span>\3'
    $aWords = StringRegExp($text, '("?[\wÄäÖöÜüß]+[,.:;!?-]*"?)', 3)
    For $i = 0 To UBound($aWords)-1
    $a = StringRegExp($aWords[$i], "[A-Za-zÄäÖöÜüß]+", 3)
    If (Not @error) Then
    $a = $a[0]
    If (StringLen($a) > 2) Then
    $b = getORPIndex($a)
    $aWords[$i] = StringReplace($aWords[$i], $a, StringRegExpReplace($a, '^(.{' & $b & '})(.)(.*)$', $html), 1, 1)
    EndIf
    EndIf
    Next
    EndFunc
    Func getORPIndex($s)
    Local $l = StringLen($s)
    If ($l = 1) Then Return 0
    If ($l = 2) Then Return 1
    If ($l = 3) Then Return 1
    Return Floor($l / 2) - 1
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func UpdateHTML($sContent)
    $oIE.document.body.innerHTML = StringReplace($sHTML, "%%", $sContent)
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func DisplayNextWord()
    UpdateHTML($aWords[$iWord])
    $iWord += 1
    If ($iWord >= UBound($aWords)) Then _Stop()
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _FormatSeconds($n)
    If ($n > 86400) Then
    Return Round($n/86400, 2) & " day(s)"
    EndIf
    If ($n > 3600) Then
    Return Round($n/3600, 2) & " hour(s)"
    EndIf
    If ($n > 60) Then
    Return Round($n/60, 2) & " minute(s)"
    EndIf
    Return Round($n, 2) & " second(s)"
    EndFunc

    [/autoit]

    AutoIt Version (Prod): 3.3.14.2

    AutoIt Version (Beta): 3.3.9.5

    ausgewählte Skripte: Chatbot, komplexe Zahlen (UDF)

    2 Mal editiert, zuletzt von James (17. März 2014 um 19:18)

  • > Es fehlt noch eine Anpassung der Anzeigezeit an die Länge der Wörter
    > iReadFast verwendet z.B. ein Flackern (in etwa wie in eine, GuiCtrl ohne Double-Buffer) um das eigentliche Lesen von Wörtern zu verhindern, damit kann man sogar noch schneller lesen. Ich weiß nicht, wovon dieses Flackern abhängig gemacht wird, aber es wäre auch noch eine Idee ;)

    Sonst: Gut, dass es das gibt!

  • Es fehlt noch eine Anpassung der Anzeigezeit an die Länge der Wörter

    Macht das überhaupt einen Unterschied?

    iReadFast verwendet z.B. ein Flackern (in etwa wie in eine, GuiCtrl ohne Double-Buffer) um das eigentliche Lesen von Wörtern zu verhindern, damit kann man sogar noch schneller lesen. Ich weiß nicht, wovon dieses Flackern abhängig gemacht wird, aber es wäre auch noch eine Idee ;)

    Sollte sich das ändern baue ich das natürlich gerne noch ein, sollte mit ein bisschen JavaScript ja kein großes Problem sein.

  • Nicht schlecht, wenns auch hier und da noch hakt. Z.B. mit Umlauten kommt das Programm gar nicht klar. Ein Wort wie Büro wird in die Teile B und ro getrennt. So ist das Programm für deutsche Texte leider nicht wirklich nützlich.

    Macht das überhaupt einen Unterschied?

    Ja, auf jeden Fall. Ich habe mir einen Artikel von Siegel Online anzeigen lassen. Darin kam folgender Satz vor:
    Von hier sind es nur wenige Schritte bis zum Regionalparlament, wo die
    Anhänger eines Anschlusses der Halbinsel an das Nachbarland die
    russische Fahne gehisst haben.

    Das Wort Regionalparlament kann ich mit deinem Script nicht lesen, einerseits, weil es sehr lang ist, andererseits weil es auf das kurze Wort zum folgt, und zumindest bei mir die Augen einen großen Sprung zum anfänglichen R von Regionalparlament machen und so praktisch keine Zeit mehr bleibt, einen Blick auf das Wort zu werfen.

  • Nicht schlecht, wenns auch hier und da noch hakt. Z.B. mit Umlauten kommt das Programm gar nicht klar. Ein Wort wie Büro wird in die Teile B und ro getrennt. So ist das Programm für deutsche Texte leider nicht wirklich nützlich.

    Und das passiert, wenn man das Programm nur mit englischen Texten testet. Wird natürlich sofort geändert, danke für den Tipp.

    Anpassung der Anzeigezeit an die Länge der Wörter

    Wenn ihr mir sagt wie ihr euch das genau vorstellt (wie viel langsamer das Wort dargestellt werden soll) baue ich das demnächst ein.

  • Der Duden sagt, der Gesamtdurchschnitt der Länge seiner Wörter sei 5,7. Das könnte man als Grundwert nehmen.

    Angepasste Anzeigezeit = (Normale Anzeigezeit / 5.7) * Länge des Wortes

  • Gefällt mir, habe für mich ein paar kleinigkeiten umgestellt, wie z.b. meine WPM von 600, mit der ich am besten zurecht komme...
    Was noch cool wäre, wenn man die Zeit stoppt, wie lange man benötigt diesen Text zu lesen, ich glaube ich bastel mir da auch noch etwas herum, wenn ich darf? :)

    Finde dieses SpeedReading echt interessant und muss auch sagen das es auch für lange Texte praktisch sein kann.. ;)

  • Gefällt mir, habe für mich ein paar kleinigkeiten umgestellt, wie z.b. meine WPM von 600, mit der ich am besten zurecht komme...

    Genau dafür ist das Eingabefeld neben den Buttons, 250 ist nur der Standardwert.

    Was noch cool wäre, wenn man die Zeit stoppt, wie lange man benötigt diesen Text zu lesen, ich glaube ich bastel mir da auch noch etwas herum, wenn ich darf? :)

    Klar, aber das wollte ich sowieso noch einbauen. Das mache ich wenn ich nachher aus der Schule zurückkomme. Dann wahrscheinlich ähnlich wie bei Squirt: "You just read x words in y {optimale Zeiteinheit}!"

    Edit:
    Die "Stoppuhr" habe ich jetzt eingebaut, der Rest folgt gegen Ende der Woche, da ich dafür das Skript etwas umstrukturieren muss.

    AutoIt Version (Prod): 3.3.14.2

    AutoIt Version (Beta): 3.3.9.5

    ausgewählte Skripte: Chatbot, komplexe Zahlen (UDF)

    Einmal editiert, zuletzt von James (17. März 2014 um 19:19)