Что нового

Задачка на строки (сбалансировать строку)

Suppir

Продвинутый
Сообщения
967
Репутация
62
Попробуйте этот код.

Необходимо длинную строку разбить на красивый абзац.


Код:
#include <array.au3>
#include <misc.au3>

Opt("ExpandVarStrings", 1) 
$a = 'В соответствии со статьей 21 Закона от 21.07.1997 г. N 122-ФЗ "О государственной регистрации прав на недвижимое имущество и сделок с ним" срок исправления технических ошибок, допущенных при государственной регистрации прав, не должен превышать трех календарных дней с момента обнаружения ошибки или получения заявления от любого заинтересованного лица в письменной форме об исправлении технических ошибок. До получения заявителем документов после проведения государственной регистрации прав срок исправления технических ошибок осуществляется в течение дня, отведенного для получения документов.'
$b = StringSplit($a, " ", 1)

Global $line = "     "
Global $line2
Global $result[1]

for $x = 1 to $b[0]
	if StringLen($line & "" & $b[$x])<76 Then
		$line = $line & " " & $b[$x]
	Else
		While StringLen($line)<76
			$line = StringRegExpReplace($line, "(?<=\S )(?! )", "  ", 1)
		Wend 
	_ArrayAdd($result, $line)
	$line = ""
	EndIf
Next

for $x = 0 to UBound($result) - 1
	$line2 = $line2 & @CRLF & $result[$x]
Next

ConsoleWrite ($line2)



Осталось сделать:

1) чтобы с правой стороны абзац был подровненным
2) почему-то в итоговом абзаце нет конца строки
3) почему-то в итоге в начале каждой строки стоит пробел (его не должно быть)


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

да, довольно сложная задача. У меня пока не получается :-\
 

kzru_hunter

Осваивающий
Сообщения
144
Репутация
49
Действительно, сложноватая задачка. Хотел решить её, а не получается.
Надо ещё также учитывать, что в тексте вместо одного пробела может быть 2 и более пробелов подряд, чтобы не было раздвоения лишних пробелов.
 
Автор
S

Suppir

Продвинутый
Сообщения
967
Репутация
62
Предположим, что в начальной строке нет сдвоенных пробелов (а также неразрывных пробелов и т.п.).


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

Получилось решить одну проблему (в начале каждой строки шел пробел):

Код:
#include <array.au3>
#include <misc.au3>

Opt("ExpandVarStrings", 1)
$a = 'В соответствии со статьей 21 Закона от 21.07.1997 г. N 122-ФЗ "О государственной регистрации прав на недвижимое имущество и сделок с ним" срок исправления технических ошибок, допущенных при государственной регистрации прав, не должен превышать трех календарных дней с момента обнаружения ошибки или получения заявления от любого заинтересованного лица в письменной форме об исправлении технических ошибок. До получения заявителем документов после проведения государственной регистрации прав срок исправления технических ошибок осуществляется в течение дня, отведенного для получения документов.'
$b = StringSplit($a, " ", 1)

Global $line = "     "
Global $line2
Global $result[1]

for $x = 1 to $b[0]
    if StringLen($line & "" & $b[$x])<76 Then
        if $line <> "" Then 
			$line = $line & " " & $b[$x]
		Else
			$line = $b[$x]
		EndIf
    Else
        While StringLen($line)<76
            $line = StringRegExpReplace($line, "(?<=\S )(?! )", "  ", 1)
        Wend
    _ArrayAdd($result, $line)
    $line = ""
    EndIf
Next

for $x = 0 to UBound($result) - 1
    $line2 = $line2 & @CRLF & $result[$x]
Next

ConsoleWrite ($line2)



Осталось две проблемы:
1) с правой стороны абзац должен быть подровненным
2) в абзаце не вся строка (часть обрезана)
 

SyDr

