; ═════════════════════════════════
; копировать в буфер обмена случайный участок текста
; Например есть текст:
; В лесу родилась елочка, в лесу она росла. Зимой и летом стройная - всегда она была.
; Нужно получить в буфер случайный кусок этого текста:
; Например : елочка, в лесу
; Условие - что бы скопированный текст был не более 4x cлов
; (А лучше что бы можно было регулировать в какой-то переменной количество слов)
; ═════════════════════════════════
#pragma compile(UPX, True)
#pragma compile(x64, False)
#pragma compile(Console, True)
#pragma compile(FileDescription, 'Случайный участок текста')
; ───────────────────────────────
Opt('MustDeclareVars', True)
; ───────────────────────────────
#include <AutoItConstants.au3>
#include <FileConstants.au3>
#include <MsgBoxConstants.au3>
#include <StringConstants.au3>
; ───────────────────────────────
Local Const _
$csRExp = '(*UCP)(?isU)(\b\w+\b\W*?)+', _ ; считаем словом всё, что хотя бы одна буква + пробел(ы)/знак(и) препинания
$ciMax = 4
Local _
$sText = 'В лесу родилась елочка, в лесу она росла. Зимой и летом стройная - всегда она была.', _
$vRes, _ ; рез-т разбора по регэкспу
$sExtract, _ ; выжимка из текста
$sOutput, _ ; cообщение в MsgBox
$iErr, $iErx, _ ; для сохр. @error и @extended
$i, $j, $k, $iRC = 0 ; традиционные индексы и код возврата
$vRes = StringRegExp($sText, $csRExp, $STR_REGEXPARRAYGLOBALMATCH)
$iErr = @error
$iErx = @extended
If $iErr Then
$sOutput = StringFormat('Облом разбора входного текста\n@error = %d, @extended = %d', $iErr, $iErx)
MsgBox($MB_ICONERROR, @ScriptDir, $sOutput)
Exit
EndIf
;
$k = UBound($vRes) ; макс. возможный порядковый № слова для выбора
Do
$i = Random(1, $k, 1) ; порядковый № первого выбираемого слова, целое > 0
$j = Random(1, $ciMax, 1) ; кол-во выбираемых слов
$sExtract = i_SelWords($vRes, $i, $j) ; делаем выборку
ClipPut($sExtract)
$sOutput = StringFormat('From = %u, Count = %u\nResult = "%s"', $i, $j, $sExtract)
$iRC = MsgBox (BitOR($MB_ICONINFORMATION, $MB_OKCANCEL), @ScriptName, $sOutput)
Until $iRC = $IDCANCEL
Exit
;
#cs
────────────────────────────────
Выбор из массива заданного кол-ва идущих подряд элементов с указанной позиции.
Если всё нормально, выдаёт строку с заданным кол-вом слов,
если что-то пошлО не так — то пустую строку и устанавливает ненулевой код ошибки
────────────────────────────────
#ce
Func i_SelWords(ByRef Const $paWords, _ ; исходный массив, в нашем случае — отдельных слов
$pi1_st, _ ; порядковый номер первого выбираемого эл-та (1+)
$piCount _ ; кол-во выбираемых эл-тов (1+)
)
Local _
$sResult = '', _ ; результат выборки
$iLast, _ ; номер последнего выбираемого
$iLastMax, _ ; длина массива
$i ;
; Минимальная «защита от дурака»:
; – источник д.б. массивом
; – нач. порядковый № выбираемого слова д.б. числом > 0
; – кол-во выбираемых слов тоже д.б. числом > 0
;
If Not IsArray($paWords) Then Return SetError(1, 0, $sResult)
If Not IsNumber($pi1_st) Or ($pi1_st < 1) Then Return SetError(2, 0, $sResult)
If Not IsNumber($piCount) Or ($piCount < 1) Then Return SetError(3, 0, $sResult)
;
$iLast = $pi1_st + $piCount - 1 ; порядковый № посл. выбираемого слова
$iLastMax = UBound($paWords) ; кол-во слов в массиве
;
For $i = $pi1_st To $iLast
If $i > $iLastMax Then ExitLoop ; защита от вылета за пределы массива
$sResult &= $paWords[$i-1] ; дополнить рез-т очередным словом
Next
Return $sResult
EndFunc ; ===> i_SelWords
; ══════════════════════════════