Что нового

Готовим Au3 скрипт к компиляции

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
Написал пока что для au3 скриптов, удаляет из au3 скрипта коментарии и пробелы, я знаю что компилятор AutoIt и без меня это делает, это просто для общего развития и дальнейшего применения, у кого есть время, протестируйте пожалуйста на скриптах разной сложности написания, если будут баги, пишите сюда. За функцию AutoItBlankDelete() отдельное спасибо Creator'у.

Код:
#NoTrayIcon

Global $aKeyWord = "ByRef" & @CRLF & _
                   "Const" & @CRLF & _
				   "ContinueCase" & @CRLF & _
				   "ContinueLoop" & @CRLF & _
				   "Default" & @CRLF & _
				   "Dim" & @CRLF & _
				   "Do" & @CRLF & _
				   "Until" & @CRLF & _
				   "Enum" & @CRLF & _
				   "Exit" & @CRLF & _
				   "ExitLoop" & @CRLF & _
				   "For" & @CRLF & _
				   "In" & @CRLF & _
				   "Func" & @CRLF & _
				   "EndFunc" & @CRLF & _
				   "Global" & @CRLF & _
				   "If" & @CRLF & _
				   "Then" & @CRLF & _
				   "ElseIf" & @CRLF & _
				   "Else" & @CRLF & _
				   "EndIf" & @CRLF & _
				   "Local" & @CRLF & _
				   "ReDim" & @CRLF & _
				   "Return" & @CRLF & _
				   "Select" & @CRLF & _
				   "Case" & @CRLF & _
				   "EndSelect" & @CRLF & _
				   "Switch" & @CRLF & _
				   "EndSwitch" & @CRLF & _
				   "True" & @CRLF & _
				   "With" & @CRLF & _
				   "EndWith" & @CRLF & _
				   "While" & @CRLF & _
				   "Wend"	& @CRLF & _
				   "Or" & @CRLF & _
				   "And" & @CRLF & _
				   "Not" & @CRLF & _
				   "_" 

AutoItScript(@ScriptDir & "\Test.au3")

Func AutoItScript($iScriptPatch)
	
	Local $aTemp, $pTemp, $aCode, $aProcessing, $aComment, $aInit
	
	$aCode = AutoItBlankDelete($iScriptPatch)
	
	$aProcessing = StringSplit($aCode, "{blank}", 1)
	For $i = 1 To UBound($aProcessing) -1
		If StringRegExp($aKeyWord, StringStripWS($aProcessing[$i], 3)) = 1 Then
			$aTemp &= " " & $aProcessing[$i] & " "
		Else	
			$aTemp &= $aProcessing[$i]
		EndIf		
	Next
	
	$aComment = StringSplit($aTemp, @CRLF, 1)
	For $i = 1 To UBound($aComment) -1
		$aInit = StringSplit($aComment[$i], ";")
		$pTemp &= $aInit[1] & @CRLF
	Next	
	
	$aTemp = ""
	
	FileWrite("Temp.au3", $pTemp)
EndFunc

Func AutoItBlankDelete($sAu3Scrypt)

    Local $sResult
    Local $sAu3Temp

    $sAu3Open = FileOpen($sAu3Scrypt)

    While 1
        $sAu3Read = FileReadLine($sAu3Open)
        If @error <> 0 Then ExitLoop
        $sAu3Quotes = StringRegExp($sAu3Read, '("[^"]*"|''[^'']*'')', 3)
        For $i = 0 To UBound($sAu3Quotes) - 1
            $sAu3Read = StringReplace($sAu3Read, $sAu3Quotes[$i], '~Quote_' & $i)
        Next

        $sAu3Split = StringRegExp($sAu3Read, '(?!>")([^\h]+)(?!")', 3)
        For $i = 0 To UBound($sAu3Split) - 1
            If StringInStr($sAu3Split[$i], '~Quote_') Then
                For $j = 0 To UBound($sAu3Quotes) - 1
                    $sAu3Split[$i] = StringReplace($sAu3Split[$i], '~Quote_' & $j, $sAu3Quotes[$j])
                Next
            EndIf
            $sAu3Temp &= $sAu3Split[$i] & "{blank}" & @CRLF
        Next
        $sAu3Temp &= "{NewLine}" & @CRLF
    WEnd
    FileClose($sAu3Open)

    $aAu3Split = StringSplit($sAu3Temp, @CRLF, 1)
    $sAu3Src = ""
    For $i = 1 To $aAu3Split[0]
        If StringInStr($aAu3Split[$i], "{NewLine}") Then
            $sAu3Src &= StringReplace($aAu3Split[$i], "{NewLine}", @CRLF)
        Else
            $sAu3Src &= $aAu3Split[$i]
        EndIf
    Next

    Return $sAu3Src

