Имя пользователя:
Пароль:
 

Показать сообщение отдельно

Аватара для Creat0R

Must AutoIt


Сообщения: 3054
Благодарности: 1009

Профиль | Сайт | Отправить PM | Цитировать


amel27
Цитата Creat0R:
нужно по RegExp подобрать условия замены (на основе нашего текста), чтобы получить в результате нужное количество сдвигов влево »
Вот оно! Сделал (после 3-ёх часов экспериментирования ):

Код: Выделить весь код
Func GetLeftJumps($Text)
    StringRegExpReplace($Text, '\n', '')
    Local $Extended = @extended

    $Text = StringStripWS($Text, 3)

    $Text = StringRegExpReplace($Text, '\s+|\t+', ' ')
    $Text = StringRegExpReplace($Text, '~|`|!|#|%|\^|&|\*|\(|\)|-|\+|=|\{|\}|''|"|;|:|/|\\|<|>|\?|,|\[|\]|ч|Ч|ё|Ё', '|')
    $Text = StringRegExpReplace($Text, '\|+', '|')
    If StringIsASCII($Text) Then $Text = StringRegExpReplace($Text, '\.', '|')

    Local $WordsCountArr = StringRegExp($Text, "[\s\.:;,]*([а-яА-Яa-zA-Z0-9-_]+)[\s\.:;,]*", 3)
    StringRegExpReplace($Text, '\|', '')
    Return $Extended + @extended + UBound($WordsCountArr)
EndFunc
Возможно это сделать и более короче, но я умею только так, а глвавное - оно работает!
Есть конечно пару(?) недостатков - к примеру, если выделить текст посредине общего текста, то выделяться будут и все предыдущие символы, идущие подряд до первого символа в выделенном тексте.

Вот полное применение + использование твоего примера:

Код: Выделить весь код
#NoTrayIcon

Global $objASC = ObjCreate('Scripting.Dictionary')
Global $objANS = ObjCreate('Scripting.Dictionary')
InitMatrix($objASC, $objANS)

HotKeySet('`', 'ConvertProc')
HotKeySet('^q', 'Quit')

While 1
    Sleep(100)
WEnd

Func ConvertProc()
    Local $OldClip = ClipGet()
    ClipPut('')
    Send('^{Insert}')
    Local $SelectedText = ClipGet()
    If $SelectedText = '' Then Return
    Local $InvertedText = InvertText($SelectedText, $objASC, $objANS)

    ClipPut($InvertedText)
    Sleep(100)
    Send('+{Insert}')

    Local $LeftJumps = GetLeftJumps($InvertedText)
    Send('^+{LEFT ' & $LeftJumps & '}')

    Send('{CTRLDOWN}')
    Send('{CTRLUP}')

    ClipPut($OldClip)
EndFunc

Func InvertText($sText, ByRef $objASC, ByRef $objANS)
    If StringIsASCII($sText) Then
        Return ConvertText($sText, $objASC)
    Else
        Return ConvertText($sText, $objANS)
    EndIf
EndFunc

Func GetLeftJumps($Text)
    StringRegExpReplace($Text, '\n', '')
    Local $Extended = @extended

    $Text = StringStripWS($Text, 3)

    $Text = StringRegExpReplace($Text, '\s+|\t+', ' ')
    $Text = StringRegExpReplace($Text, '~|`|!|#|%|\^|&|\*|\(|\)|-|\+|=|\{|\}|''|"|;|:|/|\\|<|>|\?|,|\[|\]|ч|Ч|ё|Ё', '|')
    $Text = StringRegExpReplace($Text, '\|+', '|')
    If StringIsASCII($Text) Then $Text = StringRegExpReplace($Text, '\.', '|')

    Local $WordsCountArr = StringRegExp($Text, "[\s\.:;,]*([а-яА-Яa-zA-Z0-9-_]+)[\s\.:;,]*", 3)
    StringRegExpReplace($Text, '\|', '')
    Return $Extended + @extended + UBound($WordsCountArr)
EndFunc

Func ConvertText($sText, ByRef $objMatrix)
    Local $i, $s, $n, $sRes = ''
    For $i = 1 To StringLen($sText)
        $s = StringMid($sText, $i, 1)
        $n = $objMatrix.Item ($s)
        If $n Then
            $sRes &= $n
        Else
            $sRes &= $s
        EndIf
    Next
    Return $sRes
EndFunc

Func InitMatrix(ByRef $objASC, ByRef $objANS)
    Local $aASC = "`qwertyuiop[]asdfghjkl;'zxcvbnm,./" & '~@#$^&QWERTYUIOP{}|ASDFGHJKL:"ZXCVBNM<>?'
    Local $aANS = "ёйцукенгшщзхъфывапролджэячсмитьбю." & 'Ё"№;:?ЙЦУКЕНГШЩЗХЪ/ФЫВАПРОЛДЖЭЯЧСМИТЬБЮ,', $i
    For $i = 1 To StringLen($aASC)
        $objASC.Add (StringMid($aASC, $i, 1), StringMid($aANS, $i, 1))
        $objANS.Add (StringMid($aANS, $i, 1), StringMid($aASC, $i, 1))
    Next
EndFunc

Func Quit()
    Exit
EndFunc
Главную клавишу конвертирования пришлось изменить, Ctrl ` вызывало проблемы - пока оставил только `.

-------
“Сделай так просто, как возможно, но не проще этого.”... “Ты никогда не решишь проблему, если будешь думать так же, как те, кто её создал.”

Альберт Эйнштейн

P.S «Не оказываю техподдержку через ПМ/ICQ, и по email - для этого есть форум. ©»

http://creator-lab.ucoz.ru/Images/Icons/autoit_icon.png Русское сообщество AutoIt | http://creator-lab.ucoz.ru/Images/Ic...eator_icon.png CreatoR's Lab | http://creator-lab.ucoz.ru/Images/Icons/oac_icon.png Opera AC Community


Отправлено: 10:59, 05-10-2007 | #550