#include-once
; #FUNCTION# ;=================================================================================
; Function Name ...: _HotKeyString_To_AutoitCode
; Description ........: Converts text format recording hotkey to format HotKeySet in Autoit3
; Syntax................: _HotKeyString_To_AutoitCode ( $sKey )
; Parameters:
;		$sKey - text format recording hot key, such as "Ctrl + s"
; Return values ....: Success - Returns a string in the format function in HotKeySet Autoit3, such as "^s"
;					Failure - empty string, @error:
;                  |1 - empty string
;                  |2 - with modifiers used in more than one key
;                  |3 - the same modifier is used more than once
; Author(s) ..........: AZJIO
; Remarks ..........:
; ============================================================================================
; Имя функции ...: _HotKeyString_To_AutoitCode
; Описание ........: Преобразует текстовый формат записи горячей клавиши в формат функции HotKeySet в Autoit3
; Синтаксис.......: _HotKeyString_To_AutoitCode ( $sKey )
; Параметры:
;				$sKey - текстовый формат записи горячей клавиши, например "Ctrl + s"
; Возвращаемое значение: Успешно - Возвращает строку в формате функции HotKeySet в Autoit3, например "^s"
;				Неудачно - пустая строка, @error:
;						|1 - передана пустая строка
;						|2 - с модификатороми используется более чем одна клавиша
;						|3 - один и тот же модификатор используется более чем один раз
; Автор ..........: AZJIO
; Примечания ..: Преобразует строку типа "Ctrl + a" в вид "^a", последнее является стандартным обозначением модификаторов в Autoit. Это предназначено для чтения горячих клавиш из ini-файла, в котором они записаны в привычном формате. Проверка ошибок позволяет выявить правильность записи горячей клавиши.
; ============================================================================================
Func _HotKeyString_To_AutoitCode($sKey)
	Local $ch, $k
	If $sKey = '' Then Return SetError(1, 0, '')
	$sKey = '{' & StringRegExpReplace(StringStripWS($sKey, 8), '(?<!\+)\+', '}{') & '}' ; удаляем пробелы, используем "+" как разделитель
	If StringRight($sKey, 3) = '}{}' Then $sKey = StringTrimRight($sKey, 2) ; если заканчивается разделителем справа, вместо клавиши
	If StringLeft($sKey, 3) = '{}{' Then $sKey = StringTrimLeft($sKey, 2) ; если заканчивается разделителем слева, вместо клавиши
	$sKey = StringRegExpReplace($sKey, '\{([^!+^#{}])\}', '\1') ; если не метасимволы то убираем обрамляющие фигурные скобки

	; Создаёт строку модификаторов
	Local $sMod = ''
	Local $aMod = StringRegExp($sKey, '(\{(?:Alt|Shift|Ctrl|Win)\})', 3) ; извлекает модификаторы
	If Not @error Then
		For $i = 0 To UBound($aMod) - 1
			$sMod &= $aMod[$i]
		Next
		$sMod = StringReplace($sMod, '{Alt}', '!')
		If @extended > 1 Then Return SetError(3, 0, '')
		$sMod = StringReplace($sMod, '{Shift}', '+')
		If @extended > 1 Then Return SetError(3, 0, '')
		$sMod = StringReplace($sMod, '{Ctrl}', '^')
		If @extended > 1 Then Return SetError(3, 0, '')
		$sMod = StringReplace($sMod, '{Win}', '#')
		If @extended > 1 Then Return SetError(3, 0, '')
	EndIf
	; проверка наличие только одной клавиши в сочетании с модификаторами
	$sKey = StringRegExpReplace($sKey, '\{Alt\}|\{Shift\}|\{Ctrl\}|\{Win\}', '') ; удаляем модификаторы
	$ch = StringRegExpReplace($sKey, '\{.*?\}', '') ; подсчитываем элементы обрамлённые фигурными скобками
	$k = @extended
	$k += StringLen($ch) ; добавляем количество символов без фигурных скобок
	If $k <> 1 Then Return SetError(2, 0, '') ; возвращает пустую строку при ошибке
	Return $sMod & $sKey
EndFunc   ;==>_HotKeyString_To_AutoitCode