Сидра
Сообщения
651
Репутация
158
Для меня и такой вариант - красивый.
Код:
$sText  = 'В соответствии со статьей 21 Закона от 21.07.1997 г. N 122-ФЗ "О государственной регистрации прав на недвижимое '
$sText &='имущество и сделок с ним" срок исправления технических ошибок, допущенных при государственной регистрации прав, не должен '
$sText &='превышать трех календарных дней с момента обнаружения ошибки или получения заявления от любого заинтересованного лица в '
$sText &='письменной форме об исправлении технических ошибок. До получения заявителем документов после проведения государственной '
$sText &='регистрации прав срок исправления технических ошибок осуществляется в течение дня, отведенного для получения документов.'

$sText2 = ''
$nStart = 0
$nCurrent = 1
$nLine = 0
$nMaxLength = 76

While $nStart <= StringLen($sText)
    If $nStart = 0 Then
		$nStart = 1
		$nLine = 4
		$sText2 = @TAB
	EndIf

	$nCurrent = $nStart
	$nLine +=$nMaxLength
	$nCurrent += $nLine

	While $nLine > 76 Or $nCurrent > StringLen($sText) Or (StringLen($sText) <> $nCurrent And StringMid($sText, $nCurrent, 1) <> ' ')
		$nCurrent -= 1
		$nLine -= 1
	WEnd

	$sText2 &= StringMid($sText, $nStart, $nLine + 1) & @CRLF
	$nStart += $nLine + 1
	$nLine = 0
WEnd

ConsoleWrite($sText2)


Каков алгоритм выравнивания текста справа? Вставка дополнительных пробелов между словами в строке?
 
Автор
S

Suppir

Продвинутый
Сообщения
967
Репутация
62
SyDr [?]
Каков алгоритм выравнивания текста справа? Вставка дополнительных пробелов между словами в строке?

Да, между словами (но не в начале и не в конце строки)


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

У меня получился вот такой коротенький вариант:

Код:
$line = 'В соответствии со статьей 21 Закона от 21.07.1997 г. N 122-ФЗ "О государственной регистрации прав на недвижимое имущество и сделок с ним" срок исправления технических ошибок, допущенных при государственной регистрации прав, не должен превышать трех календарных дней с момента обнаружения ошибки или получения заявления от любого заинтересованного лица в письменной форме об исправлении технических ошибок. До получения заявителем документов после проведения государственной регистрации прав срок исправления технических ошибок осуществляется в течение дня, отведенного для получения документов.'

$line = "     " & $line & " "

Global $mat = StringRegExp($line, "(.{1,76}) ", 3)

for $x = 0 to Ubound($mat)-2
	While StringLen($mat[$x])<76
		$mat[$x] = StringRegExpReplace($mat[$x], "(?<=\S )(?! )", "  ", 1)
    Wend

	ConsoleWrite($mat[$x] & @CRLF)
Next

ConsoleWrite($mat[Ubound($mat)-1] & @CRLF)