EndFunc
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
после обработки мой скрипт уменьшился в объеме..но с 8кб до 7кб
но в полученном скрипте нашел сразу два бага:
была соединена строчка
Код:
For $i=1To$iPart

а должно быть
Код:
For $i=1 To $iPart

плюс - скрипт после компиляции должен был менять иконку..после обработки скрипта эта опция не работает.
 
Автор
V

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
Странно, у меня подобное нормально обрабатывает, может какие факторы влияют на выполнение скрипта?! :scratch:
 

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
На оффоруме видел скрипт, который переименовывал все переменные, названия функций, в совершенно не читаемый человеком вид типа $DF3GH6A7FS98D0WEA и S78DSE65DSFGD32WER(). Правда ссылку щас не найду, но пытался однажды разобраться с обработанным таким образом исходником. Это был ужас.
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
Belfigor [?]
который переименовывал все переменные, названия функций,
это типа как при обфускации?

Viktor1703 [?]
Странно, у меня подобное нормально обрабатывает, может какие факторы влияют на выполнение скрипта?!
смотри в архиве. test.au3 это исходный скрипт, ну а второй это то, что получилось после обработки. просто проверь синтаксис..две ошибки вылезут..до обработки рабочий скрипт
 
Автор
V

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
Ха, да не, вылезла но не из- за того что баг в моём скрипте, в самом верху есть переменная $aKeyWord добавь туда слово "To" и тогда нормально будет отделять а вот во 2й ошибке, чёт не пойму, откуда взялся там 0 мой скрипт ни чего не прописывает, буду эксперементировать со скобками


Добавлено:
Сообщение автоматически объединено:

Нашёл причину, ошибка в функции Creator'a, в StringRegExp'ах почему то они не хотят нормально считывать такие скобки '', тогда мне нужна помощь, я в StringRegExp'ах совсем школота.
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
насчет нуля не знаю, но даже если его убрать( при этом синтаксис не страдает) и скомпилировать файл, то он не работает до конца..вобщем это скрипт программы, которую выложил я здесь
скачай архив и попробуй со всеми файлами
 
Автор
V

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
Разделил нормально и иконка на склейку обратно поставилась, просто 0 ты убрал а пробел в скобках наверное нет

Оригинал
Код:
@TempDir & "\join.ico" , '', @SW_HIDE)


После обработки
Код:
@TempDir&"\join.ico"," "0,@SW_HIDE)


Нужно рядом с нулём в скобках убрать пробел и сам 0
Код:
@TempDir&"\join.ico","",@SW_HIDE)




Добавлено:
Сообщение автоматически объединено:

А вот саму склейку не проверил - не работает, ошибка в скрипте после обработки где то в переменной $s_Script просто я пока сам не пойму что за .... с такими '' у него косяк
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
вот вот. файла склейщика и не получается на выходе..и ошибку не выдает...было у меня по началу такое, когда мучился с пробелами и двойными-одинарными кавычками.
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
Viktor1703

