Загрузка данных


Sub ApplySettings()
    If Selection.Type = 1 Then Exit Sub
    
    ' Переходим в режим разметки и принудительно обновляем страницы
    ActiveWindow.View.Type = 3 ' wdPrintView
    ActiveDocument.Repaginate
    
    Dim selRange As Range
    Set selRange = Selection.Range
    
    ' 1. ОБЩЕЕ ОФОРМЛЕНИЕ
    With selRange
        .Font.Name = "Times New Roman"
        .Font.Size = 14
        .Font.Italic = False
        With .ParagraphFormat
            .Alignment = 3
            .FirstLineIndent = CentimetersToPoints(1.25)
            .SpaceBefore = 0: .SpaceBeforeAuto = False
            .SpaceAfter = 0: .SpaceAfterAuto = False
            .LineSpacingRule = 0
        End With
    End With

    ' 2. ЗАМЕНЫ (Тире и Кавычки)
    Call GlobalReplace(selRange, "—", "–", False)
    Call GlobalReplace(selRange, """([!""^13]@)""", "«\1»", True)
    
    ' 3. АНГЛИЙСКИЙ КУРСИВ (улучшенный поиск)
    Dim engRange As Range
    Set engRange = Selection.Range
    With engRange.Find
        .ClearFormatting
        .Text = "[a-zA-Z]{1;}" ' Ищем латиницу
        .Replacement.Font.Italic = True
        .Replacement.Text = "^&"
        .MatchWildcards = True
        .Forward = True
        .Wrap = wdFindStop
        .Execute Replace:=2
    End With

    ' 4. ОБРАБОТКА КАРТИНОК И УМНАЯ РАССТАНОВКА ENTER
    Dim i As Long
    Dim iShape As InlineShape
    Dim picPara As Paragraph, currPara As Paragraph
    
    For i = selRange.InlineShapes.Count To 1 Step -1
        Set iShape = selRange.InlineShapes(i)
        Set picPara = iShape.Range.Paragraphs(1)
        
        ' 4.1 Картинка по центру
        picPara.Range.ParagraphFormat.Alignment = 1
        picPara.Range.ParagraphFormat.FirstLineIndent = 0
        
        ' 4.2 Очистка ПЕРЕД картинкой и вставка Enter
        Set currPara = picPara.Previous
        Do While Not currPara Is Nothing
            If IsEmptyPara(currPara) Then
                currPara.Range.Delete
                Set currPara = picPara.Previous
            Else
                Exit Do
            End If
        Loop
        If Not currPara Is Nothing Then
            ActiveDocument.Repaginate ' Обновляем перед проверкой
            If picPara.Range.Information(3) = currPara.Range.Information(3) Then
                picPara.Range.InsertParagraphBefore
            End If
        End If
        
        ' 4.3 Очистка МЕЖДУ картинкой и подписью
        Set currPara = picPara.Next
        Do While Not currPara Is Nothing
            If IsEmptyPara(currPara) Then
                currPara.Range.Delete
                Set currPara = picPara.Next
            Else
                Exit Do
            End If
        Loop
        
        ' 4.4 Оформление подписи
        If Not currPara Is Nothing Then
            With currPara.Range
                .Font.Size = 12
                .ParagraphFormat.Alignment = 1
                .ParagraphFormat.FirstLineIndent = 0
            End With
            
            ' 4.5 Умный Enter ПОСЛЕ подписи
            Dim captionPara As Paragraph
            Set captionPara = currPara
            
            Set currPara = captionPara.Next
            Do While Not currPara Is Nothing
                If IsEmptyPara(currPara) Then
                    currPara.Range.Delete
                    Set currPara = captionPara.Next
                Else
                    Exit Do
                End If
            Loop
            
            ' ПРОВЕРКА: Нужен ли Enter после подписи
            If Not currPara Is Nothing Then
                ActiveDocument.Repaginate ' Принудительный пересчет страниц
                
                Dim p1 As Integer, p2 As Integer
                p1 = captionPara.Range.Information(3) ' Страница подписи
                p2 = currPara.Range.Characters(1).Information(3) ' Страница начала текста
                
                ' Если текст на той же странице — ставим Enter
                If p1 = p2 Then
                    captionPara.Range.InsertParagraphAfter
                End If
            End If
        End If
    Next i
End Sub

' Функция проверки пустого абзаца
Function IsEmptyPara(p As Paragraph) As Boolean
    Dim t As String
    t = p.Range.Text
    t = Replace(t, vbCr, "")
    t = Replace(t, " ", "")
    t = Replace(t, vbTab, "")
    t = Replace(t, Chr(12), "") ' Разрыв страницы
    IsEmptyPara = (Len(t) = 0)
End Function

' Универсальная замена
Sub GlobalReplace(rngTarget As Range, fText As String, rText As String, wildcards As Boolean)
    Dim r As Range
    Set r = Selection.Range
    With r.Find
        .ClearFormatting
        .Replacement.ClearFormatting
        .Text = fText
        .Replacement.Text = rText
        .MatchWildcards = wildcards
        .Forward = True
        .Wrap = wdFindStop
        .Execute Replace:=2
    End With
End Sub