Но при этом правый край все равно неровный :(


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

Проблема именно в строке:
$mat[$x] = StringRegExpReplace($mat[$x], "(?<=\S )(?! )", " ", 1)
 

SyDr

Сидра
Сообщения
651
Репутация
158
Скажите, что за привычка такая, использовать пушки (StringRegExp) для стрельбы по воробьям (эта задача)? Тем более, что решение задачи совершенно не зависит от содержания строки (ну разве что пробелы).

Код:
$sText  = 'В соответствии со статьей 21 Закона от 21.07.1997 г. N 122-ФЗ "О государственной регистрации прав на недвижимое '
$sText &='имущество и сделок с ним" срок исправления технических ошибок, допущенных при государственной регистрации прав, не должен '
$sText &='превышать трех календарных дней с момента обнаружения ошибки или получения заявления от любого заинтересованного лица в '
$sText &='письменной форме об исправлении технических ошибок. До получения заявителем документов после проведения государственной '
$sText &='регистрации прав срок исправления технических ошибок осуществляется в течение дня, отведенного для получения документов.'

$sText2 = ''
$sTemp = ''
Global $nStart = 0, $nLine = 0, $nMaxLength = 76
Global $nCurrent, $nSpace, $nSpaceCurrent


While $nStart <= StringLen($sText)
    If $nStart = 0 Then
		$nStart = 1
		$nLine = 4
		$sText2 = @TAB
	EndIf

	$nCurrent = $nStart
	$nLine +=$nMaxLength
	$nCurrent += $nLine

	While $nLine > 76 Or $nCurrent > StringLen($sText) Or (StringLen($sText) <> $nCurrent And StringMid($sText, $nCurrent, 1) <> ' ')
		$nCurrent -= 1
		$nLine -= 1
	WEnd

	$sTemp = StringMid($sText, $nStart, $nLine)
	$nSpace = $nMaxLength - $nLine
	$nSpaceCurrent = 1

	While $nSpace <> 0
		If StringMid($sTemp, $nSpaceCurrent, 1) = ' ' Then
			$sTemp = StringMid($sTemp, 1, $nSpaceCurrent) & ' ' & StringMid($sTemp, $nSpaceCurrent + 1)
			$nSpace -= 1
			$nSpaceCurrent += 1
		EndIf
		$nSpaceCurrent += 1
		If $nSpaceCurrent = StringLen($sTemp) Then
			$nSpaceCurrent = 1
		EndIf
	WEnd



	$nStart += $nLine + 1
	$nLine = 0
	$sText2 &= $sTemp & @CRLF
WEnd

ConsoleWrite($sText2)
 
Автор
S

Suppir

Продвинутый
Сообщения
967
Репутация
62
Первая строка получилась явно длиннее. Последняя строка должна быть приравнена влево.
 

SyDr

Сидра
Сообщения
651
Репутация
158
С первой строкой надо либо много условий проверять, либо исскуственно вводить ограничение (символ таба то считается одним символом).
Код:
$sText  = 'В соответствии со статьей 21 Закона от 21.07.1997 г. N 122-ФЗ "О государственной регистрации прав на недвижимое '
$sText &='имущество и сделок с ним" срок исправления технических ошибок, допущенных при государственной регистрации прав, не должен '
$sText &='превышать трех календарных дней с момента обнаружения ошибки или получения заявления от любого заинтересованного лица в '
$sText &='письменной форме об исправлении технических ошибок. До получения заявителем документов после проведения государственной '
$sText &='регистрации прав срок исправления технических ошибок осуществляется в течение дня, отведенного для получения документов.'
$sText = '        ' & $sText ; здесь необходмиое число пробелов для красной строки

$sText2 = ''
$sTemp = ''

Global $nStart = 1, $nLine = 0, $nMaxLength = 76
Global $nCurrent, $nSpace, $nSpaceCurrent


While $nStart <= StringLen($sText)
	$nLine = $nMaxLength
	$nCurrent = $nStart + $nLine

    While $nLine > $nMaxLength Or $nCurrent > StringLen($sText) Or (StringLen($sText) <> $nCurrent And StringMid($sText, $nCurrent, 1) <> ' ')
        $nCurrent -= 1
        $nLine -= 1
    WEnd

    $sTemp &= StringMid($sText, $nStart, $nLine)
    If StringLen($sText) <> $nCurrent Then
		$nSpace = $nMaxLength - $nLine
		$nSpaceCurrent = 1
	Else
		$sTemp &= StringRight($sText, 1)
	EndIf

    While $nSpace <> 0
        If StringMid($sTemp, $nSpaceCurrent, 1) = ' ' Then
            $sTemp = StringMid($sTemp, 1, $nSpaceCurrent) & ' ' & StringMid($sTemp, $nSpaceCurrent + 1)
            $nSpace -= 1
            $nSpaceCurrent += 1
        EndIf
        $nSpaceCurrent += 1
        If $nSpaceCurrent = StringLen($sTemp) Then
            $nSpaceCurrent = 1
        EndIf
    WEnd

    $sText2 &= $sTemp & @CRLF
	$sTemp = ''

    $nStart += $nLine + 1
    $nLine = 0
WEnd

ConsoleWrite($sText2)
 
Автор
S

Suppir

Продвинутый
Сообщения
967
Репутация
62
Готово:

Код:
$line = 'В соответствии со статьей 21 Закона от 21.07.1997 г. N 122-ФЗ "О государственной регистрации прав на недвижимое имущество и сделок с ним" срок исправления технических ошибок, допущенных при государственной регистрации прав, не должен превышать трех календарных дней с момента обнаружения ошибки или получения заявления от любого заинтересованного лица в письменной форме об исправлении технических ошибок. До получения заявителем документов после проведения государственной регистрации прав срок исправления технических ошибок осуществляется в течение дня, отведенного для получения документов.'

$line = "     " & $line & " "

Global $mat = StringRegExp($line, "(.{1,76}) ", 3)

for $x = 0 to Ubound($mat)-2
	While StringLen($mat[$x])<76
		$mat[$x] = StringRegExpReplace($mat[$x], "(?<=\S )(?! )", "  ", 1)
    Wend
	if StringLen($mat[$x])>76 Then $mat[$x] = StringReplace($mat[$x], "  ", " ", -1)
	ConsoleWrite($mat[$x] & @CRLF)
Next

ConsoleWrite($mat[Ubound($mat)-1] & @CRLF)


:laugh:


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

у тебя тоже ничего вариант :beer:
 

SyDr

Сидра
Сообщения
651
Репутация
158
А разве пробелы не должны "размазываться" по строке равномерно?
 
Автор
S

Suppir

Продвинутый
Сообщения
967
Репутация
62
Очень желательно. Попробую еще раз твой вариант.
 
Автор
S

Suppir

Продвинутый
Сообщения
967
Репутация
62
В защиту моего варианта: он короткий и используется всего 2 переменные.
 

SyDr

Сидра
Сообщения
651
Репутация
158
kzru_hunter [?]
Вариант от SyDr более близок к истине, но все равно пробелы не совсем равномерно расположены: во 2-й строке пробелы - 4,3,2,2,2,2, а надо 3,3,3,2,2,2
У меня нормально показывает: нет там четырёх пробелов.

Suppir [?]
В защиту моего варианта: он короткий и используется всего 2 переменные.
Я тоже могу все переменные занести в один массив и сказать, что у меня 1 переменная :smile:.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Можно так, но это в любом случае будет актуально только для моноширинных шрифтов (Courier и т.д.).

Код:
$Str = 'В соответствии со статьей 21 Закона от 21.07.1997 г. N 122-ФЗ "О государственной регистрации прав на недвижимое имущество и сделок с ним" срок исправления технических ошибок, допущенных при государственной регистрации прав, не должен превышать трех календарных дней с момента обнаружения ошибки или получения заявления от любого заинтересованного лица в письменной форме об исправлении технических ошибок. До получения заявителем документов после проведения государственной регистрации прав срок исправления технических ошибок осуществляется в течение дня, отведенного для получения документов.'

ConsoleWrite(_StringAlignment($Str, 84, 4) & @CR)

Func _StringAlignment($sStr, $iWidth, $iIndent = 0, $iMaxExpand = -1, $fLastExpand = 0)

	Local $Part, $Pos, $Count = 0, $Prev = 0, $Stop = 0, $Result = '', $Tab = ''

	If $iIndent > 0 Then
		For $i = 1 To $iIndent
			$Tab &= @TAB
		Next
	EndIf
	$sStr = $Tab & StringStripWS($sStr, 7)
	Do
		$Pos = StringInStr($sStr, ' ', 0, 1, $Prev + 1)
		If Not $Pos Then
			$Pos = StringLen($sStr)
			$Stop = 1
		EndIf
		If $Pos > $iWidth + 1 Then
			$Part = StringLeft($sStr, $Prev - 1)
			$sStr = StringTrimLeft($sStr, $Prev)
			$Result &= _StringExpand($Part, $iWidth, $iMaxExpand) & @CRLF
			$Prev = $Pos - $Prev
			$Count += 1
		Else
			$Prev = $Pos
		EndIf
	Until $Stop
	If ($fLastExpand) And ($Count) Then
		$sStr = _StringExpand($sStr, $iWidth, $iMaxExpand)
	EndIf
	$Result &= $sStr
	If $iIndent > 0 Then
		$Result = StringReplace($Result, $Tab, StringReplace($Tab, @TAB, ' '), 1)
	EndIf
	Return $Result
EndFunc   ;==>_StringAlignment

Func _StringExpand($sStr, $iWidth, $iMaxExpand)

	Local $aWord, $Add, $Num, $Space

;	$sStr = StringStripWS($sStr, 7)
	$aWord = StringSplit($sStr, ' ')
	If $aWord[0] < 2 Then
		Return $sStr
	EndIf
	$Num = $iWidth - (StringLen($sStr) - $aWord[0] + 1)
	$Add = Mod($Num, $aWord[0] - 1)
	$Num = ($Num - $Add) / ($aWord[0] - 1)
	If ($iMaxExpand > 0) And ($Num >= $iMaxExpand) Then
		$Num = $iMaxExpand
		$Add = 0
	EndIf
	$Space = StringFormat('%' & $Num & 's', '')
	For $i = 1 To $Add
		$aWord[$i] &= ' '
	Next
	$sStr = $aWord[1]
	For $i = 2 To $aWord[0]
		$sStr &= $Space & $aWord[$i]
	Next
	Return $sStr
EndFunc   ;==>_StringExpand
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
Тоже попробовал пробелами создать разряжение текста для выравнивания... И уже переделал как функцию.

Код:
$Str = 'Выравнивание требуется чтобы текст выглядел колонкой. В данном примере текст делается разряжённым за счёт вставки лишних пробелов между словами, приводя длинну строки к лимиту, указанному в переменной. Для того чтобы увидеть эффект нужно использовать моноширинный шрифт, ширина которого измеряется количеством символов. Иные шрифты могут "налегать" друг на друга, например "ря" и соответственно при одинаковом количестве символов строки никогда не совпадут по длинне. Выравнивание может пригодится в диалоговых окнах, многострочных лэйблах.'

MsgBox(0, "Ширина", _Alignment($Str, 76, 5))

Func _Alignment($sStr, $Width=90, $redstring=5)
Local $StrTmp='', $String='', $TextOut='', $redstring0='', $aWord, $i, $x

If $redstring>0 Then 
	For $i = 1 to $redstring
		$redstring0&=' '
	Next
EndIf
$aWord = StringSplit($sStr, " ", 1)

For $i = 1 to $aWord[0]
    if StringLen($String)<=$Width-$redstring+1 Then
		$StrTmp=$String
        $String &= $aWord[$i]&' '
		If $aWord[0]=$i And StringLen($String)<=$Width-$redstring+1 Then $TextOut &= $StrTmp&' '&$aWord[$i]
		If $aWord[0]=$i And StringLen($String)>$Width-$redstring+1 Then $TextOut &= $StrTmp&@CRLF&$aWord[$i]
    Else
		$StrTmp = StringTrimRight($StrTmp,1)
		For $x = 1 to 10
			If StringLen($StrTmp)<$Width-$redstring Then
				$StrTmp = StringRegExpReplace($StrTmp, '\s+', '$0 ', $Width-$redstring-StringLen($StrTmp))
			Else
				ExitLoop
			EndIf
		Next
        $TextOut &= $StrTmp&@CRLF
		$String=$aWord[$i-1]&' '&$aWord[$i]&' '
		If $aWord[0]=$i Then $TextOut &= $aWord[$i-1]&' '&$aWord[$i]
		$redstring=0
    EndIf
Next
Return $redstring0&$TextOut
EndFunc


С таймером

Код:
$Str = 'Выравнивание требуется чтобы текст выглядел колонкой. В данном примере текст делается разряжённым за счёт вставки лишних пробелов между словами, приводя длинну строки к лимиту, указанному в переменной. Для того чтобы увидеть эффект нужно использовать моноширинный шрифт, ширина которого измеряется количеством символов. Иные шрифты могут "налегать" друг на друга, например "ря" и соответственно при одинаковом количестве символов строки никогда не совпадут по длинне. Выравнивание может пригодится в диалоговых окнах, многострочных лэйблах.'


For $i = 40 to 78
	MsgBox(0, "Ширина "&$i, _Alignment($Str, $i, 5))
Next

Func _Alignment($sStr, $Width=90, $redstring=5)
	$timer = TimerInit() ; засекаем время
Local $StrTmp='', $String='', $TextOut='', $redstring0='', $aWord, $i, $x

If $redstring>0 Then 
	For $i = 1 to $redstring
		$redstring0&=' '
	Next
EndIf
$aWord = StringSplit($sStr, " ", 1)

For $i = 1 to $aWord[0]
    if StringLen($String)<=$Width-$redstring+1 Then
		$StrTmp=$String
        $String &= $aWord[$i]&' '
		If $aWord[0]=$i And StringLen($String)<=$Width-$redstring+1 Then $TextOut &= $StrTmp&' '&$aWord[$i]
		If $aWord[0]=$i And StringLen($String)>$Width-$redstring+1 Then $TextOut &= $StrTmp&@CRLF&$aWord[$i]
    Else
		$StrTmp = StringTrimRight($StrTmp,1)
		For $x = 1 to 10
			If StringLen($StrTmp)<$Width-$redstring Then
				$StrTmp = StringRegExpReplace($StrTmp, '\s+', '$0 ', $Width-$redstring-StringLen($StrTmp))
			Else
				ExitLoop
			EndIf
		Next
        $TextOut &= $StrTmp&@CRLF
		$String=$aWord[$i-1]&' '&$aWord[$i]&' '
		If $aWord[0]=$i Then $TextOut &= $aWord[$i-1]&' '&$aWord[$i]
		$redstring=0
    EndIf
Next
Return $redstring0&$TextOut&@CRLF&@CRLF&'Выполнено за '&Round(TimerDiff($timer), 1)&' мсек'
EndFunc
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
Suppir
Подправил предыдущий свой пост, заметил иногда последняя строка выпячивается. Исправил этот глюк, при окончании цикла проверяется длинна строки повторно.

Yashied
Косвенный вопрос по скрипту, разве $i в функции в Local не добавляется? Или существует правило не добавлять $i в Global?

SyDr
А какой смысл многократного обединения переменной с текстом $sText &=, если в итоге $sText будет просто содержать текст, как если бы присвоить сразу одной строкой. Если для наглядности текста в скрипте, то можно воспользоваться без объединяющего присвоения, переносом строки.

Код:
$Str= _
'В соответствии со статьей 21 Закона от 21.07.1997 г. N 122-ФЗ "О государственной регистрации прав на недвижимое '& _
'имущество и сделок с ним" срок исправления технических ошибок, допущенных при государственной регистрации прав, не должен '& _
'превышать трех календарных дней с момента обнаружения ошибки или получения заявления от любого заинтересованного лица в '& _
'письменной форме об исправлении технических ошибок. До получения заявителем документов после проведения государственной '& _
'регистрации прав срок исправления технических ошибок осуществляется в течение дня, отведенного для получения документов.'
 
Автор
S

Suppir

Продвинутый
Сообщения
967
Репутация
62
Вариант Yashied'а хорошо работает, если функции посылать несколько строк. Например, данные из буфера обмена.


Код:
$aBuffer = StringSplit(Clipget(), @CRLF, 1) 
for $x = 1 to UBound($aBuffer) -1 
	ConsoleWrite(_StringAlignment($aBuffer[$x], 76, 6) & @CRLF)
Next

Func _StringAlignment($sStr, $iWidth, $iIndent = 0, $iMaxExpand = -1, $fLastExpand = 0)

    Local $Part, $Pos, $Count = 0, $Prev = 0, $Stop = 0, $Result = '', $Tab = ''

    If $iIndent > 0 Then
        For $i = 1 To $iIndent
            $Tab &= @TAB
        Next
    EndIf
    $sStr = $Tab & StringStripWS($sStr, 7)
    Do
        $Pos = StringInStr($sStr, ' ', 0, 1, $Prev + 1)
        If Not $Pos Then
            $Pos = StringLen($sStr)
            $Stop = 1
        EndIf
        If $Pos > $iWidth + 1 Then
            $Part = StringLeft($sStr, $Prev - 1)
            $sStr = StringTrimLeft($sStr, $Prev)
            $Result &= _StringExpand($Part, $iWidth, $iMaxExpand) & @CRLF
            $Prev = $Pos - $Prev
            $Count += 1
        Else
            $Prev = $Pos
        EndIf
    Until $Stop
    If ($fLastExpand) And ($Count) Then
        $sStr = _StringExpand($sStr, $iWidth, $iMaxExpand)
    EndIf
    $Result &= $sStr
    If $iIndent > 0 Then
        $Result = StringReplace($Result, $Tab, StringReplace($Tab, @TAB, ' '), 1)
    EndIf
    Return $Result
EndFunc   ;==>_StringAlignment

Func _StringExpand($sStr, $iWidth, $iMaxExpand)

    Local $aWord, $Add, $Num, $Space

;   $sStr = StringStripWS($sStr, 7)
    $aWord = StringSplit($sStr, ' ')
    If $aWord[0] < 2 Then
        Return $sStr
    EndIf
    $Num = $iWidth - (StringLen($sStr) - $aWord[0] + 1)
    $Add = Mod($Num, $aWord[0] - 1)
    $Num = ($Num - $Add) / ($aWord[0] - 1)
    If ($iMaxExpand > 0) And ($Num >= $iMaxExpand) Then
        $Num = $iMaxExpand
        $Add = 0
    EndIf
    $Space = StringFormat('%' & $Num & 's', '')
    For $i = 1 To $Add
        $aWord[$i] &= ' '
    Next
    $sStr = $aWord[1]
    For $i = 2 To $aWord[0]
        $sStr &= $Space & $aWord[$i]
    Next
    Return $sStr
EndFunc   ;==>_StringExpand
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
Suppir
А причём тут буфер обмена? Важен тип данных. Если имеются переходы на другие строки, то у Yashied переходы удаляются, у меня нет. Я сейчас проверил именно на переходы строк, так вот табличные данные у Yashied сливаются в одну строку, а у меня растягиваются и остаются как таблица. Может это в параметрах указано, неразбирался...
 
Автор
S

Suppir

Продвинутый
Сообщения
967
Репутация
62
AZJIO, насчет табличных данных хотел у тебя спросить.
Как считаешь, можно ли средствами AutoIt сделать поиск-замену в тексте, который содержит вордовские таблицы.

Например, на этой странице:
http://www.krsdstat.ru/public/info/26_04-02_05%20%D0%AD%D0%BA%D1%81%D0%BF%D1%80.%D1%82%D0%BE%D0%BF%D0%BB%D0%B8%D0%B2%D0%BE.htm

можно ли сделать поиск-замену с помощью регулярных выражений в таком тексте, чтобы таблицы остались целыми?

Т.е. мы берем этот текст в буфер обмена.
Может получить этот текст через Clipget()
Делаем замены через StringRegExpReplace().
Потом вставляем результат в Word.
Но при этом таблицы разрушаются в плоский текст.


Обычные замены символ-на символ не подходят, так как необходимы сложные правила замены.
Функция поиска-замены в Word'е тоже не подходит, так как у нее очень слабые возможности.

Наверное, лучше перенести в отдельную тему.
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
Suppir
Зависит где данные смотреть, я пользуюсь нотепад++, там консоль у меня отключена и я проверяю в мессаге, ведь это реальная проверка. Проверил в консоли SciTE, там нормально, но итоговый результат нужно смотреть на реальном элементе, лэйбл, мессага...


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

Suppir
Проверил свой пост, там ошибка закралась, вот что значит править пост руками, обычно всегда копировал из своего рабочего примера, который тестил... вобщем поправил пост, там переменная $sStr указана как $Str, это и вызывало ошибку. А у меня всё работало...
 
Верх