Initial commit
This commit is contained in:
commit
04b897656c
41
VBAMake.txt
Normal file
41
VBAMake.txt
Normal file
|
@ -0,0 +1,41 @@
|
|||
# == Properties Section ==
|
||||
# configuration properties
|
||||
# use .ini format to define properties
|
||||
# mandatory properties: name, artifact_home, source_home
|
||||
|
||||
id = WordHelper
|
||||
name = WordHelper
|
||||
description = Надстройка КОНЦЕПТ для Word
|
||||
artifact_home = Addins
|
||||
source_home = WordAI
|
||||
install_home = \\fs1.concept.ru\projects\04 Направления деятельности\60 КИВТ\21 Надстройки\WORD
|
||||
|
||||
%%
|
||||
# === Build section ===
|
||||
# Available commands:
|
||||
# build LOCAL_MANIFEST
|
||||
# copy LOCAL_SOURCE -> [LOCAL_ARTIFACT]
|
||||
# save_as LOCAL_ARTIFACT -> LOCAL_ARTIFACT
|
||||
# run LOCAL_SOURCE.bat
|
||||
|
||||
build script\manifest.txt
|
||||
copy distr\Word.docx
|
||||
copy distr\banned-words.txt
|
||||
|
||||
%%
|
||||
# === Install section ==
|
||||
# Available commands:
|
||||
# install LOCAL_ARTIFACT -> [INSTALL_PATH]
|
||||
# add_template LOCAL_ARTIFACT -> [LOCAL_TEMPLATE]
|
||||
# run LOCAL_ARTIFACT.bat <- [PARAMETERS]
|
||||
# run APPLICATION <- [PARAMETERS]
|
||||
|
||||
install CONCEPT.dotm
|
||||
install CONCEPT.dotm -> \\fs1.concept.ru\Exchange\ConceptDistr\data\Add-ins\Word\CONCEPT.dotm
|
||||
|
||||
install Word.docx
|
||||
install Word.docx -> \\fs1.concept.ru\projects\10 Автоматизация деятельности\02 Офисная автоматизация\!Надстройки\Word.docx
|
||||
|
||||
install banned-words.txt
|
||||
install banned-words.txt -> \\fs1.concept.ru\Exchange\ConceptDistr\models\banned-words.txt
|
||||
install banned-words.txt -> \\fs1.concept.ru\projects\10 Автоматизация деятельности\!Concept\models\banned-words.txt
|
BIN
distr/Word.docx
Normal file
BIN
distr/Word.docx
Normal file
Binary file not shown.
125
distr/banned-words.txt
Normal file
125
distr/banned-words.txt
Normal file
|
@ -0,0 +1,125 @@
|
|||
никогда
|
||||
нигде
|
||||
эффективность
|
||||
эффективности
|
||||
эффективностью
|
||||
минимальный
|
||||
минимального
|
||||
минимальная
|
||||
минимальной
|
||||
минимальному
|
||||
минимальным
|
||||
минимальные
|
||||
минимальными
|
||||
минимальному
|
||||
максимальный
|
||||
максимальная
|
||||
максимальные
|
||||
максимальным
|
||||
максимальному
|
||||
максимальной
|
||||
максимальными
|
||||
минимизация
|
||||
минимизации
|
||||
минимизацией
|
||||
глобальный
|
||||
глобальная
|
||||
глобальные
|
||||
глобальным
|
||||
глобальной
|
||||
глобальными
|
||||
глобальному
|
||||
беспрецедентный
|
||||
беспрецедентная
|
||||
беспрецедентные
|
||||
беспрецедентным
|
||||
беспрецедентному
|
||||
беспрецедентными
|
||||
беспрецедентной
|
||||
предельный
|
||||
предельная
|
||||
предельные
|
||||
предельным
|
||||
предельному
|
||||
предельной
|
||||
предельными
|
||||
уникальный
|
||||
уникальная
|
||||
уникальные
|
||||
уникальным
|
||||
уникальными
|
||||
уникальному
|
||||
уникальной
|
||||
реальный
|
||||
реальная
|
||||
реальные
|
||||
реальным
|
||||
реальными
|
||||
реальному
|
||||
реальной
|
||||
всегда
|
||||
подавляющий
|
||||
подавляющего
|
||||
подавляющим
|
||||
подавляющему
|
||||
подавляющем
|
||||
подавляющая
|
||||
подавляющей
|
||||
подавляющие
|
||||
подавляющим
|
||||
подавляющих
|
||||
было
|
||||
был
|
||||
была
|
||||
были
|
||||
эффективный
|
||||
эффективная
|
||||
эффективное
|
||||
эффективные
|
||||
эффективным
|
||||
эффективной
|
||||
эффективными
|
||||
эффективных
|
||||
эффективному
|
||||
эффективном
|
||||
неэффективный
|
||||
неэффективная
|
||||
неэффективное
|
||||
неэффективные
|
||||
неэффективным
|
||||
неэффективной
|
||||
неэффективными
|
||||
неэффективных
|
||||
неэффективному
|
||||
неэффективном
|
||||
минимально
|
||||
максимально
|
||||
эффективно
|
||||
недавно
|
||||
существует
|
||||
существуют
|
||||
существовать
|
||||
текущий
|
||||
текущая
|
||||
текущие
|
||||
текущему
|
||||
текущей
|
||||
текущим
|
||||
текущими
|
||||
текущих
|
||||
постоянно
|
||||
очевидно
|
||||
просто
|
||||
сразу
|
||||
любой бред
|
||||
любого бреда
|
||||
любому бреду
|
||||
любым бредом
|
||||
любом бреде
|
||||
какой-то
|
||||
какая-то
|
||||
какие-то
|
||||
какому-то
|
||||
какой-то
|
||||
каким-то
|
||||
какими-то
|
87
script/manifest.txt
Normal file
87
script/manifest.txt
Normal file
|
@ -0,0 +1,87 @@
|
|||
# == Properties Section ==
|
||||
# configuration properties
|
||||
# use .ini format to define properties
|
||||
# mandatory properties: name, artifact
|
||||
|
||||
name = CONCEPT.dotm
|
||||
artifact = CONCEPT.dotm
|
||||
|
||||
%%
|
||||
# === Imports Section ===
|
||||
# Hierarchy of folders and files
|
||||
# Use Tabulator to mark next level in hierarchy
|
||||
# All folders are nested into SharedHome path
|
||||
|
||||
dev
|
||||
DevTester.bas
|
||||
|
||||
api
|
||||
ex_WinAPI.bas
|
||||
API_WordWrapper.cls
|
||||
API_XLWrapper.cls
|
||||
API_UserInteraction.cls
|
||||
|
||||
word
|
||||
ex_Word.bas
|
||||
API_WordEditGuard.cls
|
||||
|
||||
utility
|
||||
ex_VBA.bas
|
||||
ex_Version.bas
|
||||
|
||||
API_DistrManifest.cls
|
||||
API_Config.cls
|
||||
API_JSON.cls
|
||||
|
||||
ui
|
||||
CSE_ProgressBar.frm
|
||||
|
||||
%%
|
||||
# === Source Code Section ==
|
||||
# Hierarchy of folders and files
|
||||
# Use Tabulator to mark next level in hierarchy
|
||||
# All folders are nested into SourceHome path
|
||||
|
||||
src
|
||||
DevHelper.bas
|
||||
Declarations.bas
|
||||
Main.bas
|
||||
MainImpl.bas
|
||||
z_UIMessages.bas
|
||||
z_UIRibbon.bas
|
||||
|
||||
RulesAccess.bas
|
||||
DocumentEditor.cls
|
||||
RulesProcessor.cls
|
||||
BracketItem.cls
|
||||
|
||||
LMUFunctions.bas
|
||||
LinkFunctions.bas
|
||||
LinkMappingUnit.cls
|
||||
LMUItem.cls
|
||||
|
||||
s_RulesProcessor.cls
|
||||
|
||||
%%
|
||||
# ===== UI Section =======
|
||||
# Pairs of path to UI elements, use " -> " delimiter
|
||||
# First component is a path relative to SourceHome\ui folders
|
||||
# Second component is internal path inside project file
|
||||
|
||||
.rels -> _rels\.rels
|
||||
customUI.xml -> customUI\customUI.xml
|
||||
customizations.xml -> word\customizations.xml
|
||||
|
||||
%%
|
||||
# === References Section ===
|
||||
# List dependencies in one of the formats
|
||||
# global : GLOBAL_NAME
|
||||
# guid : {REGISTERED_GUID}
|
||||
# file : PATH_TO_LIBRARY
|
||||
|
||||
global : Shell32
|
||||
global : Scripting
|
||||
global : Excel
|
||||
global : MSForms
|
||||
global : ADODB
|
||||
global : IWshRuntimeLibrary
|
BIN
skeleton/CONCEPT.dotm
Normal file
BIN
skeleton/CONCEPT.dotm
Normal file
Binary file not shown.
14
src/BracketItem.cls
Normal file
14
src/BracketItem.cls
Normal file
|
@ -0,0 +1,14 @@
|
|||
VERSION 1.0 CLASS
|
||||
BEGIN
|
||||
MultiUse = -1 'True
|
||||
END
|
||||
Attribute VB_Name = "BracketItem"
|
||||
Attribute VB_GlobalNameSpace = False
|
||||
Attribute VB_Creatable = False
|
||||
Attribute VB_PredeclaredId = False
|
||||
Attribute VB_Exposed = False
|
||||
' ====== Êëàññ ýëåìåíòà ñòåêà ñêîáîê =====
|
||||
|
||||
Public brType As BracketType ' Òèï ñêîáêè: êðóãëàÿ, êâàäðàòíàÿ, ôèãóðíàÿ
|
||||
Public brRange As Word.Range ' Ïðèâÿçêà ñêîáêè ê òåêñòó
|
||||
Public brMark As Boolean ' Ôëàã äëÿ ïðîõîäà ïî ýëåìåíòàì ñòåêà
|
36
src/Declarations.bas
Normal file
36
src/Declarations.bas
Normal file
|
@ -0,0 +1,36 @@
|
|||
Attribute VB_Name = "Declarations"
|
||||
Option Explicit
|
||||
|
||||
Public Const CONCEPT_SERVER_HOME = "\\fs1.concept.ru\projects\10 Àâòîìàòèçàöèÿ äåÿòåëüíîñòè\!Concept\"
|
||||
Public Const CONCEPT_LOCAL_HOME = ".concept\"
|
||||
Public Const CONCEPT_BANNED_WORDS = "banned-words.txt"
|
||||
Public Const CONCEPT_MASTER_CONFIG = "master-config.json"
|
||||
|
||||
Public Const SERVER_PATH_HELP = "\\fs1.concept.ru\projects\10 Àâòîìàòèçàöèÿ äåÿòåëüíîñòè\02 Îôèñíàÿ àâòîìàòèçàöèÿ\!Íàäñòðîéêè\Word.docx"
|
||||
Public Const SERVER_MASTER_TEXT = "\\fs1.concept.ru\projects\10 Àâòîìàòèçàöèÿ äåÿòåëüíîñòè\01 Âûñîêèå òåõíîëîãèè\ÂÒ-04 Ìàñòåð òåêñòîâ\Ìàñòåð òåêñòîâ.xlsm"
|
||||
|
||||
Public Const SERVER_ADDIN_EXCEL = "\\fs1.concept.ru\Data\Add-ins\Excel"
|
||||
|
||||
Public Const ADDIN_NAME_CONCEPT = "CONCEPT.xlam"
|
||||
Public Const ADDIN_NAME_REPORT = "ConceptReport.xlam"
|
||||
|
||||
Public Const CELL_MASTER_PATH = "c_DocPath"
|
||||
|
||||
Public Const PAR_SCALE_MAX = 0.25
|
||||
Public Const PAR_SCALE_STEP = 0.1
|
||||
|
||||
Public Enum BracketType
|
||||
BT_PAP = 0
|
||||
BT_SQU = 1
|
||||
BT_FIG = 2
|
||||
End Enum
|
||||
|
||||
Public Function GetBracketType(sChr$) As BracketType
|
||||
' ----- Îïðåäåëåíèå òèïà ñêîáîê ----------
|
||||
Dim rndB$: rndB = "[\(\)]"
|
||||
'Dim sqrB$: sqrB = "[" & "]"
|
||||
Dim figB$: figB = "[\{\}]"
|
||||
GetBracketType = BT_SQU
|
||||
If sChr Like rndB Then GetBracketType = BT_PAP
|
||||
If sChr Like figB Then GetBracketType = BT_FIG
|
||||
End Function
|
20
src/DevHelper.bas
Normal file
20
src/DevHelper.bas
Normal file
|
@ -0,0 +1,20 @@
|
|||
Attribute VB_Name = "DevHelper"
|
||||
Option Explicit
|
||||
|
||||
Public Function Dev_PrepareSkeleton()
|
||||
ThisDocument.Range.Text = vbNullString
|
||||
End Function
|
||||
|
||||
Public Sub ADev_ManualRunTest()
|
||||
Dim sSuite$: sSuite = "s_RulesProcessor"
|
||||
Dim sTest$: sTest = "t_Quotes"
|
||||
Dim sMsg$: sMsg = Dev_RunTestDebug(sSuite, sTest)
|
||||
Debug.Print sMsg
|
||||
Call MsgBox(sMsg)
|
||||
End Sub
|
||||
|
||||
Public Function Dev_GetTestSuite(sName$) As Object
|
||||
Select Case sName
|
||||
Case "s_RulesProcessor": Set Dev_GetTestSuite = New s_RulesProcessor
|
||||
End Select
|
||||
End Function
|
221
src/DocumentEditor.cls
Normal file
221
src/DocumentEditor.cls
Normal file
|
@ -0,0 +1,221 @@
|
|||
VERSION 1.0 CLASS
|
||||
BEGIN
|
||||
MultiUse = -1 'True
|
||||
END
|
||||
Attribute VB_Name = "DocumentEditor"
|
||||
Attribute VB_GlobalNameSpace = False
|
||||
Attribute VB_Creatable = False
|
||||
Attribute VB_PredeclaredId = False
|
||||
Attribute VB_Exposed = False
|
||||
Option Explicit
|
||||
|
||||
Private Const ERROR_HIGHLIGHT_COLOR = wdViolet
|
||||
Private Const COMMENT_PREFIX_BM = "zCOMMENT_TMP_"
|
||||
|
||||
Private document_ As Word.Document
|
||||
Private highlightErrors_ As Boolean
|
||||
Private commentUnresolved_ As Boolean
|
||||
|
||||
Private comments_ As Scripting.Dictionary
|
||||
|
||||
Public Function Init(target As Word.Document, iConfig As API_Config)
|
||||
Set document_ = target
|
||||
Set comments_ = New Scripting.Dictionary
|
||||
highlightErrors_ = iConfig.GetValue("HighlightErrors", False)
|
||||
commentUnresolved_ = iConfig.GetValue("CommentUnresolved", True)
|
||||
End Function
|
||||
|
||||
Public Property Get Document() As Word.Document
|
||||
Set Document = document_
|
||||
End Property
|
||||
|
||||
Public Function MarkError(target As Word.Range, sComment$)
|
||||
' Îòìå÷àåì îøèáêó
|
||||
If highlightErrors_ Then _
|
||||
Call FormatRange(target)
|
||||
If commentUnresolved_ Then _
|
||||
Call AddCommentToRange(target, sComment)
|
||||
End Function
|
||||
|
||||
Public Function FormatRange(target As Word.Range)
|
||||
' Âûäåëÿåì íàéäåííóþ îøèáêó
|
||||
Dim tmpRevision As Boolean: tmpRevision = document_.TrackRevisions
|
||||
document_.TrackRevisions = False
|
||||
target.HighlightColorIndex = ERROR_HIGHLIGHT_COLOR
|
||||
document_.TrackRevisions = tmpRevision
|
||||
End Function
|
||||
|
||||
Public Function AddBookmark(target As Word.Range, sPrefix$) As String
|
||||
Dim nIndex&: nIndex = document_.Bookmarks.Count + 1
|
||||
Dim sBookmark$: sBookmark = sPrefix & nIndex
|
||||
Do While document_.Bookmarks.Exists(sBookmark)
|
||||
nIndex = nIndex - 1
|
||||
sBookmark = sPrefix & nIndex
|
||||
Loop
|
||||
|
||||
AddBookmark = sBookmark
|
||||
If target.Bookmarks.Add(sBookmark, target) Is Nothing Then _
|
||||
Call Err.Raise(vbObjectError)
|
||||
End Function
|
||||
|
||||
Public Function AddCommentToRange(target As Word.Range, sComment$)
|
||||
' Äîáàâëÿåì êîììåíòàðèé (çàïîìèíàåì, ÷òî íóæíî äîáàâèòü)
|
||||
Dim sBookmark$: sBookmark = AddBookmark(target, COMMENT_PREFIX_BM)
|
||||
If sBookmark = vbNullString Then _
|
||||
Exit Function
|
||||
Call comments_.Add(sBookmark, sComment)
|
||||
End Function
|
||||
|
||||
Public Function AddGlobalComment(sComment$)
|
||||
' Äîáàâëÿåì â äîêóìåíò êîììåíòàðèé ê ïåðâîìó àáçàöó
|
||||
Dim iRange As Word.Range: Set iRange = document_.Paragraphs(1).Range
|
||||
If iRange.Comments.Count = 0 Then _
|
||||
Call iRange.Comments.Add(iRange)
|
||||
|
||||
Dim theBM As Word.Comment: Set theBM = iRange.Comments(1)
|
||||
If theBM.Range.Text = vbNullString Then
|
||||
theBM.Range.Text = sComment
|
||||
Else
|
||||
theBM.Range.Text = theBM.Range.Text & vbNewLine & sComment
|
||||
End If
|
||||
End Function
|
||||
|
||||
Public Function SetupFindLiteral(sSearch$) As Word.Range
|
||||
Dim rFind As Word.Range: Set rFind = document_.Range
|
||||
rFind.Find.ClearFormatting
|
||||
With rFind.Find
|
||||
.Text = sSearch
|
||||
.Format = True
|
||||
.Font.Hidden = False
|
||||
.MatchWildcards = False
|
||||
.Forward = True
|
||||
End With
|
||||
Set SetupFindLiteral = rFind
|
||||
End Function
|
||||
|
||||
Public Function SetupFindWildcard(sSearch$) As Word.Range
|
||||
Dim rFind As Word.Range: Set rFind = document_.Range
|
||||
rFind.Find.ClearFormatting
|
||||
With rFind.Find
|
||||
.Text = sSearch
|
||||
.Format = True
|
||||
.Font.Hidden = False
|
||||
.MatchWildcards = True
|
||||
.Forward = True
|
||||
End With
|
||||
Set SetupFindWildcard = rFind
|
||||
End Function
|
||||
|
||||
Public Function ReplaceText(sFind$, sReplacement$, bApplyFix As Boolean, Optional sComment$ = vbNullString) As Long
|
||||
ReplaceText = FindAndReplace(sFind, sReplacement, bApplyFix, sComment, _
|
||||
bCase:=False, bWildcard:=False, bWhole:=True)
|
||||
End Function
|
||||
|
||||
Public Function ReplaceWC(sFind$, sReplacement$, bApplyFix As Boolean, Optional sComment$ = vbNullString) As Long
|
||||
ReplaceWC = FindAndReplace(sFind, sReplacement, bApplyFix, sComment, _
|
||||
bCase:=False, bWildcard:=True, bWhole:=False)
|
||||
End Function
|
||||
|
||||
Public Function FindAndReplace(sFind$, sReplacement$, _
|
||||
bApplyFix As Boolean, Optional sComment$ = vbNullString, _
|
||||
Optional bCase As Boolean = False, _
|
||||
Optional bWildcard As Boolean = False, _
|
||||
Optional bWhole As Boolean = True) As Long
|
||||
' Îñóùåñòâëÿåì ïîäñòàíîâêè â ôàéëå è ñ÷èòàåì èõ ÷èñëî
|
||||
Dim result&: result = 0
|
||||
Dim rFind As Word.Range: Set rFind = document_.Range
|
||||
With rFind.Find
|
||||
.Text = sFind
|
||||
.Replacement.Text = IIf(bApplyFix, sReplacement, "")
|
||||
.Format = True
|
||||
.Font.Hidden = False
|
||||
.MatchCase = bCase
|
||||
.MatchWholeWord = bWhole
|
||||
.MatchWildcards = bWildcard
|
||||
.Forward = True
|
||||
End With
|
||||
|
||||
Do While rFind.Find.Execute(Replace:=1 * bApplyFix)
|
||||
result = result + 1
|
||||
If Not bApplyFix Then _
|
||||
Call MarkError(rFind, sComment)
|
||||
Call rFind.Collapse(wdCollapseEnd)
|
||||
Loop
|
||||
|
||||
FindAndReplace = result
|
||||
End Function
|
||||
|
||||
Public Function ReplaceCascade(sFind$, _
|
||||
findText2$, repText2$, bApplyFix As Boolean, _
|
||||
Optional sComment$ = vbNullString, _
|
||||
Optional bCase As Boolean = False, _
|
||||
Optional bWildcard As Boolean = False, _
|
||||
Optional bWhole As Boolean = False) As Long
|
||||
' Îñóùåñòâëÿåì ïîäñòàíîâêè â ðåæèìå ðåöåíçèðîâàíèÿ ñ ó÷åòîì bWildcard
|
||||
' Ýòî îñîáûé ñëó÷àé, ñâÿçàííûé ñ íåêîððåêòíûìè ïîäñòàíîâêàìè â ðåæèìå ðåöåíçèðîâàíèÿ è èñïîëüçîâàíèÿ "\1"
|
||||
Dim result&: result = 0
|
||||
If repText2 = vbNullString And bApplyFix Then
|
||||
ReplaceCascade = result
|
||||
Debug.Print "Íåêîððåêòíûé àðãóìåíò: ïóñòàÿ ñòðîêà çàìåíû"
|
||||
Exit Function
|
||||
End If
|
||||
|
||||
Dim rFind As Word.Range: Set rFind = document_.Range
|
||||
With rFind.Find
|
||||
.Text = sFind
|
||||
.MatchWildcards = True
|
||||
.Forward = True
|
||||
.Format = True
|
||||
.Font.Hidden = False
|
||||
|
||||
Do While .Execute
|
||||
.Text = findText2
|
||||
.Replacement.Text = repText2
|
||||
.MatchCase = bCase
|
||||
.MatchWholeWord = bWhole
|
||||
.MatchWildcards = bWildcard
|
||||
|
||||
If .Execute(Replace:=1 * bApplyFix) Then
|
||||
result = result + 1
|
||||
If Not bApplyFix Then _
|
||||
Call MarkError(rFind, sComment)
|
||||
End If
|
||||
|
||||
.Text = sFind
|
||||
.Replacement.Text = vbNullString
|
||||
.MatchCase = False
|
||||
.MatchWholeWord = False
|
||||
.MatchWildcards = True
|
||||
|
||||
Call rFind.Collapse(wdCollapseEnd)
|
||||
Loop
|
||||
End With
|
||||
|
||||
ReplaceCascade = result
|
||||
End Function
|
||||
|
||||
Public Function FinalizeComments()
|
||||
' Âñòàâëÿåì âñå êîììåíòàðèè (ïîñëå ïðîâåðêè âñåõ ïðàâèë)
|
||||
On Error Resume Next
|
||||
If document_.Bookmarks.Count = 0 Then _
|
||||
Exit Function
|
||||
|
||||
If CSE_ProgressBar.Visible Then _
|
||||
Call CSE_ProgressBar.Init("", sHeader:="Îòìå÷àåì íàéäåííûå íåñîîòâåòñòâèÿ...", minVal:=0, curVal:=1, maxVal:=comments_.Count)
|
||||
|
||||
Dim target As Word.Range
|
||||
Dim vBookmark As Variant
|
||||
For Each vBookmark In comments_.Keys()
|
||||
If Not document_.Bookmarks.Exists(CStr(vBookmark)) Then _
|
||||
GoTo NEXT_ITEM
|
||||
Set target = document_.Bookmarks(vBookmark).Range
|
||||
Call document_.Bookmarks(vBookmark).Delete
|
||||
Call target.Comments.Add(target, comments_(vBookmark))
|
||||
NEXT_ITEM:
|
||||
If CSE_ProgressBar.Visible Then _
|
||||
Call CSE_ProgressBar.IncrementA
|
||||
Next
|
||||
|
||||
Set comments_ = New Scripting.Dictionary
|
||||
End Function
|
||||
|
26
src/LMUFunctions.bas
Normal file
26
src/LMUFunctions.bas
Normal file
|
@ -0,0 +1,26 @@
|
|||
Attribute VB_Name = "LMUFunctions"
|
||||
'===== Ìîäóëü âíåøíèõ ôóíêöèé äëÿ êëàññà ïðîâåðêè ññûëîê =====
|
||||
Option Explicit
|
||||
Option Private Module
|
||||
|
||||
Public Type LMU_LinksInfo
|
||||
lnkCount_ As Long
|
||||
errCount_ As Long
|
||||
modCount_ As Long
|
||||
End Type
|
||||
|
||||
Public Enum LMU_Return
|
||||
RV_LINK_OK
|
||||
RV_LINK_FIXED
|
||||
RV_LINK_NOFIX
|
||||
RV_NOTAFSO
|
||||
End Enum
|
||||
|
||||
Public Function GetLMU() As LinkMappingUnit
|
||||
Static result As LinkMappingUnit ' Ñòàòè÷åñêàÿ ïåðåìåííàÿ
|
||||
If result Is Nothing Then
|
||||
' Îòêðûâàåì êîííåêò ïðè ïåðâîì îáðàùåíèè
|
||||
Set result = New LinkMappingUnit
|
||||
End If
|
||||
Set GetLMU = result
|
||||
End Function
|
20
src/LMUItem.cls
Normal file
20
src/LMUItem.cls
Normal file
|
@ -0,0 +1,20 @@
|
|||
VERSION 1.0 CLASS
|
||||
BEGIN
|
||||
MultiUse = -1 'True
|
||||
END
|
||||
Attribute VB_Name = "LMUItem"
|
||||
Attribute VB_GlobalNameSpace = False
|
||||
Attribute VB_Creatable = False
|
||||
Attribute VB_PredeclaredId = False
|
||||
Attribute VB_Exposed = False
|
||||
' ===== Êëàññ ýëåìåíòà ïåðå÷íÿ çàìåí =======
|
||||
Public repWhat As String
|
||||
Public repList As Collection
|
||||
Private i As Integer
|
||||
|
||||
'---------- Event handlers and misc code ----------
|
||||
Private Sub Class_Initialize()
|
||||
' Initializing the object
|
||||
Set repList = New Collection
|
||||
repWhat = vbNullString
|
||||
End Sub
|
60
src/LinkFunctions.bas
Normal file
60
src/LinkFunctions.bas
Normal file
|
@ -0,0 +1,60 @@
|
|||
Attribute VB_Name = "LinkFunctions"
|
||||
'============== Ìîäóëü îáðàáîòêè ññûëîê ===============
|
||||
Option Explicit
|
||||
Option Private Module
|
||||
|
||||
Public Function GetFullPath(ByVal addr$, docpath$) As String
|
||||
' Ïðåîáðàçîâàíèå îòíîñèòåëüíûõ ïóòåé â àáñîëþòíûå
|
||||
If Left(addr, 1) = "." Or InStr(addr, "\") + InStr(addr, "/") = 0 Then
|
||||
If Not docpath = vbNullString Then
|
||||
addr = docpath & "\" & addr
|
||||
Else
|
||||
GetFullPath = addr
|
||||
Exit Function
|
||||
End If
|
||||
End If
|
||||
|
||||
Dim leftSide$
|
||||
Do While InStr(addr, "../") <> 0
|
||||
leftSide = Left(addr, InStr(addr, "../") - 1)
|
||||
leftSide = Left(leftSide, InStrRev(leftSide, "\", Len(leftSide) - 1))
|
||||
addr = leftSide & Right(addr, Len(addr) - InStr(addr, "../") - 2)
|
||||
Loop
|
||||
|
||||
GetFullPath = Replace(addr, "/", "\")
|
||||
End Function
|
||||
|
||||
Public Function ConvertLinkToLocal(ByVal addr$) As String
|
||||
' Ïðåîáðàçîâàíèå ññûëêè èç P:\ â \\STRG1\...
|
||||
ConvertLinkToLocal = addr
|
||||
If Left(addr, 3) Like "P:\" Then _
|
||||
ConvertLinkToLocal = "\\STRG1\Projects\" & Right(addr, Len(addr) - 3)
|
||||
If Left(addr, 3) Like "X:\" Then _
|
||||
ConvertLinkToLocal = "\\Server\Exchange\" & Right(addr, Len(addr) - 3)
|
||||
End Function
|
||||
|
||||
Public Function ConvertLinkToURL(ByVal addr$) As String
|
||||
' Ïðåîáðàçîâàíèå ññûëêè èç \\STRG1\... â P:\ è \\server\... â X:\
|
||||
ConvertLinkToURL = addr
|
||||
If Left(addr, 17) Like "\\[Ss][Tt][Rr][Gg]1\[Pp]rojects\" Then _
|
||||
ConvertLinkToURL = "P:\" & Right(addr, Len(addr) - 17)
|
||||
If Left(addr, 18) Like "\\[Ss][Ee][Rr][Vv][Ee][Rr]\[Ee]xchange\" Then _
|
||||
ConvertLinkToURL = "X:\" & Right(addr, Len(addr) - 18)
|
||||
End Function
|
||||
|
||||
Public Function SafeGetHLinkAddress(hLink As Hyperlink) As String
|
||||
' Îáðàáàòûâàåì êðèâûå ññûëêè è íå òîëüêî ñì. îøèáêà 4198
|
||||
On Error GoTo PICK_RANGE
|
||||
SafeGetHLinkAddress = hLink.Address
|
||||
|
||||
Exit Function
|
||||
PICK_RANGE:
|
||||
SafeGetHLinkAddress = hLink.Range.Text
|
||||
End Function
|
||||
|
||||
Public Function IsSamePath(ByVal hLinkText$, ByVal hLinkAddress$, docpath$) As Boolean
|
||||
IsSamePath = False
|
||||
hLinkText = UCase(ConvertLinkToURL(GetFullPath(hLinkText, docpath)))
|
||||
hLinkAddress = UCase(ConvertLinkToURL(GetFullPath(hLinkAddress, docpath)))
|
||||
If InStr(hLinkText, hLinkAddress) = 1 And Abs(Len(hLinkText) - Len(hLinkAddress)) <= 1 Then IsSamePath = True
|
||||
End Function
|
128
src/LinkMappingUnit.cls
Normal file
128
src/LinkMappingUnit.cls
Normal file
|
@ -0,0 +1,128 @@
|
|||
VERSION 1.0 CLASS
|
||||
BEGIN
|
||||
MultiUse = -1 'True
|
||||
END
|
||||
Attribute VB_Name = "LinkMappingUnit"
|
||||
Attribute VB_GlobalNameSpace = False
|
||||
Attribute VB_Creatable = False
|
||||
Attribute VB_PredeclaredId = False
|
||||
Attribute VB_Exposed = False
|
||||
' Ìîäóëü äëÿ ïðîâåðêè è êîððåêòèðîâêè ññûëîê
|
||||
Option Explicit
|
||||
|
||||
Private m_ReplaceMap As Collection
|
||||
|
||||
'---------- Public Interface ----------
|
||||
Public Function FixLink(ByRef adr$) As LMU_Return
|
||||
' Ïðîâåðêà ññûëîê
|
||||
Dim testAdr$
|
||||
If Not IsFSO(adr, "") Then
|
||||
FixLink = RV_NOTAFSO
|
||||
Exit Function
|
||||
End If
|
||||
|
||||
If IsValidAddress(adr) Then
|
||||
testAdr = ConvertLinkToURL(adr)
|
||||
If CheckFile(testAdr, testAdr) Then
|
||||
FixLink = RV_LINK_OK
|
||||
Exit Function
|
||||
End If
|
||||
End If
|
||||
|
||||
testAdr = SwapStrgServer(adr)
|
||||
If CheckFile(testAdr, testAdr) Then
|
||||
FixLink = RV_LINK_FIXED
|
||||
adr = ConvertLinkToLocal(testAdr)
|
||||
Exit Function
|
||||
End If
|
||||
|
||||
Dim j&, k&
|
||||
Dim rule As LMUItem
|
||||
Dim result$
|
||||
For j = 1 To m_ReplaceMap.Count
|
||||
Set rule = m_ReplaceMap.Item(j)
|
||||
If InStr(adr, rule.repWhat) = 0 Then _
|
||||
GoTo NEXT_RULE
|
||||
|
||||
For k = 1 To rule.repList.Count
|
||||
result = Replace(testAdr, rule.repWhat, rule.repList(k))
|
||||
If CheckFile(result, "") Then
|
||||
adr = ConvertLinkToLocal(result)
|
||||
FixLink = RV_LINK_FIXED
|
||||
Exit Function
|
||||
End If
|
||||
Next k
|
||||
NEXT_RULE:
|
||||
Next j
|
||||
|
||||
FixLink = RV_LINK_NOFIX
|
||||
End Function
|
||||
|
||||
'---------- Event handlers and misc code ----------
|
||||
Private Sub Class_Initialize()
|
||||
Set m_ReplaceMap = New Collection
|
||||
Dim rule As LMUItem
|
||||
Set rule = New LMUItem
|
||||
rule.repWhat = "01 Income-ïðîåêòû"
|
||||
rule.repList.Add ("00 Àðõèâ\01 Èíêàì")
|
||||
Call m_ReplaceMap.Add(rule)
|
||||
|
||||
Set rule = New LMUItem
|
||||
rule.repWhat = "02 Outcome-ïðîåêòû"
|
||||
rule.repList.Add ("00 Àðõèâ\02 Àóòêàì")
|
||||
Call m_ReplaceMap.Add(rule)
|
||||
|
||||
Set rule = New LMUItem
|
||||
rule.repWhat = "03 Ïåðåãîâîðû Àêòèâíûå"
|
||||
rule.repList.Add ("00 Àðõèâ\03 Ïåðåãîâîðû")
|
||||
rule.repList.Add ("01 Income-ïðîåêòû")
|
||||
rule.repList.Add ("02 Outcome-ïðîåêòû")
|
||||
Call m_ReplaceMap.Add(rule)
|
||||
|
||||
Set rule = New LMUItem
|
||||
rule.repWhat = "031 Ïåðåãîâîðû âîçìîæíûå"
|
||||
rule.repList.Add ("00 Àðõèâ\03 Ïåðåãîâîðû")
|
||||
rule.repList.Add ("03 Ïåðåãîâîðû Àêòèâíûå")
|
||||
Call m_ReplaceMap.Add(rule)
|
||||
|
||||
Set rule = New LMUItem
|
||||
rule.repWhat = "05 ÑÎÓ Êîíöåïò\ÍÒÑ"
|
||||
rule.repList.Add ("05 ÑÎÓ Êîíöåïò\04 ÍÒÑ")
|
||||
Call m_ReplaceMap.Add(rule)
|
||||
End Sub
|
||||
|
||||
Private Function IsValidAddress(ByVal addr$) As Boolean
|
||||
IsValidAddress = True
|
||||
If Left(addr, Len("\\server\Projects")) Like "\\[Ss][Ee][Rr][Vv][Ee][Rr]\[Pp]rojects" Then IsValidAddress = False
|
||||
If Left(addr, Len("\\strg1\Exchange")) Like "\\[Ss][Tt][Rr][Gg]1\[Ee]xchange" Then IsValidAddress = False
|
||||
End Function
|
||||
|
||||
Private Function IsFSO(addr$, docpath$) As Boolean
|
||||
'Ïðîâåðêà ëîêàëüíûõ ññûëîê
|
||||
addr = GetFullPath(addr, docpath)
|
||||
If Left(addr, 3) Like "[PpXx]:\" Then IsFSO = True: Exit Function
|
||||
If Left(addr, 16) Like "\\[Ss][Tt][Rr][Gg]1\[Pp]rojects" Then IsFSO = True: Exit Function
|
||||
If Left(addr, 16) Like "\\[Ss][Tt][Rr][Gg]1\[Ee]xchange" Then IsFSO = True: Exit Function
|
||||
If Left(addr, 17) Like "\\[Ss][Ee][Rr][Vv][Ee][Rr]\[Ee]xchange" Then IsFSO = True: Exit Function
|
||||
If Left(addr, 17) Like "\\[Ss][Ee][Rr][Vv][Ee][Rr]\[Pp]rojects" Then IsFSO = True: Exit Function
|
||||
|
||||
IsFSO = False
|
||||
End Function
|
||||
|
||||
Private Function CheckFile(ByVal addr$, currentPath$) As Boolean
|
||||
' Ïðîâåðêà ñóùåñòâîâàíèÿ ôàéëà
|
||||
If Left(addr, 1) = "." Or InStr(addr, "\") + InStr(addr, "/") = 0 Then _
|
||||
addr = currentPath & "\" & addr
|
||||
|
||||
On Error Resume Next
|
||||
CheckFile = Len(Dir(addr)) <> 0 Or Len(Dir(addr, vbDirectory)) <> 0
|
||||
End Function
|
||||
|
||||
Private Function SwapStrgServer(ByVal addr$)
|
||||
SwapStrgServer = addr
|
||||
If Left(addr, Len("\\server\Projects")) Like "\\[Ss][Ee][Rr][Vv][Ee][Rr]\[Pp]rojects" Then _
|
||||
SwapStrgServer = "P:\" + Right(addr, Len(addr) - Len("\\server\Projects\"))
|
||||
If Left(addr, Len("\\strg1\Exchange")) Like "\\[Ss][Tt][Rr][Gg]1\[Ee]xchange" Then _
|
||||
SwapStrgServer = "X:\" + Right(addr, Len(addr) - Len("\\strg1\Exchange\"))
|
||||
End Function
|
||||
|
354
src/Main.bas
Normal file
354
src/Main.bas
Normal file
|
@ -0,0 +1,354 @@
|
|||
Attribute VB_Name = "Main"
|
||||
Option Explicit
|
||||
|
||||
Public Sub CC_AddColumnBreak()
|
||||
Dim selPar As Word.Range: Set selPar = ActiveDocument.ActiveWindow.Selection.Paragraphs.First.Range
|
||||
Call selPar.Collapse(wdCollapseStart)
|
||||
Call selPar.InsertBreak(wdColumnBreak)
|
||||
End Sub
|
||||
|
||||
Public Sub CC_NonBreakPar()
|
||||
ActiveDocument.ActiveWindow.Selection.ParagraphFormat.KeepTogether = Not ActiveDocument.ActiveWindow.Selection.ParagraphFormat.KeepTogether
|
||||
End Sub
|
||||
|
||||
Public Sub CC_WithNext()
|
||||
Selection.ParagraphFormat.KeepWithNext = Not Selection.ParagraphFormat.KeepWithNext
|
||||
End Sub
|
||||
|
||||
Public Sub CC_FieldLowerer()
|
||||
Dim tmpRange As Word.Range: Set tmpRange = ActiveDocument.ActiveWindow.Selection.Range.Duplicate
|
||||
tmpRange.Start = ActiveDocument.ActiveWindow.Selection.Words.First.Start
|
||||
tmpRange.End = ActiveDocument.ActiveWindow.Selection.Words.Last.End
|
||||
|
||||
On Error GoTo EXT_SUB
|
||||
Dim execField As Word.Field
|
||||
For Each execField In tmpRange.Fields
|
||||
Call LowerReference(execField)
|
||||
Next execField
|
||||
EXT_SUB:
|
||||
End Sub
|
||||
|
||||
Public Sub CC_MakeUniqueBM()
|
||||
Dim contextMap As Scripting.Dictionary: Set contextMap = RecreateBookmarks(ActiveDocument)
|
||||
Call FixHyperlinksAfterBMReplace(ActiveDocument, contextMap)
|
||||
Call UserInteraction.ShowMessage(IM_UNIQUE_BOOKMARKS_OK)
|
||||
End Sub
|
||||
|
||||
Public Sub CC_ConvertAllShapesToText()
|
||||
' Ïðâðàùåíèå øåéïîâ â òåêñò
|
||||
Dim theDoc As Word.Document: Set theDoc = ActiveDocument
|
||||
Dim tRange As Word.Range: Set tRange = theDoc.Range
|
||||
|
||||
Dim nShape&: nShape = 1
|
||||
Dim theText$
|
||||
|
||||
Dim aShape As Word.Shape
|
||||
Do While nShape <= theDoc.Shapes.Count ' Èòåðàöèÿ ïî íîìåðàì ïîñêîëüêó íóæíî óäàëÿòü ñàìè øåéïû
|
||||
Set aShape = theDoc.Shapes(nShape)
|
||||
If Not aShape.Anchor.InRange(tRange) Then _
|
||||
GoTo NEXT_SHAPE
|
||||
If aShape.Type <> msoTextBox Then _
|
||||
GoTo NEXT_SHAPE
|
||||
|
||||
theText = aShape.TextFrame.TextRange.Text
|
||||
|
||||
aShape.TextFrame.TextRange.Copy
|
||||
tRange.Paragraphs.Add
|
||||
Call tRange.Paragraphs.Last.Range.Paste
|
||||
|
||||
NEXT_SHAPE:
|
||||
nShape = nShape + 1
|
||||
Loop
|
||||
|
||||
Call UserInteraction.ShowMessage(IM_SHAPES_TO_TEXT_OK)
|
||||
End Sub
|
||||
|
||||
Public Sub CC_Convert1252_1251()
|
||||
' Êîíâåðòàöèÿ êîäîâûõ ñòðàíèö
|
||||
Dim theDoc As Word.Document: Set theDoc = ActiveDocument
|
||||
theDoc.ActiveWindow.View.ReadingLayout = False
|
||||
|
||||
Dim inputR As Word.Range: Set inputR = theDoc.Application.Selection.Range
|
||||
|
||||
Dim wordUI As New API_WordWrapper: Call wordUI.SetDocument(theDoc)
|
||||
Call wordUI.PauseUI
|
||||
|
||||
Call CSE_ProgressBar.Init("Êîððåêòèðîâêà êîäèðîâêè 1252 -> 1251", sHeader:="Îáðàáîòêà ñèìâîëîâ...", maxVal:=inputR.Characters.Count)
|
||||
Call CSE_ProgressBar.ShowModeless
|
||||
|
||||
Dim aChr As Word.Range: Set aChr = inputR.Characters.First
|
||||
Do While aChr.End < inputR.End
|
||||
Dim ChrW&: ChrW = VBA.AscW(aChr)
|
||||
If ChrW < 256 And ChrW > 127 Then _
|
||||
aChr.Text = VBA.Chr(ChrW)
|
||||
Set aChr = aChr.Next(wdCharacter, 1)
|
||||
Call CSE_ProgressBar.IncrementA
|
||||
Loop
|
||||
|
||||
Call Unload(CSE_ProgressBar)
|
||||
Call wordUI.ResumeUI
|
||||
Call UserInteraction.ShowMessage(IM_CONVERT_CODEPAGE_OK)
|
||||
End Sub
|
||||
|
||||
Public Sub CC_ParFix()
|
||||
' Modify spacing to make last line optimal length
|
||||
Dim selRange As Word.Range: Set selRange = ActiveDocument.ActiveWindow.Selection.Range.Duplicate
|
||||
Dim aPar As Word.Paragraph
|
||||
For Each aPar In selRange.Paragraphs
|
||||
Dim tRange As Word.Range: Set tRange = aPar.Range
|
||||
If tRange.Tables.Count > 0 Then tRange.End = tRange.End - 1
|
||||
Call tRange.Select
|
||||
Call TryFixingParagraph(tRange)
|
||||
Next aPar
|
||||
End Sub
|
||||
|
||||
Public Sub CC_ExportComments()
|
||||
' Export comments in new document
|
||||
Dim iSource As Word.Document: Set iSource = ActiveDocument
|
||||
Dim iDestination As Word.Document: Set iDestination = Word.Application.Documents.Add
|
||||
|
||||
Dim targetRange As Word.Range: Set targetRange = iDestination.Range
|
||||
Dim aComment As Word.Comment
|
||||
Dim nCount&: nCount = 0
|
||||
Dim nPage&
|
||||
For Each aComment In iSource.Comments
|
||||
nCount = nCount + 1
|
||||
Set targetRange = targetRange.Paragraphs.Add.Range
|
||||
nPage = aComment.Reference.Information(wdActiveEndPageNumber)
|
||||
targetRange.Text = Fmt("Êîììåíòàðèé {1}, ñòðàíèöà {2}, àâòîð {3}:" & vbNewLine & "{4}" & vbNewLine, nCount, nPage, aComment.Author, aComment.Range.Text)
|
||||
Next aComment
|
||||
|
||||
Call UserInteraction.ShowMessage(IM_COMMENT_EXPORT_OK, nCount)
|
||||
End Sub
|
||||
|
||||
Public Sub CC_LineUp()
|
||||
Dim tRange As Word.Range: Set tRange = ActiveDocument.ActiveWindow.Selection.Paragraphs(1).Range
|
||||
Dim iSpace As Double: iSpace = tRange.ParagraphFormat.SpaceBefore + tRange.ParagraphFormat.LineSpacing
|
||||
tRange.ParagraphFormat.SpaceBefore = iSpace
|
||||
End Sub
|
||||
|
||||
Public Sub CC_LineUpA()
|
||||
Dim tRange As Word.Range: Set tRange = ActiveDocument.ActiveWindow.Selection.Paragraphs(1).Range
|
||||
Dim iSpace As Double: iSpace = tRange.ParagraphFormat.SpaceBefore - tRange.ParagraphFormat.LineSpacing
|
||||
tRange.ParagraphFormat.SpaceBefore = IIf(iSpace >= 0, iSpace, 0)
|
||||
End Sub
|
||||
|
||||
Public Sub CC_LineDown()
|
||||
Dim tRange As Word.Range: Set tRange = ActiveDocument.ActiveWindow.Selection.Paragraphs(1).Range
|
||||
Dim iSpace As Double: iSpace = tRange.ParagraphFormat.SpaceAfter + tRange.ParagraphFormat.LineSpacing
|
||||
tRange.ParagraphFormat.SpaceAfter = iSpace
|
||||
End Sub
|
||||
|
||||
Public Sub CC_LineDownA()
|
||||
Dim tRange As Word.Range: Set tRange = ActiveDocument.ActiveWindow.Selection.Paragraphs(1).Range
|
||||
Dim iSpace As Double: iSpace = tRange.ParagraphFormat.SpaceAfter - tRange.ParagraphFormat.LineSpacing
|
||||
tRange.ParagraphFormat.SpaceAfter = IIf(iSpace >= 0, iSpace, 0)
|
||||
End Sub
|
||||
|
||||
Public Sub CC_CheckLinks()
|
||||
' Ïðîâåðêà ãèïåðññûëîê
|
||||
Dim thisDoc As Word.Document: Set thisDoc = ActiveDocument
|
||||
Dim linkCount&: linkCount = thisDoc.Hyperlinks.Count
|
||||
If thisDoc.Hyperlinks.Count = 0 Then
|
||||
Call UserInteraction.ShowMessage(EM_HYPERLINKS_MISSING)
|
||||
Exit Sub
|
||||
End If
|
||||
|
||||
Dim result As LMU_LinksInfo: result = FixHyperlinksIn(ActiveDocument.Range)
|
||||
Call UserInteraction.ShowMessage(IM_HYPERLINKS_FIX_OK, result.lnkCount_, result.errCount_, result.modCount_)
|
||||
End Sub
|
||||
|
||||
Public Sub CC_AddQuote()
|
||||
ActiveDocument.ActiveWindow.Selection.Range.Text = Chr(171) & ActiveDocument.ActiveWindow.Selection.Text & Chr(187)
|
||||
End Sub
|
||||
|
||||
Public Sub CC_EditCut()
|
||||
' Âûðåçàòü è âñòàâèòü â êîíåö
|
||||
Dim aRange As Word.Range: Set aRange = ActiveDocument.ActiveWindow.Selection.Range
|
||||
aRange.Start = aRange.Paragraphs.First.Range.Start
|
||||
aRange.End = aRange.Paragraphs.Last.Range.End
|
||||
|
||||
Call aRange.Cut
|
||||
Call ActiveDocument.Paragraphs.Add
|
||||
Call ActiveDocument.Paragraphs.Last.Range.Paste
|
||||
End Sub
|
||||
|
||||
Public Sub CC_EditCopy()
|
||||
' Êîïèðîâàòü è âñòàâèòü â êîíåö
|
||||
Dim aRange As Word.Range: Set aRange = ActiveDocument.ActiveWindow.Selection.Range
|
||||
aRange.Start = aRange.Paragraphs.First.Range.Start
|
||||
aRange.End = aRange.Paragraphs.Last.Range.End
|
||||
|
||||
Call aRange.Copy
|
||||
|
||||
Call ActiveDocument.Paragraphs.Add
|
||||
Call ActiveDocument.Paragraphs.Last.Range.Paste
|
||||
|
||||
aRange.HighlightColorIndex = wdYellow
|
||||
End Sub
|
||||
|
||||
Public Sub CC_CreateHLink()
|
||||
Dim target As Word.Range: Set target = ActiveDocument.ActiveWindow.Selection.Range
|
||||
|
||||
Dim bookmarkID$
|
||||
Dim aBM As Word.Bookmark
|
||||
For Each aBM In target.Bookmarks
|
||||
If aBM.Range.End = target.End And aBM.Range.Start = target.Start Then bookmarkID = aBM.Name
|
||||
Next aBM
|
||||
|
||||
If bookmarkID = vbNullString Then
|
||||
On Error GoTo ERROR_MSG
|
||||
bookmarkID = "AUTO_" & Format(Date, "yyyymmdd") & Replace(Time, ":", "")
|
||||
Call target.Bookmarks.Add(bookmarkID)
|
||||
End If
|
||||
|
||||
Call AddToClipboard(target.Text)
|
||||
DoEvents
|
||||
Call AddToClipboard(ActiveDocument.FullName & "#" & bookmarkID)
|
||||
Exit Sub
|
||||
|
||||
ERROR_MSG:
|
||||
Call UserInteraction.ShowMessage(EM_HYPERLINK_CREATION_FAIL)
|
||||
End Sub
|
||||
|
||||
Public Sub CC_RemoveExternalHyperlinks()
|
||||
Dim target As Word.Range: Set target = ActiveDocument.ActiveWindow.Selection.Range.Duplicate
|
||||
Dim aLink As Hyperlink
|
||||
Dim nLink&: nLink = 1
|
||||
Dim delCount&: delCount = 0
|
||||
Do While target.Hyperlinks.Count >= nLink
|
||||
Set aLink = target.Hyperlinks.Item(nLink)
|
||||
If aLink.Address <> vbNullString Then
|
||||
Call aLink.Range.Font.Reset
|
||||
delCount = delCount + 1
|
||||
Call aLink.Delete
|
||||
Else
|
||||
nLink = nLink + 1
|
||||
End If
|
||||
Loop
|
||||
Call Word.Application.ScreenRefresh
|
||||
Call UserInteraction.ShowMessage(IM_REMOVE_HYPERLINKS_OK, delCount)
|
||||
End Sub
|
||||
|
||||
Public Sub CC_RemoveAllHyperlinks()
|
||||
Dim target As Word.Range: Set target = ActiveDocument.ActiveWindow.Selection.Range.Duplicate
|
||||
Dim aLink As Hyperlink
|
||||
Dim delCount&: delCount = target.Hyperlinks.Count
|
||||
Do While target.Hyperlinks.Count > 0
|
||||
Set aLink = target.Hyperlinks.Item(1)
|
||||
Call aLink.Range.Font.Reset
|
||||
Call aLink.Delete
|
||||
Loop
|
||||
Call Word.Application.ScreenRefresh
|
||||
Call UserInteraction.ShowMessage(IM_REMOVE_HYPERLINKS_OK, delCount)
|
||||
End Sub
|
||||
|
||||
Public Sub CC_RemoveImages()
|
||||
Dim nDeleted&: nDeleted = RemoveImages(ActiveDocument.ActiveWindow.Selection.Range.Duplicate)
|
||||
Call Word.Application.ScreenRefresh
|
||||
Call UserInteraction.ShowMessage(IM_REMOVE_IMAGES_OK, nDeleted)
|
||||
End Sub
|
||||
|
||||
Public Sub CC_RemoveBookmarks()
|
||||
Dim target As Word.Range: Set target = ActiveDocument.ActiveWindow.Selection.Range.Duplicate
|
||||
Dim aBM As Word.Bookmark
|
||||
Dim delCount&: delCount = target.Bookmarks.Count
|
||||
Do While target.Bookmarks.Count > 0
|
||||
Set aBM = target.Bookmarks.Item(1)
|
||||
Call aBM.Delete
|
||||
Loop
|
||||
Call Word.Application.ScreenRefresh
|
||||
Call UserInteraction.ShowMessage(IM_REMOVE_BOOKMARKS_OK, delCount)
|
||||
End Sub
|
||||
|
||||
Public Sub CC_RemoveAccents()
|
||||
Dim target As Word.Range: Set target = ActiveDocument.ActiveWindow.Selection.Range.Duplicate
|
||||
If target.Start = target.End Then _
|
||||
Set target = ActiveDocument.Range
|
||||
|
||||
Dim nCount&: nCount = RemoveAccentsIn(target)
|
||||
Call Word.Application.ScreenRefresh
|
||||
Call UserInteraction.ShowMessage(IM_REMOVE_ACCENTS_OK, nCount)
|
||||
End Sub
|
||||
|
||||
Public Sub CC_MasterText()
|
||||
Dim sPath$: sPath = Word.ActiveDocument.FullName
|
||||
If Word.ActiveDocument.Path = vbNullString Then
|
||||
Call UserInteraction.ShowMessage(EM_DOCUMENT_NOT_SAVED)
|
||||
Exit Sub
|
||||
End If
|
||||
|
||||
Dim xlWrap As New API_XLWrapper
|
||||
Dim aDoc As Excel.Workbook: Set aDoc = xlWrap.OpenDocument(SERVER_MASTER_TEXT)
|
||||
If aDoc Is Nothing Then _
|
||||
Exit Sub
|
||||
|
||||
Call aDoc.Activate
|
||||
aDoc.Names(CELL_MASTER_PATH).RefersToRange = sPath$
|
||||
End Sub
|
||||
|
||||
Public Sub CC_UpdateConcept()
|
||||
If Not UpdateConceptPowershell Then
|
||||
Call UserInteraction.ShowMessage(EM_CORE_UPDATE_FAILED)
|
||||
Exit Sub
|
||||
End If
|
||||
Call UserInteraction.ShowMessage(IM_CONCEPT_UPDATE_OK)
|
||||
End Sub
|
||||
|
||||
Public Sub CC_Checkup()
|
||||
Call ExecuteAllRules(ActiveDocument, bApplyFix:=False)
|
||||
End Sub
|
||||
|
||||
Public Sub CC_FixErrors()
|
||||
Call ExecuteAllRules(ActiveDocument, bApplyFix:=True)
|
||||
End Sub
|
||||
|
||||
Public Sub CC_MasterConfig()
|
||||
Call OpenMasterConfig
|
||||
End Sub
|
||||
|
||||
Public Sub CC_IgnoreSelected()
|
||||
' Äîáàâëÿåì áóêìàðê ñ èãíîðîì äëÿ âûáðàííîãî äèàïàçîíà
|
||||
Dim target As Word.Range: Set target = ActiveDocument.Application.Selection.Range
|
||||
If target.Start = target.End Then
|
||||
Call UserInteraction.ShowMessage(EM_SELECTION_EMPTY)
|
||||
Exit Sub
|
||||
End If
|
||||
|
||||
Dim iEditor As New API_WordEditGuard: Call iEditor.InitDoc(target.Document)
|
||||
Dim sBookmark$: sBookmark = iEditor.BookmarkIgnored(target)
|
||||
Call UserInteraction.ShowMessage(IM_BOOKMARK_IGNORED, sBookmark)
|
||||
End Sub
|
||||
|
||||
Public Sub CC_Help()
|
||||
Dim wordWrap As New API_WordWrapper
|
||||
Dim helpDoc As Word.Document: Set helpDoc = wordWrap.OpenDocument(SERVER_PATH_HELP, bReadOnly:=True)
|
||||
If helpDoc Is Nothing Then _
|
||||
Exit Sub
|
||||
|
||||
With helpDoc
|
||||
.ActiveWindow.View.ReadingLayout = False
|
||||
Call .Application.Activate
|
||||
End With
|
||||
End Sub
|
||||
|
||||
' ============
|
||||
Private Function ExecuteAllRules(iDoc As Word.Document, Optional bApplyFix As Boolean = True)
|
||||
Dim iConfig As API_Config: Set iConfig = LoadEditConfig
|
||||
Dim iProcessor As New RulesProcessor: Call iProcessor.Init(iDoc, iConfig)
|
||||
Dim iGuard As New API_WordEditGuard: Call iGuard.InitDoc(iDoc)
|
||||
|
||||
Call iGuard.BeginEdit(iConfig.GetValue("TrackRevisions"))
|
||||
|
||||
Call CSE_ProgressBar.Init("Àâòîìàòèçèðîâàííàÿ ñèñòåìà òåñòèðîâàíèÿ", sHeader:="Âûïîëíÿåòñÿ ïðîâåðêà, ïîäîæäèòå...", maxVal:=iProcessor.RuleCount, canInterrupt:=True)
|
||||
Call CSE_ProgressBar.ShowModeless
|
||||
|
||||
Call iProcessor.RunAll(CollectionToDictionary(iConfig.GetValue("ExcludeRules")), bApplyFix)
|
||||
|
||||
Dim nMilliseconds&: nMilliseconds = Int(CSE_ProgressBar.Time)
|
||||
CSE_ProgressBar.Description = "Ðàññòàíîâêà êîììåíòàðèåâ"
|
||||
Call iGuard.EndEdit
|
||||
|
||||
Call Unload(CSE_ProgressBar)
|
||||
Call UserInteraction.ShowMessage(IM_RULES_COMPLETE, nMilliseconds, iProcessor.errors_, iProcessor.fixes_)
|
||||
End Function
|
247
src/MainImpl.bas
Normal file
247
src/MainImpl.bas
Normal file
|
@ -0,0 +1,247 @@
|
|||
Attribute VB_Name = "MainImpl"
|
||||
Option Explicit
|
||||
|
||||
Public Function RemoveImages(target As Word.Range) As Long
|
||||
Dim iShp As Word.InlineShape
|
||||
Dim nDeleted&: nDeleted = target.InlineShapes.Count
|
||||
Do While target.InlineShapes.Count > 0
|
||||
Set iShp = target.InlineShapes.Item(1)
|
||||
Dim pasteRange As Word.Range: Set pasteRange = iShp.Range.Duplicate
|
||||
Call pasteRange.Collapse(wdCollapseStart)
|
||||
Call iShp.Delete
|
||||
pasteRange.Text = "[èçîáðàæåíèå óäàëåíî]"
|
||||
pasteRange.Font.Bold = True
|
||||
Loop
|
||||
RemoveImages = nDeleted
|
||||
End Function
|
||||
|
||||
Public Function RecreateBookmarks(target As Word.Document) As Scripting.Dictionary
|
||||
Dim contextMap As New Scripting.Dictionary
|
||||
Dim pref$: pref = "t" & VBA.Format(Date, "yyyymmdd") & VBA.Replace(VBA.Time, ":", "")
|
||||
Dim nBookmark&
|
||||
For nBookmark = target.Bookmarks.Count To 1 Step -1 ' Note: reverse order for recreation
|
||||
Dim aMark As Word.Bookmark: Set aMark = target.Bookmarks(nBookmark)
|
||||
Dim bmRange As Word.Range: Set bmRange = aMark.Range
|
||||
Dim sNewName$: sNewName = pref & "_" & aMark.Name
|
||||
If VBA.Len(sNewName) > 40 Then _
|
||||
GoTo NEXT_BM
|
||||
|
||||
Call contextMap.Add(aMark.Name, sNewName)
|
||||
Call bmRange.Bookmarks.Add(pref & "_" & aMark.Name)
|
||||
Call aMark.Delete
|
||||
NEXT_BM:
|
||||
Next nBookmark
|
||||
|
||||
Set RecreateBookmarks = contextMap
|
||||
End Function
|
||||
|
||||
Public Function FixHyperlinksAfterBMReplace(target As Word.Document, iContext As Scripting.Dictionary)
|
||||
Dim newAddr$
|
||||
Dim nLink&
|
||||
For nLink = target.Hyperlinks.Count To 1 Step -1
|
||||
Dim aLink As Word.Hyperlink: Set aLink = target.Hyperlinks(nLink)
|
||||
Dim linkRange As Word.Range: Set linkRange = target.Range(aLink.Range.Start, aLink.Range.End)
|
||||
Dim sSub$: sSub = aLink.SubAddress
|
||||
If Not aLink.Address = vbNullString Or sSub = vbNullString Then _
|
||||
GoTo NEXT_LINK
|
||||
If Not iContext.Exists(sSub) Then _
|
||||
GoTo NEXT_LINK
|
||||
|
||||
newAddr = iContext(sSub)
|
||||
Call aLink.Delete
|
||||
Call linkRange.Hyperlinks.Add(linkRange, "", newAddr)
|
||||
|
||||
NEXT_LINK:
|
||||
Next nLink
|
||||
End Function
|
||||
|
||||
Public Function FixHyperlinksIn(target As Word.Range) As LMU_LinksInfo
|
||||
FixHyperlinksIn.lnkCount_ = target.Hyperlinks.Count
|
||||
|
||||
Call CSE_ProgressBar.Init("Ïðåîáðàçîâàíèå ãèïåðññûëîê", sHeader:="Îáðàáîòêà...", _
|
||||
maxVal:=FixHyperlinksIn.lnkCount_)
|
||||
Call CSE_ProgressBar.ShowModeless
|
||||
|
||||
FixHyperlinksIn.modCount_ = 0
|
||||
FixHyperlinksIn.errCount_ = 0
|
||||
|
||||
Dim aLink As Hyperlink
|
||||
For Each aLink In target.Hyperlinks
|
||||
Dim linkAdr$: linkAdr = GetFullPath(SafeGetHLinkAddress(aLink), target.Document.Path)
|
||||
If linkAdr = vbNullString Then _
|
||||
GoTo NEXT_LINK
|
||||
|
||||
Select Case LinkCheckResult(linkAdr)
|
||||
Case RV_LINK_FIXED:
|
||||
FixHyperlinksIn.modCount_ = FixHyperlinksIn.modCount_ + 1
|
||||
Dim linkRange As Word.Range: Set linkRange = aLink.Range
|
||||
If linkRange.Font.ColorIndex = wdRed Then _
|
||||
linkRange.Font.ColorIndex = wdAuto
|
||||
If linkRange.HighlightColorIndex = wdTurquoise Then _
|
||||
linkRange.HighlightColorIndex = wdAuto
|
||||
|
||||
If IsSamePath(linkRange.Text, SafeGetHLinkAddress(aLink), target.Document.Path) Then
|
||||
If Left(linkRange.Text, 2) = "\\" Then
|
||||
linkRange.Text = ConvertLinkToLocal(linkAdr)
|
||||
Else
|
||||
linkRange.Text = ConvertLinkToURL(linkAdr)
|
||||
End If
|
||||
End If
|
||||
|
||||
linkRange.Text = linkRange.Text
|
||||
Call ActiveDocument.Hyperlinks.Add(linkRange, linkAdr)
|
||||
|
||||
Case RV_LINK_NOFIX:
|
||||
FixHyperlinksIn.errCount_ = FixHyperlinksIn.errCount_ + 1
|
||||
If aLink.Range.HighlightColorIndex <> wdTurquoise Then
|
||||
aLink.Range.HighlightColorIndex = wdTurquoise
|
||||
End If
|
||||
End Select
|
||||
|
||||
NEXT_LINK:
|
||||
Call CSE_ProgressBar.IncrementA
|
||||
Next aLink
|
||||
|
||||
Call Unload(CSE_ProgressBar)
|
||||
End Function
|
||||
|
||||
Public Function TryFixingParagraph(ByRef target As Word.Range)
|
||||
Dim nLine&: nLine = target.ComputeStatistics(wdStatisticLines)
|
||||
Dim newLine&
|
||||
Dim oldSpace As Double: oldSpace = target.Font.Spacing
|
||||
Dim dSpace As Double: dSpace = oldSpace
|
||||
|
||||
Do While dSpace >= -PAR_SCALE_MAX
|
||||
On Error GoTo ERR_H
|
||||
target.Font.Spacing = dSpace
|
||||
GoTo ERR_NEXT
|
||||
ERR_H:
|
||||
oldSpace = 0
|
||||
dSpace = 0
|
||||
target.Font.Spacing = dSpace
|
||||
ERR_NEXT:
|
||||
|
||||
newLine = target.ComputeStatistics(wdStatisticLines)
|
||||
If newLine < nLine Then _
|
||||
Exit Function
|
||||
|
||||
dSpace = dSpace - PAR_SCALE_STEP
|
||||
Loop
|
||||
|
||||
target.Font.Spacing = oldSpace
|
||||
|
||||
Dim colWid As Double, finC As Double
|
||||
Dim finRng As Word.Range, curSel As Word.Range
|
||||
|
||||
Set curSel = target.Application.Selection.Range.Duplicate
|
||||
|
||||
Set finRng = target.Duplicate
|
||||
Call finRng.MoveEnd(wdCharacter, -1)
|
||||
Call finRng.Collapse(wdCollapseEnd)
|
||||
Call finRng.Select
|
||||
|
||||
' Äëÿ ñëó÷àåâ, êîãäà òåêñò â òàáëèöå
|
||||
On Error GoTo RET_SEL
|
||||
colWid = target.PageSetup.TextColumns(1).Width
|
||||
On Error GoTo 0
|
||||
|
||||
Do While dSpace <= PAR_SCALE_MAX
|
||||
On Error GoTo ERR_V
|
||||
target.Font.Spacing = dSpace
|
||||
GoTo ERR_NEW
|
||||
ERR_V:
|
||||
oldSpace = 0
|
||||
dSpace = 0
|
||||
target.Font.Spacing = dSpace
|
||||
ERR_NEW:
|
||||
|
||||
newLine = target.ComputeStatistics(wdStatisticLines)
|
||||
If newLine < nLine Then _
|
||||
GoTo RET_SEL
|
||||
If newLine > nLine Then _
|
||||
Exit Do
|
||||
|
||||
finC = target.Application.Selection.Information(wdHorizontalPositionRelativeToTextBoundary)
|
||||
If finC / colWid >= 0.5 Then _
|
||||
GoTo RET_SEL
|
||||
|
||||
dSpace = dSpace + PAR_SCALE_STEP
|
||||
Loop
|
||||
|
||||
target.Font.Spacing = oldSpace
|
||||
|
||||
RET_SEL:
|
||||
Call curSel.Select
|
||||
End Function
|
||||
|
||||
Public Function LowerReference(execField As Word.Field)
|
||||
If execField.Type <> wdFieldRef Then _
|
||||
Exit Function
|
||||
|
||||
With execField
|
||||
Dim codeStr$: codeStr = .Code
|
||||
Dim fSlash&: fSlash = InStr(codeStr, "\")
|
||||
fSlash = IIf(fSlash = 0, Len(codeStr), fSlash)
|
||||
codeStr = Left(codeStr, fSlash - 1) & "\* Lower \h }"
|
||||
|
||||
.Code.Text = codeStr
|
||||
.Update
|
||||
|
||||
.result.Italic = True
|
||||
.result.Bold = True
|
||||
End With
|
||||
End Function
|
||||
|
||||
Public Function RemoveAccentsIn(target As Word.Range) As Long
|
||||
Dim nCount&: nCount = 0
|
||||
Dim aWord As Word.Range
|
||||
For Each aWord In target.Words
|
||||
Dim sInitial$: sInitial = aWord.Text
|
||||
Dim sFixed$: sFixed = VBA.Replace(sInitial, ChrW(769), "")
|
||||
If VBA.Len(sInitial) > VBA.Len(sFixed) Then
|
||||
nCount = nCount + VBA.Len(sInitial) - VBA.Len(sFixed)
|
||||
aWord = sFixed
|
||||
End If
|
||||
Next aWord
|
||||
RemoveAccentsIn = nCount
|
||||
End Function
|
||||
|
||||
Public Function UpdateConceptPowershell() As Boolean
|
||||
UpdateConceptPowershell = False
|
||||
|
||||
Dim fso As New Scripting.FileSystemObject
|
||||
Dim sInstall$: sInstall = CP_TOOLS_SERVER & "\" & CONCEPT_INSTALLER
|
||||
If Not fso.FileExists(sInstall) Then _
|
||||
Exit Function
|
||||
|
||||
On Error GoTo RETURN_FALSE
|
||||
Dim sExec$: sExec = "cmd.exe /c " & """" & sInstall & """" & " < nul"
|
||||
Dim iShell As New WshShell
|
||||
iShell.CurrentDirectory = CP_TOOLS_SERVER
|
||||
UpdateConceptPowershell = iShell.Run(sExec, waitOnReturn:=True) = 0
|
||||
Exit Function
|
||||
|
||||
RETURN_FALSE:
|
||||
On Error GoTo 0
|
||||
End Function
|
||||
|
||||
' =============
|
||||
Private Function LinkCheckResult(ByRef rawLnk$) As LMU_Return
|
||||
'Ñîñòîÿíèå ññûëîê (ñ ïîäìåíîé ñòðîêîâîé ïåðåìåííîé)
|
||||
Dim rulemap As LinkMappingUnit: Set rulemap = GetLMU
|
||||
Dim sResult$: sResult = rawLnk
|
||||
LinkCheckResult = rulemap.FixLink(sResult)
|
||||
If LinkCheckResult = RV_LINK_FIXED Then _
|
||||
rawLnk = sResult
|
||||
End Function
|
||||
|
||||
Private Function TryProcessAddin(sLocal$, sServer$) As Boolean
|
||||
TryProcessAddin = False
|
||||
|
||||
Dim fso As New Scripting.FileSystemObject
|
||||
If Not fso.FileExists(sServer) Then _
|
||||
Exit Function
|
||||
|
||||
Call fso.CopyFile(sServer, sLocal)
|
||||
TryProcessAddin = True
|
||||
End Function
|
144
src/PublicSubs.bas
Normal file
144
src/PublicSubs.bas
Normal file
|
@ -0,0 +1,144 @@
|
|||
Attribute VB_Name = "PublicSubs"
|
||||
Option Explicit
|
||||
|
||||
Public Sub CCM_AddColumnBreak()
|
||||
Dim selPar As Word.Range: Set selPar = ActiveDocument.ActiveWindow.Selection.Paragraphs.First.Range
|
||||
Call selPar.Collapse(wdCollapseStart)
|
||||
Call selPar.InsertBreak(wdColumnBreak)
|
||||
End Sub
|
||||
|
||||
Public Sub CCM_NonBreakPar()
|
||||
ActiveDocument.ActiveWindow.Selection.ParagraphFormat.KeepTogether = Not ActiveDocument.ActiveWindow.Selection.ParagraphFormat.KeepTogether
|
||||
End Sub
|
||||
|
||||
Public Sub CCM_WithNext()
|
||||
Selection.ParagraphFormat.KeepWithNext = Not Selection.ParagraphFormat.KeepWithNext
|
||||
End Sub
|
||||
|
||||
Public Sub CCM_FieldLowerer()
|
||||
Dim tmpRange As Word.Range: Set tmpRange = ActiveDocument.ActiveWindow.Selection.Range.Duplicate
|
||||
tmpRange.Start = ActiveDocument.ActiveWindow.Selection.Words.First.Start
|
||||
tmpRange.End = ActiveDocument.ActiveWindow.Selection.Words.Last.End
|
||||
|
||||
On Error GoTo EXT_SUB
|
||||
Dim execField As Word.Field
|
||||
For Each execField In tmpRange.Fields
|
||||
Call bilCrossRef(execField)
|
||||
Next execField
|
||||
EXT_SUB:
|
||||
End Sub
|
||||
|
||||
Public Sub CCM_MakeUniqueBM()
|
||||
' Êîíâåðòèðóåò èìåíà çàêëàäîê â óíèêàëüíûå
|
||||
Dim contextMap As New Collection
|
||||
|
||||
Dim pref$: pref = "t" & Format(Date, "yyyymmdd") & Replace(Time, ":", "")
|
||||
Dim i&
|
||||
For i = ActiveDocument.Bookmarks.Count To 1 Step -1 ' Â îáðàòíîì ïîðÿäêå ïîñêîëüêó ìû áóäåì èõ ïåðåñîçäàâàòü
|
||||
Dim aMark As Word.BookMark: Set aMark = ActiveDocument.Bookmarks(i)
|
||||
Dim bmRange As Word.Range: Set bmRange = aMark.Range
|
||||
Dim newName$: newName = pref & "_" & aMark.Name
|
||||
|
||||
' Ïðîâåðÿåì êîððåêòíîñòü äëèíû áóêìàðêà
|
||||
If Len(newName) > 40 Then _
|
||||
GoTo NEXT_BM
|
||||
|
||||
Call contextMap.Add(newName, aMark.Name)
|
||||
Call bmRange.Bookmarks.Add(pref & "_" & aMark.Name)
|
||||
Call aMark.Delete
|
||||
NEXT_BM:
|
||||
Next i
|
||||
|
||||
' Ïðàâèì âíóòðåííèå ññûëêè íà çàêëàäêè
|
||||
Dim newAddr$
|
||||
For i = ActiveDocument.Hyperlinks.Count To 1 Step -1
|
||||
Dim aLink As Word.Hyperlink: Set aLink = ActiveDocument.Hyperlinks(i)
|
||||
Dim linkRange As Word.Range: Set linkRange = ActiveDocument.Range(aLink.Range.Start, aLink.Range.End)
|
||||
If Not aLink.Address = "" Or aLink.SubAddress = "" Then _
|
||||
GoTo NEXT_LINK
|
||||
If Not InCollection(aLink.SubAddress, contextMap) Then _
|
||||
GoTo NEXT_LINK
|
||||
|
||||
newAddr = contextMap(aLink.SubAddress)
|
||||
Call aLink.Delete
|
||||
Call linkRange.Hyperlinks.Add(linkRange, "", newAddr)
|
||||
|
||||
NEXT_LINK:
|
||||
Next i
|
||||
End Sub
|
||||
|
||||
Public Sub CCM_ConvertAllShapesToText()
|
||||
' Ïðâðàùåíèå øåéïîâ â òåêñò
|
||||
Dim theDoc As Word.Document: Set theDoc = ActiveDocument
|
||||
Dim tRange As Word.Range: Set tRange = theDoc.Range
|
||||
|
||||
Dim nShape&: nShape = 1
|
||||
Dim theText$
|
||||
|
||||
Dim aShape As Word.Shape
|
||||
Do While nShape <= theDoc.Shapes.Count ' Èòåðàöèÿ ïî íîìåðàì ïîñêîëüêó íóæíî óäàëÿòü ñàìè øåéïû
|
||||
Set aShape = theDoc.Shapes(nShape)
|
||||
If Not aShape.Anchor.InRange(tRange) Then _
|
||||
GoTo NEXT_SHAPE
|
||||
If aShape.Type <> msoTextBox Then _
|
||||
GoTo NEXT_SHAPE
|
||||
|
||||
theText = aShape.TextFrame.TextRange.Text
|
||||
|
||||
aShape.TextFrame.TextRange.Copy
|
||||
tRange.Paragraphs.Add
|
||||
Call tRange.Paragraphs.Last.Range.Paste
|
||||
|
||||
NEXT_SHAPE:
|
||||
nShape = nShape + 1
|
||||
Loop
|
||||
|
||||
Call UserInteraction.ShowMessage(IM_SHAPES_TO_TEXT_OK)
|
||||
End Sub
|
||||
|
||||
Public Sub CC_Convert1252_1251()
|
||||
' Êîíâåðòàöèÿ êîäîâûõ ñòðàíèö
|
||||
Dim theDoc As Word.Document: Set theDoc = ActiveDocument
|
||||
theDoc.ActiveWindow.View.ReadingLayout = False
|
||||
|
||||
Dim inputR As Word.Range: Set inputR = theDoc.Application.Selection.Range
|
||||
|
||||
Dim wordUI As New API_WordWrapper: Call wordUI.SetDocument(theDoc)
|
||||
Call wordUI.PauseUI
|
||||
|
||||
Call CSE_ProgressBar.Init("Êîððåêòèðîâêà êîäèðîâêè 1252 -> 1251", sHeader:="Îáðàáîòêà ñèìâîëîâ...", maxVal:=inputR.Characters.Count)
|
||||
Call CSE_ProgressBar.ShowModeless
|
||||
|
||||
Dim aChr As Word.Range: Set aChr = inputR.Characters.First
|
||||
Do While aChr.End < inputR.End
|
||||
Dim chrW&: chrW = VBA.AscW(aChr)
|
||||
If chrW < 256 And chrW > 127 Then _
|
||||
aChr.Text = VBA.Chr(chrW)
|
||||
Set aChr = aChr.Next(wdCharacter, 1)
|
||||
Call CSE_ProgressBar.IncrementA
|
||||
Loop
|
||||
|
||||
Call Unload(CSE_ProgressBar)
|
||||
Call wordUI.ResumeUI
|
||||
Call UserInteraction.ShowMessage(IM_CONVERT_CODEPAGE_OK)
|
||||
End Sub
|
||||
|
||||
' ============
|
||||
Private Function bilCrossRef(execField As Word.Field)
|
||||
If execField.Type <> wdFieldRef Then _
|
||||
Exit Function
|
||||
|
||||
With execField
|
||||
Dim codeStr$: codeStr = .code
|
||||
Dim fSlash&: fSlash = InStr(codeStr, "\")
|
||||
fSlash = IIf(fSlash = 0, Len(codeStr), fSlash)
|
||||
codeStr = Left(codeStr, fSlash - 1) & "\* Lower \h }"
|
||||
|
||||
.code.Text = codeStr
|
||||
.Update
|
||||
|
||||
.result.Italic = True
|
||||
.result.Bold = True
|
||||
End With
|
||||
End Function
|
||||
|
137
src/RulesAccess.bas
Normal file
137
src/RulesAccess.bas
Normal file
|
@ -0,0 +1,137 @@
|
|||
Attribute VB_Name = "RulesAccess"
|
||||
' Grant access to document processing rules
|
||||
Option Explicit
|
||||
|
||||
Public Function AccessProcessor() As RulesProcessor
|
||||
Static s_Processor As RulesProcessor
|
||||
If s_Processor Is Nothing Then _
|
||||
Set s_Processor = New RulesProcessor
|
||||
Set AccessProcessor = s_Processor
|
||||
End Function
|
||||
|
||||
Public Function InitProcessor(sDocument$, sConfigJSON$) As Boolean
|
||||
On Error GoTo RETURN_FALSE
|
||||
Dim iWrap As New API_WordWrapper
|
||||
If iWrap.OpenDocument(sDocument) Is Nothing Then _
|
||||
GoTo RETURN_FALSE
|
||||
|
||||
Dim iConfig As New API_Config: Call iConfig.LoadFromJSON(sConfigJSON)
|
||||
Call AccessProcessor.Init(iWrap.Document, iConfig)
|
||||
InitProcessor = True
|
||||
Exit Function
|
||||
|
||||
RETURN_FALSE:
|
||||
InitProcessor = False
|
||||
End Function
|
||||
|
||||
Public Function RunRule(sRuleID$, Optional bApplyFix As Boolean = True) As Long()
|
||||
Dim iResult() As Long
|
||||
ReDim iResult(0 To 2)
|
||||
|
||||
Dim iProcessor As RulesProcessor: Set iProcessor = AccessProcessor
|
||||
|
||||
On Error GoTo RETURN_ERROR
|
||||
Call iProcessor.ResetCounters
|
||||
Call iProcessor.RunRule(sRuleID, bApplyFix)
|
||||
On Error GoTo 0
|
||||
|
||||
iResult(0) = 0
|
||||
iResult(1) = iProcessor.errors_
|
||||
iResult(2) = iProcessor.fixes_
|
||||
RunRule = iResult
|
||||
Exit Function
|
||||
|
||||
RETURN_ERROR:
|
||||
iResult(0) = Err.Number
|
||||
RunRule = iResult
|
||||
End Function
|
||||
|
||||
Public Function FinalizeRulesProcessing()
|
||||
Call AccessProcessor.FinalizeProcessing
|
||||
End Function
|
||||
|
||||
Public Function EmptyEditConfig() As API_Config
|
||||
Set EmptyEditConfig = New API_Config
|
||||
With EmptyEditConfig
|
||||
Call .SetValue("HighlightErrors", False)
|
||||
Call .SetValue("CommentUnresolved", True)
|
||||
Call .SetValue("TrackRevisions", False)
|
||||
Call .SetValue("ExcludeRules", New Collection)
|
||||
Call .SetValue("BannedWords", New Collection)
|
||||
End With
|
||||
End Function
|
||||
|
||||
Public Function DefaultEditConfig() As API_Config
|
||||
Set DefaultEditConfig = New API_Config
|
||||
With DefaultEditConfig
|
||||
Call .SetValue("HighlightErrors", False)
|
||||
Call .SetValue("CommentUnresolved", True)
|
||||
Call .SetValue("TrackRevisions", True)
|
||||
Call .SetValue("ExcludeRules", New Collection)
|
||||
Call .SetValue("BannedWords", LoadBannedWords)
|
||||
End With
|
||||
End Function
|
||||
|
||||
Public Function LoadEditConfig() As API_Config
|
||||
Dim iConfig As API_Config
|
||||
Dim fso As New Scripting.FileSystemObject
|
||||
Dim sFile$: sFile = VBA.Environ$("USERPROFILE") & "\" & CONCEPT_LOCAL_HOME & "\" & CONCEPT_MASTER_CONFIG
|
||||
If fso.FileExists(sFile) Then
|
||||
Set iConfig = New API_Config
|
||||
Call iConfig.LoadFromFile(sFile)
|
||||
Else
|
||||
Set iConfig = DefaultEditConfig
|
||||
Call iConfig.RemoveKey("BannedWords")
|
||||
Call iConfig.SaveToFile(sFile)
|
||||
End If
|
||||
Call iConfig.SetValue("BannedWords", LoadBannedWords)
|
||||
Set LoadEditConfig = iConfig
|
||||
End Function
|
||||
|
||||
Public Function OpenMasterConfig()
|
||||
Dim fso As New Scripting.FileSystemObject
|
||||
Dim sFile$: sFile = VBA.Environ$("USERPROFILE") & "\" & CONCEPT_LOCAL_HOME & "\" & CONCEPT_MASTER_CONFIG
|
||||
If Not fso.FileExists(sFile) Then
|
||||
Dim iConfig As API_Config: Set iConfig = DefaultEditConfig
|
||||
Call iConfig.RemoveKey("BannedWords")
|
||||
Call iConfig.SaveToFile(sFile)
|
||||
End If
|
||||
Dim oShell As New Shell32.Shell
|
||||
Call oShell.Open(sFile)
|
||||
End Function
|
||||
|
||||
' =======
|
||||
Private Function LoadBannedWords() As Collection
|
||||
Dim result As New Collection
|
||||
Dim sLocal$: sLocal = VBA.Environ$("USERPROFILE") & "\" & CONCEPT_LOCAL_HOME & "\models\" & CONCEPT_BANNED_WORDS
|
||||
Dim fso As New Scripting.FileSystemObject
|
||||
If Not fso.FileExists(sLocal) Then
|
||||
If Not TryUpdateBannedWords() Then
|
||||
Call UserInteraction.ShowMessage(EM_MISSING_FILE, sLocal)
|
||||
GoTo RETURN_EMPTY
|
||||
End If
|
||||
End If
|
||||
|
||||
Dim adoStream As New ADODB.Stream
|
||||
adoStream.Charset = "utf-8"
|
||||
Call adoStream.Open
|
||||
Call adoStream.LoadFromFile(sLocal)
|
||||
Dim sLines() As String: sLines = VBA.Split(adoStream.ReadText, vbCrLf)
|
||||
Call adoStream.Close
|
||||
|
||||
Dim nLine&
|
||||
For nLine = LBound(sLines, 1) To UBound(sLines, 1) Step 1
|
||||
Dim sText$: sText = sLines(nLine)
|
||||
If sText <> vbNullString Then _
|
||||
Call result.Add(sText)
|
||||
Next nLine
|
||||
|
||||
RETURN_EMPTY:
|
||||
Set LoadBannedWords = result
|
||||
End Function
|
||||
|
||||
Private Function TryUpdateBannedWords() As Boolean
|
||||
Dim sServer$: sServer = CONCEPT_SERVER_HOME & CONCEPT_BANNED_WORDS
|
||||
Dim sLocal$: sLocal = VBA.Environ$("USERPROFILE") & "\" & CONCEPT_LOCAL_HOME & "\models\" & CONCEPT_BANNED_WORDS
|
||||
TryUpdateBannedWords = CopyFileOrFolder(sSource:=sServer, sDestination:=sLocal)
|
||||
End Function
|
1162
src/RulesProcessor.cls
Normal file
1162
src/RulesProcessor.cls
Normal file
File diff suppressed because it is too large
Load Diff
209
src/s_RulesProcessor.cls
Normal file
209
src/s_RulesProcessor.cls
Normal file
|
@ -0,0 +1,209 @@
|
|||
VERSION 1.0 CLASS
|
||||
BEGIN
|
||||
MultiUse = -1 'True
|
||||
END
|
||||
Attribute VB_Name = "s_RulesProcessor"
|
||||
Attribute VB_GlobalNameSpace = False
|
||||
Attribute VB_Creatable = False
|
||||
Attribute VB_PredeclaredId = False
|
||||
Attribute VB_Exposed = False
|
||||
Option Explicit
|
||||
|
||||
' TODO: test all missing rules
|
||||
|
||||
Private processor_ As RulesProcessor
|
||||
Private doc_ As Word.Document
|
||||
Private ruleID_ As String
|
||||
|
||||
Public Function Setup()
|
||||
Set doc_ = ThisDocument
|
||||
Set processor_ = New RulesProcessor
|
||||
Call processor_.Init(doc_, EmptyEditConfig)
|
||||
End Function
|
||||
|
||||
Public Function Teardown()
|
||||
Call doc_.Range.Delete
|
||||
End Function
|
||||
|
||||
Private Function TestText(sInitial$, sExpected$, Optional sMsg$ = vbNullString)
|
||||
Dim nStart&: nStart = doc_.Range.End
|
||||
Call doc_.Paragraphs.Add.Range.InsertAfter(sInitial)
|
||||
|
||||
Call processor_.ResetCounters
|
||||
Call processor_.RunRule(ruleID_, bApplyFix:=True)
|
||||
|
||||
Dim iLastRange As Word.Range: Set iLastRange = doc_.Range.Duplicate
|
||||
iLastRange.Start = nStart
|
||||
iLastRange.End = iLastRange.End - 1
|
||||
Dim sTest$: sTest = iLastRange.Text
|
||||
Call doc_.Range.Delete
|
||||
|
||||
Call Dev_ExpectEQ(sExpected, sTest, sMsg)
|
||||
End Function
|
||||
|
||||
Private Function TestComment(sInitial$, sAnchor$, Optional sComment$ = vbNullString, Optional sClause$ = vbNullString)
|
||||
If sClause <> "" Then _
|
||||
Call Dev_NewClause(sClause)
|
||||
|
||||
Call doc_.Paragraphs.Add.Range.InsertAfter(sInitial)
|
||||
|
||||
Call processor_.RunRule(ruleID_, bApplyFix:=True)
|
||||
Call processor_.FinalizeProcessing
|
||||
Call Dev_AssertEQ(1, doc_.Comments.Count, "Comments count")
|
||||
|
||||
Dim iComment As Word.Comment: Set iComment = doc_.Comments(1)
|
||||
|
||||
Dim sText$: sText = iComment.Range.Text
|
||||
Call Dev_ExpectEQ(sAnchor, iComment.Scope, "Anchor text")
|
||||
If sComment <> "" Then
|
||||
Call Dev_ExpectLike(sText, "*" & sComment, "Comment text")
|
||||
End If
|
||||
|
||||
Call doc_.Range.Delete
|
||||
End Function
|
||||
|
||||
Public Function t_HiddenText()
|
||||
On Error GoTo PROPAGATE_ERROR
|
||||
ruleID_ = "AR1002"
|
||||
|
||||
Dim sText$: sText = "Test1 Test2"
|
||||
Dim nStart&: nStart = doc_.Range.End
|
||||
Call doc_.Paragraphs.Add.Range.InsertAfter(sText)
|
||||
Dim iLastRange As Word.Range: Set iLastRange = doc_.Range.Duplicate
|
||||
iLastRange.Start = nStart
|
||||
iLastRange.End = iLastRange.End - 1
|
||||
iLastRange.Font.Hidden = True
|
||||
|
||||
Call processor_.RunRule(ruleID_, bApplyFix:=True)
|
||||
|
||||
Set iLastRange = doc_.Range.Duplicate
|
||||
iLastRange.Start = nStart
|
||||
iLastRange.End = iLastRange.End - 1
|
||||
Dim sTest$: sTest = iLastRange.Text
|
||||
|
||||
Call Dev_ExpectEQ(sText, sTest, "Do not apply rule to hidden text")
|
||||
|
||||
iLastRange.Font.Hidden = False
|
||||
Call processor_.RunRule(ruleID_, bApplyFix:=True)
|
||||
|
||||
Set iLastRange = doc_.Range.Duplicate
|
||||
iLastRange.Start = nStart
|
||||
iLastRange.End = iLastRange.End - 1
|
||||
sTest = iLastRange.Text
|
||||
Call Dev_ExpectNE(sText, sTest, "Apply valid rule to not hidden text")
|
||||
|
||||
Exit Function
|
||||
PROPAGATE_ERROR:
|
||||
Call Dev_LogError(Err.Number, Err.Description)
|
||||
End Function
|
||||
|
||||
Public Function t_ParagraphWhitespace()
|
||||
On Error GoTo PROPAGATE_ERROR
|
||||
ruleID_ = "AR1001"
|
||||
|
||||
Call Dev_NewCase("Space in front")
|
||||
Call TestText(" Test", "Test", "Single space")
|
||||
Call TestText(" Test", "Test", "Multiple spaces")
|
||||
Call TestText(Chr(160) & "Test", "Test", "Unbreakable space")
|
||||
Call TestText(Chr(160) & " " & Chr(160) & "Test", "Test", "Mixed spaces")
|
||||
Call TestText(vbTab & "Test", vbTab & "Test", "Ignore tabulator")
|
||||
Call TestText(" " & vbTab & "Test", vbTab & "Test", "Mixed tabulator")
|
||||
|
||||
Call Dev_NewCase("Space in back")
|
||||
Call TestText("Test ", "Test", "Single space")
|
||||
Call TestText("Test ", "Test", "Multiple spaces")
|
||||
Call TestText("Test" & Chr(160), "Test", "Unbreakable space")
|
||||
Call TestText("Test" & Chr(160) & " " & Chr(160), "Test", "Mixed spaces")
|
||||
Call TestText("Test" & vbTab, "Test", "Tabulator")
|
||||
Call TestText("Test" & vbTab & vbTab, "Test", "Multiple tabulator")
|
||||
Call TestText("Test" & " " & vbTab, "Test", "Mixed tabulator")
|
||||
|
||||
Call Dev_NewCase("Combo spaces")
|
||||
Call TestText(" Test " & vbTab, "Test")
|
||||
|
||||
Exit Function
|
||||
PROPAGATE_ERROR:
|
||||
Call Dev_LogError(Err.Number, Err.Description)
|
||||
End Function
|
||||
|
||||
Public Function t_DoubleSpace()
|
||||
On Error GoTo PROPAGATE_ERROR
|
||||
ruleID_ = "AR1002"
|
||||
|
||||
Call TestText("Test1 test2", "Test1 test2", "Double space")
|
||||
Call TestText("Test1 " & Chr(160) & "test2", "Test1 test2", "Double unbreakable space")
|
||||
Call TestText("Test1 test2", "Test1 test2", "Triple space")
|
||||
Call TestText("Test1" & vbTab & vbTab & "test2", "Test1" & vbTab & vbTab & "test2", "Double tab")
|
||||
|
||||
Call Dev_NewCase("Quadruple space")
|
||||
Call TestText("Test1 test2", "Test1 test2", "Replace text")
|
||||
Call Dev_ExpectEQ(1, processor_.errors_, "Error count")
|
||||
Call Dev_ExpectEQ(1, processor_.errors_, "Fixes count")
|
||||
|
||||
Exit Function
|
||||
PROPAGATE_ERROR:
|
||||
Call Dev_LogError(Err.Number, Err.Description)
|
||||
End Function
|
||||
|
||||
Public Function t_DoubleEndline()
|
||||
On Error GoTo PROPAGATE_ERROR
|
||||
ruleID_ = "AR1003"
|
||||
|
||||
Call TestText(vbNewLine & "Test", "Test", "Double endline")
|
||||
Call TestText("Test" & vbNewLine, "Test", "End of document")
|
||||
|
||||
Call Dev_NewCase("Triple endline")
|
||||
Call TestText(vbNewLine & vbNewLine & "Test", "Test", "Replace text")
|
||||
Call Dev_ExpectEQ(1, processor_.errors_, "Error count")
|
||||
Call Dev_ExpectEQ(1, processor_.errors_, "Fixes count")
|
||||
|
||||
Call Dev_NewCase("Quadruple endline")
|
||||
Call TestText(vbNewLine & vbNewLine & vbNewLine & "Test", "Test", "Replace text")
|
||||
Call Dev_ExpectEQ(1, processor_.errors_, "Error count")
|
||||
Call Dev_ExpectEQ(1, processor_.errors_, "Fixes count")
|
||||
|
||||
Exit Function
|
||||
PROPAGATE_ERROR:
|
||||
Call Dev_LogError(Err.Number, Err.Description)
|
||||
End Function
|
||||
|
||||
Public Function t_PlusMinus()
|
||||
On Error GoTo PROPAGATE_ERROR
|
||||
ruleID_ = "AR1004"
|
||||
|
||||
Call TestText("1 +/- 1", "1 ± 1", "Spaces")
|
||||
Call TestText("1+/-1", "1±1", "No spaces")
|
||||
Call TestText("1 + / - 1", "1 ± 1", "Inner spaces")
|
||||
|
||||
Exit Function
|
||||
PROPAGATE_ERROR:
|
||||
Call Dev_LogError(Err.Number, Err.Description)
|
||||
End Function
|
||||
|
||||
Public Function t_Quotes()
|
||||
On Error GoTo PROPAGATE_ERROR
|
||||
ruleID_ = "AR1017"
|
||||
|
||||
Call Dev_NewCase("Replace incorrect brackets")
|
||||
Call TestText("«Test»", "«Test»")
|
||||
Call TestText("""Test""", "«Test»")
|
||||
Call TestText("»Test«", "«Test»")
|
||||
Call TestText("„Test„", "«Test»")
|
||||
Call TestText("""""", "«»")
|
||||
Call TestText("»«", "«»")
|
||||
|
||||
Call Dev_NewCase("Double brackets")
|
||||
Call TestText("«ÍÏ «ÖÈÂÒ ÊÎÍÖÅÏÒ»»", "«ÍÏ „ÖÈÂÒ ÊÎÍÖÅÏÒ“»")
|
||||
Call TestText("""ÍÏ «ÖÈÂÒ ÊÎÍÖÅÏÒ«»", "«ÍÏ „ÖÈÂÒ ÊÎÍÖÅÏÒ“»")
|
||||
Call TestText("«ÍÏ «ÖÈÂÒ ÊÎÍÖÅÏÒ» INC»", "«ÍÏ «ÖÈÂÒ ÊÎÍÖÅÏÒ» INC»")
|
||||
|
||||
Call Dev_NewCase("Invalid structure")
|
||||
Call TestComment("«Test", "«", sClause:="Missing close bracket")
|
||||
Call TestComment("«Test «12»", "«", sClause:="Missing close bracket")
|
||||
Call TestComment("Test»", "", sClause:="Missing open bracket")
|
||||
|
||||
Exit Function
|
||||
PROPAGATE_ERROR:
|
||||
Call Dev_LogError(Err.Number, Err.Description)
|
||||
End Function
|
||||
|
92
src/z_UIMessages.bas
Normal file
92
src/z_UIMessages.bas
Normal file
|
@ -0,0 +1,92 @@
|
|||
Attribute VB_Name = "z_UIMessages"
|
||||
' Messaging module
|
||||
Option Private Module
|
||||
Option Explicit
|
||||
|
||||
Public Enum MsgCode
|
||||
EM_HYPERLINK_CREATION_FAIL
|
||||
EM_HYPERLINKS_MISSING
|
||||
EM_DOCUMENT_NOT_SAVED
|
||||
EM_CORE_UPDATE_FAILED
|
||||
EM_SELECTION_EMPTY
|
||||
EM_MISSING_FILE
|
||||
|
||||
IM_REMOVE_HYPERLINKS_OK
|
||||
IM_HYPERLINKS_FIX_OK
|
||||
IM_REMOVE_BOOKMARKS_OK
|
||||
IM_REMOVE_IMAGES_OK
|
||||
IM_SHAPES_TO_TEXT_OK
|
||||
IM_CONVERT_CODEPAGE_OK
|
||||
IM_UNIQUE_BOOKMARKS_OK
|
||||
IM_CONCEPT_UPDATE_OK
|
||||
IM_BOOKMARK_IGNORED
|
||||
IM_RULES_COMPLETE
|
||||
IM_REMOVE_ACCENTS_OK
|
||||
IM_COMMENT_EXPORT_OK
|
||||
End Enum
|
||||
|
||||
Private g_UI As API_UserInteraction
|
||||
|
||||
Public Function UserInteraction() As API_UserInteraction
|
||||
If g_UI Is Nothing Then _
|
||||
Set g_UI = New API_UserInteraction
|
||||
Set UserInteraction = g_UI
|
||||
End Function
|
||||
|
||||
Public Function SetUserInteraction(newUI As API_UserInteraction)
|
||||
Set g_UI = newUI
|
||||
End Function
|
||||
|
||||
Public Function UIShowMessage(theCode As MsgCode, ParamArray params() As Variant)
|
||||
Dim unwrapped As Variant: unwrapped = params
|
||||
unwrapped = FixForwardedParams(unwrapped)
|
||||
|
||||
Select Case theCode
|
||||
Case EM_HYPERLINK_CREATION_FAIL: Call MsgBox("Ïðè äîáàâëåíèè çàêëàäêè ïðîèçîøëà îøèáêà. Îáðàòèòåñü ê ðàçðàáîò÷èêó", vbExclamation)
|
||||
Case EM_HYPERLINKS_MISSING: Call MsgBox("Â äîêóìåíòå îòñóòñòâóþò ññûëêè", vbInformation)
|
||||
Case EM_DOCUMENT_NOT_SAVED: Call MsgBox("Äîêóìåíò íå áûë ñîõðàí¸í" & vbNewLine & "Ñîõðàíèòå äîêóìåíò è ïîâòîðèòå ïîïûòêó", vbCritical)
|
||||
Case EM_SELECTION_EMPTY: Call MsgBox("Âûäåëåíèå ïóñòî. Âûäåëèòå ôðàãìåíò òåêñòà", vbExclamation)
|
||||
Case EM_MISSING_FILE: Call MsgBox(Fmt("Îòñóòñòâóåò äîñòóï ê ôàéëó: {1}", unwrapped), vbExclamation)
|
||||
Case EM_CORE_UPDATE_FAILED: Call MsgBox("Íå óäàëîñü óñòàíîâèòü ôàéëû ÊÎÍÖÅÏÒ ñ ñåðâåðà." & vbNewLine _
|
||||
& "Ïðîâåðüòå VPN, ñåòåâûå ïóòè (\\fs1.concept.ru)" & vbNewLine _
|
||||
& "Ïîïðîáóéòå ïåðåçàãðóçèòü Excel äëÿ âûãðóçêè dll", vbExclamation)
|
||||
|
||||
Case IM_REMOVE_HYPERLINKS_OK: Call MsgBox(Fmt("Ãèïåðññûëêè óäàëåíû: {1}", unwrapped), vbInformation)
|
||||
Case IM_REMOVE_BOOKMARKS_OK: Call MsgBox(Fmt("Çàêëàäêè óäàëåíû: {1}", unwrapped), vbInformation)
|
||||
Case IM_REMOVE_IMAGES_OK: Call MsgBox(Fmt("Êàðòèíêè óäàëåíû: {1}", unwrapped), vbInformation)
|
||||
Case IM_SHAPES_TO_TEXT_OK: Call MsgBox("Ïðåîáðàçîâàíèå óñïåøíî çàâåðøåíî", vbInformation)
|
||||
Case IM_CONVERT_CODEPAGE_OK: Call MsgBox("Êîððåêòèðîâêà âûïîëíåíà", vbInformation)
|
||||
Case IM_UNIQUE_BOOKMARKS_OK: Call MsgBox("Ïåðåñîçäàíèå çàêëàäîê çàâåðøåíî", vbInformation)
|
||||
Case IM_REMOVE_ACCENTS_OK: Call MsgBox(Fmt("Óäàëåíû óäàðåíèÿ: {1}", unwrapped), vbInformation)
|
||||
Case IM_CONCEPT_UPDATE_OK: Call MsgBox("Îôèñíûå ïðîäóêòû ÊÎÍÖÅÏÒ îáíîâëåíû óñïåøíî", vbInformation)
|
||||
Case IM_COMMENT_EXPORT_OK: Call MsgBox(Fmt("Âûãðóæåíî ïðèìå÷àíèé: {1}", unwrapped), vbInformation)
|
||||
Case IM_BOOKMARK_IGNORED:
|
||||
Call MsgBox(Fmt("Âûäåëåííàÿ îáëàñòü äîáàâëåíà â èãíîðèðóåìûå" & vbNewLine & _
|
||||
"×òîáû îòìåíèòü äåéñòâèå íåîáõîäèìî óäàëèòü çàêëàäêó {1}", unwrapped), vbInformation)
|
||||
Case IM_HYPERLINKS_FIX_OK:
|
||||
Call MsgBox(Fmt("Îáðàáîòàíî ññûëîê: {1}" & vbNewLine & _
|
||||
"Íàéäåíî íåêîððåêòíûõ: {2}" & vbNewLine & _
|
||||
"Èñïðàâëåíî: {3}", unwrapped), vbInformation)
|
||||
Case IM_RULES_COMPLETE
|
||||
Call MsgBox(Fmt("Âðåìÿ âûïîëíåíèÿ: {1} ms" & vbNewLine & vbNewLine & _
|
||||
"Íàéäåíî îøèáîê: {2}" & vbNewLine & _
|
||||
"Âíåñåíî ïðàâîê: {3}", unwrapped), vbInformation)
|
||||
|
||||
Case Else: Call MsgBox("Íåâåðíûé êîä ñîîáùåíèÿ", vbCritical)
|
||||
End Select
|
||||
End Function
|
||||
|
||||
Public Function UIAskQuestion(theCode As MsgCode, ParamArray params() As Variant) As Boolean
|
||||
Dim unwrapped As Variant: unwrapped = params
|
||||
unwrapped = FixForwardedParams(unwrapped)
|
||||
|
||||
Dim answer&: answer = vbNo
|
||||
Select Case theCode
|
||||
' Case QM_CODE_DELETE_CONFIRM
|
||||
' answer = MsgBox("Are you sure you want to delete ALL macros from target file?", vbYesNo + vbQuestion)
|
||||
|
||||
Case Else
|
||||
Call MsgBox("Íåâåðíûé êîä ñîîáùåíèÿ", vbCritical)
|
||||
End Select
|
||||
UIAskQuestion = answer = vbYes
|
||||
End Function
|
30
src/z_UIRibbon.bas
Normal file
30
src/z_UIRibbon.bas
Normal file
|
@ -0,0 +1,30 @@
|
|||
Attribute VB_Name = "z_UIRibbon"
|
||||
Option Explicit
|
||||
|
||||
Sub CC_OnRibbonBtn(iControl As IRibbonControl)
|
||||
Select Case iControl.ID
|
||||
Case "CheckLinks": Call CC_CheckLinks
|
||||
Case "AddQuote": Call CC_AddQuote
|
||||
Case "EditCut": Call CC_EditCut
|
||||
Case "EditCopy": Call CC_EditCopy
|
||||
Case "CreateLink": Call CC_CreateHLink
|
||||
|
||||
Case "FixParagraph": Call CC_ParFix
|
||||
Case "ExportComments": Call CC_ExportComments
|
||||
Case "RemoveExternalHyperlinks": Call CC_RemoveExternalHyperlinks
|
||||
Case "RemoveAllHyperlinks": Call CC_RemoveAllHyperlinks
|
||||
Case "RemoveImages": Call CC_RemoveImages
|
||||
Case "RemoveBookmarks": Call CC_RemoveBookmarks
|
||||
Case "RemoveAccents": Call CC_RemoveAccents
|
||||
|
||||
Case "MasterText": Call CC_MasterText
|
||||
Case "UpdateConcept": Call CC_UpdateConcept
|
||||
|
||||
Case "Help": Call CC_Help
|
||||
|
||||
Case "Checkup": Call CC_Checkup
|
||||
Case "FixErrors": Call CC_FixErrors
|
||||
Case "IgnoreSelected": Call CC_IgnoreSelected
|
||||
Case "MasterConfig": Call CC_MasterConfig
|
||||
End Select
|
||||
End Sub
|
2
ui/.rels
Normal file
2
ui/.rels
Normal file
|
@ -0,0 +1,2 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
||||
<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships"><Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument" Target="word/document.xml"/><Relationship Id="rId6" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties" Target="docProps/app.xml"/><Relationship Id="rId5" Type="http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties" Target="docProps/core.xml"/><Relationship Id="rId4" Type="http://schemas.microsoft.com/office/2006/relationships/ui/extensibility" Target="customUI/customUI.xml"/></Relationships>
|
101
ui/customUI.xml
Normal file
101
ui/customUI.xml
Normal file
|
@ -0,0 +1,101 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui" xmlns:CC="CONCEPT">
|
||||
<ribbon startFromScratch="false">
|
||||
<tabs>
|
||||
<tab idQ="CC:Concept" label="КОНЦЕПТ">
|
||||
<group id="BasicFunctions" label="Основные" imageMso="FileCompactAndRepairDatabase">
|
||||
<button id="AddQuote"
|
||||
label="Закавычить"
|
||||
supertip="Выделить кавычками выбранный фрагмент [Ctrl+Shift+']"
|
||||
imageMso="NumberInsert"
|
||||
onAction="CC_OnRibbonBtn"/>
|
||||
<button id="EditCut"
|
||||
label="Вырезать"
|
||||
supertip="Вырезать и вставить выбранный фрагмент тексте в конец документа [Ctrl+{]"
|
||||
imageMso="SignatureInsertMenu"
|
||||
onAction="CC_OnRibbonBtn"/>
|
||||
<button id="EditCopy"
|
||||
label="Копировать"
|
||||
supertip="Копировать и вставить выбранный фрагмент тексте в конец документа [Ctrl+}]"
|
||||
imageMso="FileViewDigitalSignatures"
|
||||
onAction="CC_OnRibbonBtn"/>
|
||||
<button id="CreateLink" size="large"
|
||||
label="Создать ссылку"
|
||||
supertip="Создает ссылку на выделенный фрагмент в буфере обмена"
|
||||
imageMso="AdvertisePublishAs"
|
||||
onAction="CC_OnRibbonBtn"/>
|
||||
|
||||
<menu id="EditMenu" label="Edit" imageMso="EditDocument" size="large">
|
||||
<button id="FixParagraph" label="Подгон абзацев [Ctrl+Shift+R]"
|
||||
imageMso="AnimationTriggerAddMenu"
|
||||
onAction="CC_OnRibbonBtn"/>
|
||||
<button id="ExportComments" label="Выгрузить примечания"
|
||||
imageMso="Export"
|
||||
onAction="CC_OnRibbonBtn"/>
|
||||
<button id="RemoveExternalHyperlinks" label="Удалить внешние гиперссылки"
|
||||
imageMso="HyperlinksRemove"
|
||||
onAction="CC_OnRibbonBtn"/>
|
||||
<button id="RemoveAllHyperlinks" label="Удалить все гиперссылки"
|
||||
imageMso="HyperlinkRemove"
|
||||
onAction="CC_OnRibbonBtn"/>
|
||||
<button id="RemoveImages" label="Удалить картинки"
|
||||
imageMso="WebControlSubmitWithImage"
|
||||
onAction="CC_OnRibbonBtn"/>
|
||||
<button id="RemoveBookmarks" label="Удалить закладки"
|
||||
imageMso="VideoBookmarkRemove"
|
||||
onAction="CC_OnRibbonBtn"/>
|
||||
<button id="RemoveAccents" label="Удалить ударения"
|
||||
imageMso="EquationAccentGallery"
|
||||
onAction="CC_OnRibbonBtn"/>
|
||||
<button id="CheckLinks" label="Исправить ссылки на сервер"
|
||||
imageMso="FileServerLinkTables"
|
||||
onAction="CC_OnRibbonBtn"/>
|
||||
</menu>
|
||||
|
||||
<separator id="sepMT"/>
|
||||
|
||||
<button id="UpdateConcept" size="large"
|
||||
label="Обновить CONCEPT"
|
||||
supertip="Обновление всех технологий, входящих в состав офисных продуктов КОНЦЕПТ, включая шаблоны документов"
|
||||
imageMso="DesignerRibbonGiveFeedback"
|
||||
onAction="CC_OnRibbonBtn"/>
|
||||
<button id="Help" size="large"
|
||||
label="Справка"
|
||||
supertip="Вызов справки по надстройкам Word"
|
||||
imageMso="Info"
|
||||
onAction="CC_OnRibbonBtn"/>
|
||||
|
||||
</group>
|
||||
|
||||
<group id="MasterTextGroup" label="Мастер текстов">
|
||||
<button id="Checkup" size="large"
|
||||
label="Проверить"
|
||||
supertip="Выделить проблемы в текущем документе"
|
||||
imageMso="UpdateBibliography"
|
||||
onAction="CC_OnRibbonBtn"/>
|
||||
<button id="FixErrors" size="large"
|
||||
label="Исправить ошибки"
|
||||
supertip="Исправить проблемы в текущем документе"
|
||||
imageMso="TouchTriageFollowUp_Completed"
|
||||
onAction="CC_OnRibbonBtn"/>
|
||||
<button id="IgnoreSelected" size="large"
|
||||
label="Игнорировать"
|
||||
supertip="Игнорировать выделенный фрагмент при проверке"
|
||||
imageMso="IgnoreThisIssue"
|
||||
onAction="CC_OnRibbonBtn"/>
|
||||
<button id="MasterConfig" size="large"
|
||||
label="Конфигурация"
|
||||
supertip="Открыть конфигурацию правил проверки"
|
||||
imageMso="BulletListDefault"
|
||||
onAction="CC_OnRibbonBtn"/>
|
||||
|
||||
<button id="MasterText" size="large"
|
||||
label="Мастер Текстов"
|
||||
supertip="Использовать текущий файл для проверки полнофункциональным Мастером Текстов"
|
||||
imageMso="BlogPublish"
|
||||
onAction="CC_OnRibbonBtn"/>
|
||||
</group>
|
||||
</tab>
|
||||
</tabs>
|
||||
</ribbon>
|
||||
</customUI>
|
2
ui/customizations.xml
Normal file
2
ui/customizations.xml
Normal file
|
@ -0,0 +1,2 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
||||
<wne:tcg xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:wne="http://schemas.microsoft.com/office/word/2006/wordml"><wne:keymaps><wne:keymap wne:kcmPrimary="0226"><wne:macro wne:macroName="CONCEPTAI.MAIN.CC_LINEUP"/></wne:keymap><wne:keymap wne:kcmPrimary="0228"><wne:macro wne:macroName="CONCEPTAI.MAIN.CC_LINEDOWN"/></wne:keymap><wne:keymap wne:kcmPrimary="0231"><wne:macro wne:macroName="CONCEPTAI.MAIN.CC_NONBREAKPAR"/></wne:keymap><wne:keymap wne:kcmPrimary="0232"><wne:macro wne:macroName="CONCEPTAI.MAIN.CC_ADDCOLUMNBREAK"/></wne:keymap><wne:keymap wne:kcmPrimary="0233"><wne:macro wne:macroName="CONCEPTAI.MAIN.CC_WITHNEXT"/></wne:keymap><wne:keymap wne:kcmPrimary="0326"><wne:macro wne:macroName="CONCEPTAI.MAIN.CC_LINEUPA"/></wne:keymap><wne:keymap wne:kcmPrimary="0328"><wne:macro wne:macroName="CONCEPTAI.MAIN.CC_LINEDOWNA"/></wne:keymap><wne:keymap wne:kcmPrimary="0352"><wne:macro wne:macroName="CONCEPTAI.MAIN.CC_PARFIX"/></wne:keymap><wne:keymap wne:kcmPrimary="03DB"><wne:macro wne:macroName="CONCEPTAI.MAIN.CC_EDITCUT"/></wne:keymap><wne:keymap wne:kcmPrimary="03DD"><wne:macro wne:macroName="CONCEPTAI.MAIN.CC_EDITCOPY"/></wne:keymap><wne:keymap wne:kcmPrimary="03DE"><wne:macro wne:macroName="CONCEPTAI.MAIN.CC_ADDQUOTE"/></wne:keymap></wne:keymaps><wne:toolbars><wne:toolbarData r:id="rId1"/></wne:toolbars></wne:tcg>
|
Loading…
Reference in New Issue
Block a user