- Сообщения
- 8,673
- Репутация
- 2,486
inververs
Вот вариант преобразования исходника в формат компилированного скрипта:
Вот вариант преобразования исходника в формат компилированного скрипта:
Код:
#include <Array.au3>
_AU3_StripToRaw(@ScriptFullPath)
Func _AU3_StripToRaw($sSrcFile, $sSufix = 'raw_stripped')
Local $sRaw = '', $aIncludes[1]
Local $aRead, $iInclude, $sInclude
Local $sSrc = FileRead($sSrcFile)
Local $sScriptDir = StringRegExpReplace($sSrcFile, '\\[^\\]+$', '')
While 1
$aRead = StringSplit(StringStripCR($sSrc), @LF)
$iInclude = 0
For $i = 1 To $aRead[0]
$sInclude = _AU3_IncludeToPath($aRead[$i], $sScriptDir)
If Not @error Then
For $j = 1 To $aIncludes[0]
If $aIncludes[$j] = $sInclude Then
ContinueLoop 2
EndIf
Next
$iInclude = 1
$aIncludes[0] += 1
ReDim $aIncludes[$aIncludes[0] + 1]
$aIncludes[$aIncludes[0]] = $sInclude
$sRaw &= FileRead($sInclude) & @CRLF
Else
$sRaw &= $aRead[$i] & @CRLF
EndIf
Next
If Not $iInclude Then
ExitLoop
EndIf
$sSrc = $sRaw
$sRaw = ''
WEnd
$sRaw = StringRegExpReplace($sRaw, '(?mi)\A\R+|(#cs((?s).*?)#ce\R*|#comments-start((?s).*?)#comments-end\R*|(?-s)^\h*#.*?$\R*|^\h*;[^\r\n]*$\R*|\h+\R\R*|\R(?=\R))*|\R+\z', '')
$sSrcFile = StringRegExpReplace($sSrcFile, '(\.[^\.]+)$', '_' & $sSufix & '$1')
$hFile = FileOpen($sSrcFile, 2)
FileWrite($hFile, $sRaw)
FileClose($hFile)
Return $sRaw
EndFunc
Func _AU3_IncludeToPath($sInclude, $sScriptDir = @ScriptDir)
Local $aRegExp = StringRegExp($sInclude, '(?i)^\h*#include\h+(<|"|'')([^>"'']+)(?:>|"|'')\h*$', 3)
; Проверка на корректность формата строки
If Not IsArray($aRegExp) Then Return SetError(1, 0, "")
$sInclude = $aRegExp[1]
If StringInStr($sInclude, "\") = 0 Then
Local $sSYS, $sUDL, $aUDL, $sAU3 = $sScriptDir & "\" & $sInclude
; Определение каталога системных библиотек
$sSYS = StringRegExpReplace(@AutoItExe, "\\[^\\]+$", "")
$sSYS &= "\Include\"& $sInclude
; Чтение списка каталогов пользовательских библиотек
$sUDL = RegRead("HKCU\Software\AutoIt v3\AutoIt", "Include")
$aUDL = StringRegExp($sUDL, "([^;]+)(?:;|$)", 3)
; Проверка типов 1 и 2 (до пользовательских библиотек)
If $aRegExp[0] == '<' Then
If FileExists($sSYS) Then Return SetError(0, 1, $sSYS)
ElseIf $aRegExp[0] == '"' Or $aRegExp[0] == "'" Then
If FileExists($sAU3) Then Return SetError(0, 2, $sAU3)
EndIf
; Проверка типа 3 (поиск среди пользовательских библиотек)
If IsArray($aUDL) Then
For $i = 0 To UBound($aUDL)-1
$aUDL[$i] &= "\" & $sInclude
If FileExists($aUDL[$i]) Then Return SetError(0, 3, $aUDL[$i])
Next
EndIf
; Проверка типов 1 и 2 (после пользовательских библиотек)
If $aRegExp[0] == '<' Then
If FileExists($sAU3) Then Return SetError(0, 2, $sAU3)
ElseIf $aRegExp[0] == '"' Or $aRegExp[0] == "'" Then
If FileExists($sSYS) Then Return SetError(0, 1, $sSYS)
EndIf
Else
; Проверка типа 4 (файл с указанием полного пути)
If FileExists($sInclude) Then Return SetError(0, 4, $sInclude)
EndIf
; ОШИБКА: файл не найден
Return SetError(2, 0, "")
EndFunc