Удаление комментариев:
Код:
; заимствовано из "Organize Includes"
Func _stripComments(ByRef $string)
	;Author: Prog@ndy
	$string = StringReplace(StringReplace($string, "#comments-start", "#cs", 0, 2), "#comments-end", "#ce", 0, 2)
	$string = StringRegExpReplace($string, "(?si)(\v|\A)\h*#cs\b.*?\v\h*#ce\b", '') ; remove simple block comments (мод AZJIO)
	#region remove nested block-comments
	Local $match, $depth, $offset, $start, $CommentsAfterce
	While 1
		$depth = 0
		$match = StringRegExp($string, "(?im)^\h*#cs\b", 1)
		$start = @extended
		If @error Then ExitLoop
		Do
			$match = StringRegExp($string, "(?im)^\h*#c([se])\b", 1, $offset)
			$offset = @extended
			Select
				Case @error
					Return False
				Case $match[0] = "e"
					$depth -= 1
				Case Else
					$depth += 1
			EndSelect
		Until $depth < 1

		$string = StringLeft($string, $start - 4) & StringRegExpReplace(StringMid($string, $offset), ".*", '', 1)
;~         $string = StringLeft($string, $start-4) & StringMid($string, $offset)
	WEnd
	#endregion remove nested block-comments
	$string = StringRegExpReplace($string, '(?m)^((?:[^''";]*([''"]).*?\2)*[^;]*);.*$', '\1') ; remove one-line comments
	Return True
EndFunc   ;==>_stripComments

Совет: перед обработкой разбить скрипт на участки "текстовая информация" и "код" в последовательный двумерный массив с пометкой в столбце где код, а где текст. Далее обработать участки кода, потом соединить. Думаю так быстрее будет, чем составлять супер-сложное регулярное выражение. Ещё посмотри мой скрипт list_var_funk.au3, он выдаёт список функций и переменных, если захочешь их переименовать в рандомные цифры.
 
Автор
V

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
C коментариями всё в порядке баг в отличии текста с пробелами от кода с пробелами, но всё равно спасибо, сохраню для дальнейшего использования.
 
Автор
V

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
Код:
$hOpen = FileOpen(@ScriptDir & "\BinaryImg2.au3")
$hRead = FileRead($hOpen)
FileClose($hOpen)
FileWrite("1.au3", AU3_ProcessingCode($hRead))

Func AU3_ProcessingCode(ByRef $sCode)
    $sCode = @LF & $sCode & @LF
    $sCode = StringRegExpReplace($sCode, '\s*\R+\s*', @CRLF)
    $sCode = StringRegExpReplace($sCode, '(?m)^;.*$\n?', '')
    $sCode = StringRegExpReplace($sCode, '(?im)^#c(?:omments-(s)tart|omments-(e)nd)', '#c$1$2')
    $sCode = StringRegExpReplace($sCode, '(?im)^#cs(?<rec>(?<!^)#|[^#]|#cs\g<rec>*#ce)*?^#ce(?-s).*\n', '')
    $sCode = StringRegExpReplace($sCode, '(?im)^#[^i].*$\n?', '')
    $sCode = StringRegExpReplace($sCode, '(?m)^((?:[^''";]*([''"]).*?\2)*[^;]*);?.*$', '$1')
    $sCode = StringRegExpReplace($sCode, '(?m)\h*$', '')
    $sCode = StringRegExpReplace($sCode, '(?m)\h+_$\n', ' ')
    $sCode = StringRegExpReplace($sCode, '(([''"]).*?\2)|\h*([=<>(\){}[\]*+\-/^,&])\h*|(\h)\h*', '$1$3$4')
    $sCode = StringRegExpReplace($sCode, '(?i)(?<=[^a-z$]to|[^a-z$]step|[^a-z$]exit|[^a-z$]return|[^a-z$]select|[^a-z$]switch|[^a-z$]case)-', ' -')
	$sCode = StringRegExpReplace($sCode, '\s/q\', '') ; Удаляем все пробелы в строке кроме тех которые находятся "тут" и 'тут'
	$sCode = StringRegExpReplace($sCode, ',_', ', _')
	$sCode = StringRegExpReplace($sCode, '&_', '& _')
	$sCode = StringTrimRight($sCode, 1)
    $sCode = StringTrimLeft($sCode, 1)
	Return $sCode
EndFunc
 
Верх