Загрузка данных


#Requires AutoHotkey v2.0

global TextToType := ""
global IsPaused := false
global IsStopped := false

global CharDelay := 40       ; задержка между символами, мс
global WordPause := 500      ; пауза после блока слов, мс
global LinePause := 900      ; пауза после новой строки, мс
global WordsPerPause := 3    ; после скольких слов делать паузу

F6::StartTyping()
F7::TogglePause()
F8::StopTyping()

MyGui := Gui()
MyGui.Title := "Code Auto Typer"

MyGui.AddText(, "Вставь код:")
InputText := MyGui.AddEdit("w650 h300 vInputText")

MyGui.AddText(, "Задержка между символами, мс:")
MyGui.AddEdit("w100 vCharDelay", "40")

MyGui.AddText(, "Пауза после блока слов, мс:")
MyGui.AddEdit("w100 vWordPause", "500")

MyGui.AddText(, "Пауза после новой строки, мс:")
MyGui.AddEdit("w100 vLinePause", "900")

MyGui.AddText(, "Пауза после каждых N слов:")
MyGui.AddEdit("w100 vWordsPerPause", "3")

MyGui.AddButton("w100", "Start").OnEvent("Click", StartTyping)
MyGui.AddButton("x+10 w120", "Pause/Resume").OnEvent("Click", (*) => TogglePause())
MyGui.AddButton("x+10 w100", "Stop").OnEvent("Click", (*) => StopTyping())

MyGui.AddText("xm y+15", "F6 = Start")
MyGui.AddText(, "F7 = Pause/Resume")
MyGui.AddText(, "F8 = Stop")

MyGui.Show()

StartTyping(*) {
    global MyGui, TextToType, IsPaused, IsStopped
    global CharDelay, WordPause, LinePause, WordsPerPause

    Data := MyGui.Submit(false)

    TextToType := Data.InputText
    CharDelay := Integer(Data.CharDelay)
    WordPause := Integer(Data.WordPause)
    LinePause := Integer(Data.LinePause)
    WordsPerPause := Integer(Data.WordsPerPause)

    if TextToType = "" {
        MsgBox "Сначала вставь текст."
        return
    }

    IsPaused := false
    IsStopped := false

    MsgBox "После OK у тебя будет 3 секунды, чтобы кликнуть в нужное поле."

    Sleep 3000

    wordCount := 0
    currentWord := ""
    atLineStart := false

    Loop Parse TextToType {
        if IsStopped {
            break
        }

        while IsPaused {
            Sleep 100
        }

        char := A_LoopField

        ; Игнорируем carriage return
        if char = "`r" {
            continue
        }

        ; Новая строка
        if char = "`n" {
            Send "{Enter}"
            Sleep LinePause
            wordCount := 0
            currentWord := ""
            atLineStart := true
            continue
        }

        ; После новой строки пропускаем пробелы и табы из исходного текста,
        ; потому что PyCharm / VS Code / IDE уже сама делает отступ
        if atLineStart && (char = " " || char = "`t") {
            continue
        }

        atLineStart := false

        SendText char
        Sleep CharDelay

        ; Считаем слова по разделителям
        if IsWordSeparator(char) {
            if currentWord != "" {
                wordCount += 1
                currentWord := ""

                if wordCount >= WordsPerPause {
                    Sleep WordPause
                    wordCount := 0
                }
            }
        } else {
            currentWord .= char
        }
    }
}

IsWordSeparator(char) {
    return char = " "
        || char = "`t"
        || char = "."
        || char = ","
        || char = ";"
        || char = ":"
        || char = "("
        || char = ")"
        || char = "{"
        || char = "}"
        || char = "["
        || char = "]"
}

TogglePause() {
    global IsPaused
    IsPaused := !IsPaused
}

StopTyping() {
    global IsStopped, IsPaused
    IsStopped := true
    IsPaused := false
}