Initial commit
This commit is contained in:
commit
2bd3bb3f12
42
VBAMake.txt
Normal file
42
VBAMake.txt
Normal file
|
@ -0,0 +1,42 @@
|
||||||
|
# == Properties Section ==
|
||||||
|
# configuration properties
|
||||||
|
# use .ini format to define properties
|
||||||
|
# mandatory properties: name, artifact_home, source_home
|
||||||
|
|
||||||
|
id = Concept-Mining
|
||||||
|
name = Концепт-Майнинг
|
||||||
|
description = Модуль извлечения (парсинга) данных из текстов
|
||||||
|
artifact_home = Концепт-Майнинг
|
||||||
|
source_home = Concept-Mining
|
||||||
|
install_home = \\fs1.concept.ru\projects\10 Автоматизация деятельности\01 Высокие технологии\Концепт-Майнинг
|
||||||
|
|
||||||
|
%%
|
||||||
|
# === Build section ===
|
||||||
|
# Available commands:
|
||||||
|
# build LOCAL_MANIFEST
|
||||||
|
# copy LOCAL_SOURCE -> [LOCAL_ARTIFACT]
|
||||||
|
# save_as LOCAL_ARTIFACT -> LOCAL_ARTIFACT
|
||||||
|
# run LOCAL_SOURCE.bat
|
||||||
|
|
||||||
|
copy test
|
||||||
|
copy distr\models\ActionVerbs.txt -> models\ActionVerbs.txt
|
||||||
|
|
||||||
|
build script\addinManifest.txt
|
||||||
|
build script\databaseManifest.txt
|
||||||
|
save_as !Майнинг.xlsm -> 55 Майнинг.xltm
|
||||||
|
|
||||||
|
%%
|
||||||
|
# === Install section ==
|
||||||
|
# Available commands:
|
||||||
|
# install LOCAL_ARTIFACT -> [INSTALL_PATH]
|
||||||
|
# add_template LOCAL_ARTIFACT -> [LOCAL_TEMPLATE]
|
||||||
|
# run LOCAL_ARTIFACT.bat <- [PARAMETERS]
|
||||||
|
# run APPLICATION <- [PARAMETERS]
|
||||||
|
|
||||||
|
install Надстройка\Parsers.dotm -> Надстройка\Parsers.dotm
|
||||||
|
install !Майнинг.xlsm
|
||||||
|
install 55 Майнинг.xltm
|
||||||
|
|
||||||
|
install Надстройка\Parsers.dotm -> \\fs1.concept.ru\Exchange\ConceptDistr\data\Add-ins\Word\Parsers.dotm
|
||||||
|
install models\ActionVerbs.txt -> \\fs1.concept.ru\Exchange\ConceptDistr\models\ActionVerbs.txt
|
||||||
|
add_template 55 Майнинг.xltm
|
463
distr/models/ActionVerbs.txt
Normal file
463
distr/models/ActionVerbs.txt
Normal file
|
@ -0,0 +1,463 @@
|
||||||
|
аккредитирует
|
||||||
|
анализирует
|
||||||
|
аннулирует
|
||||||
|
апробирует
|
||||||
|
вводит
|
||||||
|
ведет
|
||||||
|
взаимодействует
|
||||||
|
владеет
|
||||||
|
внедряет
|
||||||
|
вносит
|
||||||
|
возглавляет
|
||||||
|
возмещает
|
||||||
|
возобновляет
|
||||||
|
вступает
|
||||||
|
входит
|
||||||
|
выбирает
|
||||||
|
выдает
|
||||||
|
выплачивает
|
||||||
|
выполняет
|
||||||
|
выражает
|
||||||
|
выступает
|
||||||
|
выявляет
|
||||||
|
голосует
|
||||||
|
готовит
|
||||||
|
дает
|
||||||
|
действует
|
||||||
|
делегирует
|
||||||
|
доводит
|
||||||
|
доставляет
|
||||||
|
заключает
|
||||||
|
закрепляет
|
||||||
|
закрывает
|
||||||
|
заполняет
|
||||||
|
запрашивает
|
||||||
|
запрещает
|
||||||
|
заслушивает
|
||||||
|
защищает
|
||||||
|
заявляет
|
||||||
|
знакомит
|
||||||
|
знакомится
|
||||||
|
избирает
|
||||||
|
издает
|
||||||
|
изменяет
|
||||||
|
изучает
|
||||||
|
изымает
|
||||||
|
имеет
|
||||||
|
инициирует
|
||||||
|
информирует
|
||||||
|
исполняет
|
||||||
|
использует
|
||||||
|
истребует
|
||||||
|
комплектует
|
||||||
|
консультирует
|
||||||
|
контролирует
|
||||||
|
координирует
|
||||||
|
награждает
|
||||||
|
назначает
|
||||||
|
налагает
|
||||||
|
направляет
|
||||||
|
несет
|
||||||
|
обеспечивает
|
||||||
|
обжалует
|
||||||
|
обладает
|
||||||
|
обнародует
|
||||||
|
обобщает
|
||||||
|
оборудует
|
||||||
|
образует
|
||||||
|
обращается
|
||||||
|
обязывает
|
||||||
|
ограничивает
|
||||||
|
одобряет
|
||||||
|
оказывает
|
||||||
|
открывает
|
||||||
|
оповещает
|
||||||
|
определяет
|
||||||
|
организовывает
|
||||||
|
организует
|
||||||
|
освещает
|
||||||
|
освобождает
|
||||||
|
осуществляет
|
||||||
|
отвечает
|
||||||
|
отклоняет
|
||||||
|
открывает
|
||||||
|
отменяет
|
||||||
|
отрешает
|
||||||
|
отстраняет
|
||||||
|
отчитывается
|
||||||
|
оформляет
|
||||||
|
оценивает
|
||||||
|
передает
|
||||||
|
переоформляет
|
||||||
|
перечисляет
|
||||||
|
планирует
|
||||||
|
подготавливает
|
||||||
|
поддерживает
|
||||||
|
подписывает
|
||||||
|
получает
|
||||||
|
пользуется
|
||||||
|
поощряет
|
||||||
|
посещает
|
||||||
|
предлагает
|
||||||
|
предоставляет
|
||||||
|
председательствует
|
||||||
|
представляет
|
||||||
|
предъявляет
|
||||||
|
прекращает
|
||||||
|
привлекает
|
||||||
|
приглашает
|
||||||
|
признает
|
||||||
|
применяет
|
||||||
|
принимает
|
||||||
|
приобретает
|
||||||
|
приостанавливает
|
||||||
|
присваивает
|
||||||
|
проверяет
|
||||||
|
проводит
|
||||||
|
прогнозирует
|
||||||
|
продлевает
|
||||||
|
производит
|
||||||
|
публикует
|
||||||
|
развивает
|
||||||
|
размещает
|
||||||
|
разрабатывает
|
||||||
|
разрешает
|
||||||
|
разъясняет
|
||||||
|
распоряжается
|
||||||
|
распределяет
|
||||||
|
распускает
|
||||||
|
рассматривает
|
||||||
|
рассчитывает
|
||||||
|
расторгает
|
||||||
|
реализовывает
|
||||||
|
реализует
|
||||||
|
регистрирует
|
||||||
|
регулирует
|
||||||
|
решает
|
||||||
|
руководит
|
||||||
|
санкционирует
|
||||||
|
совершает
|
||||||
|
совершенствует
|
||||||
|
согласовывает
|
||||||
|
согласует
|
||||||
|
содействует
|
||||||
|
содержит
|
||||||
|
создает
|
||||||
|
созывает
|
||||||
|
составляет
|
||||||
|
способствует
|
||||||
|
требует
|
||||||
|
уведомляет
|
||||||
|
удостоверяет
|
||||||
|
уполномочивает
|
||||||
|
управляет
|
||||||
|
устанавливает
|
||||||
|
утверждает
|
||||||
|
участвует
|
||||||
|
учреждает
|
||||||
|
формирует
|
||||||
|
является
|
||||||
|
аккредитовать
|
||||||
|
анализировать
|
||||||
|
аннулировать
|
||||||
|
апробировать
|
||||||
|
вводить
|
||||||
|
вести
|
||||||
|
взаимодействовать
|
||||||
|
владеть
|
||||||
|
внедрять
|
||||||
|
вносить
|
||||||
|
возглавлять
|
||||||
|
возмещать
|
||||||
|
возобновлять
|
||||||
|
вступать
|
||||||
|
входить
|
||||||
|
выбирать
|
||||||
|
выдавать
|
||||||
|
выплачивать
|
||||||
|
выполнять
|
||||||
|
выражать
|
||||||
|
выступать
|
||||||
|
выявлять
|
||||||
|
голосовать
|
||||||
|
готовить
|
||||||
|
давать
|
||||||
|
действовать
|
||||||
|
делегировать
|
||||||
|
доводить
|
||||||
|
доставлять
|
||||||
|
заключать
|
||||||
|
закреплять
|
||||||
|
закрывать
|
||||||
|
заполнять
|
||||||
|
запрашивать
|
||||||
|
запрещать
|
||||||
|
заслушивать
|
||||||
|
защищать
|
||||||
|
заявлять
|
||||||
|
знакомить
|
||||||
|
знакомиться
|
||||||
|
избирать
|
||||||
|
издавать
|
||||||
|
изменять
|
||||||
|
изучать
|
||||||
|
изымать
|
||||||
|
иметь
|
||||||
|
инициировать
|
||||||
|
информировать
|
||||||
|
исполнять
|
||||||
|
использовать
|
||||||
|
истребовать
|
||||||
|
комплектовать
|
||||||
|
консультировать
|
||||||
|
контролировать
|
||||||
|
координировать
|
||||||
|
награждать
|
||||||
|
назначать
|
||||||
|
налагать
|
||||||
|
направлять
|
||||||
|
нести
|
||||||
|
обеспечивать
|
||||||
|
обжаловать
|
||||||
|
обладать
|
||||||
|
обнародовать
|
||||||
|
обобщать
|
||||||
|
оборудовать
|
||||||
|
образовывать
|
||||||
|
обращаться
|
||||||
|
обязывать
|
||||||
|
ограничивать
|
||||||
|
одобрять
|
||||||
|
оказывать
|
||||||
|
открывать
|
||||||
|
оповещать
|
||||||
|
определять
|
||||||
|
организовывать
|
||||||
|
организовать
|
||||||
|
освещать
|
||||||
|
освобождать
|
||||||
|
осуществлять
|
||||||
|
отвечать
|
||||||
|
отклонять
|
||||||
|
открывать
|
||||||
|
отменять
|
||||||
|
отрешать
|
||||||
|
отстранять
|
||||||
|
отчитываться
|
||||||
|
оформлять
|
||||||
|
оценивать
|
||||||
|
передать
|
||||||
|
переоформлять
|
||||||
|
перечислять
|
||||||
|
планировать
|
||||||
|
подготавливать
|
||||||
|
поддерживать
|
||||||
|
подписывать
|
||||||
|
получать
|
||||||
|
пользоваться
|
||||||
|
поощрять
|
||||||
|
посещать
|
||||||
|
предлагать
|
||||||
|
предоставлять
|
||||||
|
председательствовать
|
||||||
|
представлять
|
||||||
|
предъявлять
|
||||||
|
прекращать
|
||||||
|
привлекать
|
||||||
|
приглашать
|
||||||
|
признать
|
||||||
|
применять
|
||||||
|
принимать
|
||||||
|
приобретать
|
||||||
|
приостанавливать
|
||||||
|
присваивать
|
||||||
|
проверять
|
||||||
|
проводить
|
||||||
|
прогнозировать
|
||||||
|
продлевать
|
||||||
|
производить
|
||||||
|
публиковать
|
||||||
|
развивать
|
||||||
|
размещать
|
||||||
|
разрабатывать
|
||||||
|
разрешать
|
||||||
|
разъяснять
|
||||||
|
распоряжаться
|
||||||
|
распределять
|
||||||
|
распускать
|
||||||
|
рассматривать
|
||||||
|
рассчитывать
|
||||||
|
расторгать
|
||||||
|
реализовывать
|
||||||
|
реализовать
|
||||||
|
регистрировать
|
||||||
|
регулировать
|
||||||
|
решать
|
||||||
|
руководить
|
||||||
|
санкционировать
|
||||||
|
совершать
|
||||||
|
совершенствовать
|
||||||
|
согласовывать
|
||||||
|
согласовать
|
||||||
|
содействовать
|
||||||
|
содержать
|
||||||
|
создавать
|
||||||
|
созывать
|
||||||
|
составлять
|
||||||
|
способствовать
|
||||||
|
требовать
|
||||||
|
уведомлять
|
||||||
|
удостоверять
|
||||||
|
уполномочивать
|
||||||
|
управлять
|
||||||
|
устанавливать
|
||||||
|
утверждать
|
||||||
|
участвовать
|
||||||
|
учреждать
|
||||||
|
формировать
|
||||||
|
являться
|
||||||
|
аккредитация
|
||||||
|
анализирование
|
||||||
|
аннулирование
|
||||||
|
апробирование
|
||||||
|
введение
|
||||||
|
ведение
|
||||||
|
взаимодействие
|
||||||
|
владение
|
||||||
|
внедрение
|
||||||
|
внесение
|
||||||
|
возглавление
|
||||||
|
возмещение
|
||||||
|
возобновление
|
||||||
|
вступление
|
||||||
|
вхождение
|
||||||
|
выбирание
|
||||||
|
выдавание
|
||||||
|
выплачивание
|
||||||
|
выполнение
|
||||||
|
выражение
|
||||||
|
выступление
|
||||||
|
выявление
|
||||||
|
голосование
|
||||||
|
дача
|
||||||
|
действие
|
||||||
|
делегирование
|
||||||
|
доведение
|
||||||
|
доставление
|
||||||
|
заключение
|
||||||
|
закрепление
|
||||||
|
закрывание
|
||||||
|
заполнение
|
||||||
|
запрашивание
|
||||||
|
запрещение
|
||||||
|
заслушивание
|
||||||
|
защита
|
||||||
|
заявление
|
||||||
|
знакомство
|
||||||
|
ознакомление
|
||||||
|
избирание
|
||||||
|
издание
|
||||||
|
изменение
|
||||||
|
изучение
|
||||||
|
изъятие
|
||||||
|
имение
|
||||||
|
иницирование
|
||||||
|
информирование
|
||||||
|
исполнение
|
||||||
|
использование
|
||||||
|
требование
|
||||||
|
комплектование
|
||||||
|
консультирование
|
||||||
|
контролирование
|
||||||
|
координирование
|
||||||
|
награждение
|
||||||
|
назначение
|
||||||
|
налагание
|
||||||
|
направление
|
||||||
|
несение
|
||||||
|
обеспечение
|
||||||
|
обжалование
|
||||||
|
обладание
|
||||||
|
обнародование
|
||||||
|
обобщение
|
||||||
|
оборудование
|
||||||
|
обращение
|
||||||
|
ограничение
|
||||||
|
одобрение
|
||||||
|
оказание
|
||||||
|
открывание
|
||||||
|
оповещение
|
||||||
|
определение
|
||||||
|
освещение
|
||||||
|
освобождение
|
||||||
|
осуществление
|
||||||
|
отвечание
|
||||||
|
отклонение
|
||||||
|
открывание
|
||||||
|
отрешение
|
||||||
|
отстранение
|
||||||
|
оформление
|
||||||
|
передача
|
||||||
|
переоформление
|
||||||
|
перечисление
|
||||||
|
планирование
|
||||||
|
поддерживание
|
||||||
|
подписывание
|
||||||
|
получение
|
||||||
|
пользование
|
||||||
|
поощрение
|
||||||
|
посещение
|
||||||
|
предложение
|
||||||
|
предоставление
|
||||||
|
председательствование
|
||||||
|
представление
|
||||||
|
предъявление
|
||||||
|
прекращение
|
||||||
|
привлечение
|
||||||
|
приглашение
|
||||||
|
признание
|
||||||
|
применение
|
||||||
|
приобретение
|
||||||
|
приостановление
|
||||||
|
присваивание
|
||||||
|
проверка
|
||||||
|
проведение
|
||||||
|
прогнозирование
|
||||||
|
продление
|
||||||
|
производство
|
||||||
|
публикование
|
||||||
|
развитие
|
||||||
|
размещение
|
||||||
|
разрабатывание
|
||||||
|
разрешение
|
||||||
|
разъяснение
|
||||||
|
распоряжение
|
||||||
|
распределение
|
||||||
|
распускание
|
||||||
|
рассмотрение
|
||||||
|
расторжение
|
||||||
|
реализация
|
||||||
|
регистрирование
|
||||||
|
регулирование
|
||||||
|
решение
|
||||||
|
руководство
|
||||||
|
санкционирование
|
||||||
|
совершение
|
||||||
|
совершенствование
|
||||||
|
согласование
|
||||||
|
содействие
|
||||||
|
содержание
|
||||||
|
создание
|
||||||
|
составление
|
||||||
|
способствование
|
||||||
|
требование
|
||||||
|
уведомление
|
||||||
|
удостоверение
|
||||||
|
уполномочивание
|
||||||
|
управление
|
||||||
|
установление
|
||||||
|
утверждение
|
||||||
|
участие
|
||||||
|
учреждение
|
||||||
|
формирование
|
||||||
|
явление
|
102
script/addinManifest.txt
Normal file
102
script/addinManifest.txt
Normal file
|
@ -0,0 +1,102 @@
|
||||||
|
# == Properties Section ==
|
||||||
|
# configuration properties
|
||||||
|
# use .ini format to define properties
|
||||||
|
# mandatory properties: name, artifact
|
||||||
|
|
||||||
|
name = Parsers.dotm
|
||||||
|
artifact = Надстройка\Parsers.dotm
|
||||||
|
|
||||||
|
%%
|
||||||
|
# === Imports Section ===
|
||||||
|
# Hierarchy of folders and files
|
||||||
|
# Use Tabulator to mark next level in hierarchy
|
||||||
|
# All folders are nested into SharedHome path
|
||||||
|
|
||||||
|
api
|
||||||
|
ex_Python.bas
|
||||||
|
ex_WinAPI.bas
|
||||||
|
|
||||||
|
API_Python.cls
|
||||||
|
API_Ribbon.cls
|
||||||
|
API_XLWrapper.cls
|
||||||
|
API_UserInteraction.cls
|
||||||
|
|
||||||
|
word
|
||||||
|
ex_Word.bas
|
||||||
|
|
||||||
|
parsers
|
||||||
|
ParserDeclarations.bas
|
||||||
|
z_ParserRegex.bas
|
||||||
|
PC_ParsedData.cls
|
||||||
|
PC_Fragment.cls
|
||||||
|
ExtractionOptions.cls
|
||||||
|
|
||||||
|
PC_Tools.cls
|
||||||
|
DetectorClassifier.cls
|
||||||
|
DetectorListWords.cls
|
||||||
|
DetectorRegex.cls
|
||||||
|
DetectorMorpho.cls
|
||||||
|
|
||||||
|
ParserDate.cls
|
||||||
|
ParserNPA.cls
|
||||||
|
|
||||||
|
PC_InfoNPA.cls
|
||||||
|
|
||||||
|
|
||||||
|
utility
|
||||||
|
ex_VBA.bas
|
||||||
|
ex_Regex.bas
|
||||||
|
ex_DataPreparation.bas
|
||||||
|
|
||||||
|
API_Config.cls
|
||||||
|
API_JSON.cls
|
||||||
|
API_Timer.cls
|
||||||
|
|
||||||
|
ui
|
||||||
|
CSE_ProgressBar.frm
|
||||||
|
|
||||||
|
dev
|
||||||
|
DevTester.bas
|
||||||
|
|
||||||
|
%%
|
||||||
|
# === Source Code Section ==
|
||||||
|
# Hierarchy of folders and files
|
||||||
|
# Use Tabulator to mark next level in hierarchy
|
||||||
|
# All folders are nested into SourceHome path
|
||||||
|
|
||||||
|
src
|
||||||
|
addin
|
||||||
|
DevHelper.bas
|
||||||
|
|
||||||
|
Declarations.bas
|
||||||
|
Main.bas
|
||||||
|
MainImpl.bas
|
||||||
|
z_UIRibbon.bas
|
||||||
|
z_UIMessages.bas
|
||||||
|
|
||||||
|
UIState.cls
|
||||||
|
IteratorDetected.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
|
||||||
|
|
||||||
|
addin\.rels -> _rels\.rels
|
||||||
|
addin\customUI.xml -> customUI\customUI.xml
|
||||||
|
|
||||||
|
%%
|
||||||
|
# === References Section ===
|
||||||
|
# List dependencies in one of the formats
|
||||||
|
# global : GLOBAL_NAME
|
||||||
|
# guid : {REGISTERED_GUID}
|
||||||
|
# file : PATH_TO_LIBRARY
|
||||||
|
|
||||||
|
global : VBScript_RegExp_55
|
||||||
|
global : Scripting
|
||||||
|
global : Shell32
|
||||||
|
global : MSForms
|
||||||
|
global : ADODB
|
||||||
|
global : Excel
|
82
script/databaseManifest.txt
Normal file
82
script/databaseManifest.txt
Normal file
|
@ -0,0 +1,82 @@
|
||||||
|
# == Properties Section ==
|
||||||
|
# configuration properties
|
||||||
|
# use .ini format to define properties
|
||||||
|
# mandatory properties: name, artifact
|
||||||
|
|
||||||
|
name = !Майнинг.xlsm
|
||||||
|
artifact = !Майнинг.xlsm
|
||||||
|
|
||||||
|
%%
|
||||||
|
# === Imports Section ===
|
||||||
|
# Hierarchy of folders and files
|
||||||
|
# Use Tabulator to mark next level in hierarchy
|
||||||
|
# All folders are nested into SharedHome path
|
||||||
|
|
||||||
|
api
|
||||||
|
ex_WinAPI.bas
|
||||||
|
API_WordWrapper.cls
|
||||||
|
API_XLWrapper.cls
|
||||||
|
API_UserInteraction.cls
|
||||||
|
|
||||||
|
parsers
|
||||||
|
ParserDeclarations.bas
|
||||||
|
ExtractionOptions.cls
|
||||||
|
|
||||||
|
utility
|
||||||
|
ex_VBA.bas
|
||||||
|
ex_DataPreparation.bas
|
||||||
|
ex_Version.bas
|
||||||
|
|
||||||
|
API_DistrManifest.cls
|
||||||
|
API_JSON.cls
|
||||||
|
API_Timer.cls
|
||||||
|
|
||||||
|
ui
|
||||||
|
CSE_ProgressBar.frm
|
||||||
|
|
||||||
|
dev
|
||||||
|
DevTester.bas
|
||||||
|
|
||||||
|
%%
|
||||||
|
# === Source Code Section ==
|
||||||
|
# Hierarchy of folders and files
|
||||||
|
# Use Tabulator to mark next level in hierarchy
|
||||||
|
# All folders are nested into SourceHome path
|
||||||
|
|
||||||
|
src
|
||||||
|
database
|
||||||
|
ImportDlg.frm
|
||||||
|
|
||||||
|
DevHelper.bas
|
||||||
|
|
||||||
|
Declarations.bas
|
||||||
|
DataAccess.bas
|
||||||
|
Main.bas
|
||||||
|
MainImpl.bas
|
||||||
|
ManualSubs.bas
|
||||||
|
z_UIRibbon.bas
|
||||||
|
z_UIMessages.bas
|
||||||
|
|
||||||
|
test
|
||||||
|
s_WordInteractions.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
|
||||||
|
|
||||||
|
database\.rels -> _rels\.rels
|
||||||
|
database\customUI.xml -> customUI\customUI.xml
|
||||||
|
|
||||||
|
%%
|
||||||
|
# === References Section ===
|
||||||
|
# List dependencies in one of the formats
|
||||||
|
# global : GLOBAL_NAME
|
||||||
|
# guid : {REGISTERED_GUID}
|
||||||
|
# file : PATH_TO_LIBRARY
|
||||||
|
|
||||||
|
global : Word
|
||||||
|
global : Shell32
|
||||||
|
global : Scripting
|
||||||
|
global : MSForms
|
BIN
skeleton/!Майнинг.xlsm
Normal file
BIN
skeleton/!Майнинг.xlsm
Normal file
Binary file not shown.
BIN
skeleton/Parsers.dotm
Normal file
BIN
skeleton/Parsers.dotm
Normal file
Binary file not shown.
63
src/addin/Declarations.bas
Normal file
63
src/addin/Declarations.bas
Normal file
|
@ -0,0 +1,63 @@
|
||||||
|
Attribute VB_Name = "Declarations"
|
||||||
|
Option Private Module
|
||||||
|
Option Explicit
|
||||||
|
|
||||||
|
Public Const MAX_FIND_LEN = 250
|
||||||
|
|
||||||
|
Public Const TEMP_FILE_NAME = "conceptParsers"
|
||||||
|
|
||||||
|
' Markup color
|
||||||
|
Public Enum TColor
|
||||||
|
[_First] = 1
|
||||||
|
|
||||||
|
T_COLOR_YELLOW = 1 ' = 7
|
||||||
|
T_COLOR_GREEN = 2 ' = 4
|
||||||
|
T_COLOR_TEAL = 3 ' = 10
|
||||||
|
T_COLOR_GREY = 4 ' = 15
|
||||||
|
T_COLOR_BLUE = 5 ' = 9
|
||||||
|
|
||||||
|
[_Last] = 5
|
||||||
|
End Enum
|
||||||
|
|
||||||
|
' _E_ - export
|
||||||
|
Public Enum ExportStruct
|
||||||
|
[_First] = 1
|
||||||
|
|
||||||
|
S_E_ID = 1
|
||||||
|
S_E_START = 2
|
||||||
|
S_E_FINISH = 3
|
||||||
|
S_E_TYPE = 4
|
||||||
|
S_E_TEXT = 5
|
||||||
|
S_E_DATA = 6
|
||||||
|
|
||||||
|
[_Last] = 6
|
||||||
|
End Enum
|
||||||
|
|
||||||
|
Public Function ColorToStr(iColor As TColor) As String
|
||||||
|
Select Case iColor
|
||||||
|
Case T_COLOR_YELLOW: ColorToStr = "Æåëòûé"
|
||||||
|
Case T_COLOR_GREEN: ColorToStr = "Çåëåíûé"
|
||||||
|
Case T_COLOR_TEAL: ColorToStr = "Ìîðñêîé"
|
||||||
|
Case T_COLOR_GREY: ColorToStr = "Ñåðûé"
|
||||||
|
Case T_COLOR_BLUE: ColorToStr = "Ñèíèé"
|
||||||
|
End Select
|
||||||
|
End Function
|
||||||
|
|
||||||
|
Public Function ColorToColorIndex(iColor As TColor) As Integer
|
||||||
|
Select Case iColor
|
||||||
|
Case T_COLOR_YELLOW: ColorToColorIndex = WdColorIndex.wdYellow
|
||||||
|
Case T_COLOR_GREEN: ColorToColorIndex = WdColorIndex.wdBrightGreen
|
||||||
|
Case T_COLOR_TEAL: ColorToColorIndex = WdColorIndex.wdTurquoise
|
||||||
|
Case T_COLOR_GREY: ColorToColorIndex = WdColorIndex.wdGray25
|
||||||
|
Case T_COLOR_BLUE: ColorToColorIndex = WdColorIndex.wdBlue
|
||||||
|
End Select
|
||||||
|
End Function
|
||||||
|
|
||||||
|
Public Function PTools() As PC_Tools
|
||||||
|
Static s_Parsers As PC_Tools
|
||||||
|
If s_Parsers Is Nothing Then
|
||||||
|
Set s_Parsers = New PC_Tools
|
||||||
|
End If
|
||||||
|
Set PTools = s_Parsers
|
||||||
|
End Function
|
||||||
|
|
20
src/addin/DevHelper.bas
Normal file
20
src/addin/DevHelper.bas
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
Attribute VB_Name = "DevHelper"
|
||||||
|
Option Explicit
|
||||||
|
|
||||||
|
Public Function Dev_PrepareSkeleton()
|
||||||
|
Call ThisDocument.Range.Delete
|
||||||
|
End Function
|
||||||
|
|
||||||
|
Public Sub Dev_ManualRunTest()
|
||||||
|
Dim sSuite$: sSuite = "s_Database"
|
||||||
|
Dim sTest$: sTest = "t_RenameLawFile"
|
||||||
|
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_ActiveStateExporter": Set Dev_GetTestSuite = New s_ActiveStateExporter
|
||||||
|
End Select
|
||||||
|
End Function
|
158
src/addin/IteratorDetected.cls
Normal file
158
src/addin/IteratorDetected.cls
Normal file
|
@ -0,0 +1,158 @@
|
||||||
|
VERSION 1.0 CLASS
|
||||||
|
BEGIN
|
||||||
|
MultiUse = -1 'True
|
||||||
|
END
|
||||||
|
Attribute VB_Name = "IteratorDetected"
|
||||||
|
Attribute VB_GlobalNameSpace = False
|
||||||
|
Attribute VB_Creatable = False
|
||||||
|
Attribute VB_PredeclaredId = False
|
||||||
|
Attribute VB_Exposed = False
|
||||||
|
' Èòåðàòîð íà îñíîâå ìåõàíèçìà äåòåêöèè âõîæäåíèé
|
||||||
|
Option Explicit
|
||||||
|
|
||||||
|
Private Const NO_CURRENT_ID = -1
|
||||||
|
|
||||||
|
Private selection_ As Word.Range
|
||||||
|
Private detector_ As Object
|
||||||
|
|
||||||
|
Private start_ As Long
|
||||||
|
Private data_ As PC_ParsedData
|
||||||
|
Private currentID_ As Long
|
||||||
|
|
||||||
|
Public Function Init(theDoc As Word.Document, iDetector As Object, Optional nStart& = 0)
|
||||||
|
Set selection_ = theDoc.Range(nStart, nStart)
|
||||||
|
Set detector_ = iDetector
|
||||||
|
|
||||||
|
start_ = selection_.Paragraphs.First.Range.Start
|
||||||
|
Dim sText$: sText = selection_.Paragraphs.First.Range.Text
|
||||||
|
Set data_ = detector_.ExtractFragments(sText)
|
||||||
|
currentID_ = IIf(data_.Count = 0, 0, NO_CURRENT_ID)
|
||||||
|
End Function
|
||||||
|
|
||||||
|
Public Function Range() As Word.Range
|
||||||
|
Set Range = selection_
|
||||||
|
End Function
|
||||||
|
|
||||||
|
Public Function Fragment() As PC_Fragment
|
||||||
|
If currentID_ <> NO_CURRENT_ID Then _
|
||||||
|
Set Fragment = data_.data_.Item(currentID_)
|
||||||
|
End Function
|
||||||
|
|
||||||
|
Public Function MoveNext() As Word.Range
|
||||||
|
If currentID_ = NO_CURRENT_ID Then
|
||||||
|
If Not InitNext Then _
|
||||||
|
Exit Function
|
||||||
|
ElseIf currentID_ = data_.Count Then
|
||||||
|
If Not NextChunk Then _
|
||||||
|
Exit Function
|
||||||
|
currentID_ = 1
|
||||||
|
Else
|
||||||
|
currentID_ = currentID_ + 1
|
||||||
|
End If
|
||||||
|
|
||||||
|
Set selection_ = RangeForFragment(data_.data_.Item(currentID_))
|
||||||
|
Set MoveNext = selection_
|
||||||
|
End Function
|
||||||
|
|
||||||
|
Public Function MovePrev() As Word.Range
|
||||||
|
If currentID_ = NO_CURRENT_ID Then
|
||||||
|
If Not InitPrev Then _
|
||||||
|
Exit Function
|
||||||
|
ElseIf currentID_ <= 1 Then
|
||||||
|
If Not PrevChunk Then _
|
||||||
|
Exit Function
|
||||||
|
currentID_ = data_.Count
|
||||||
|
Else
|
||||||
|
currentID_ = currentID_ - 1
|
||||||
|
End If
|
||||||
|
|
||||||
|
Set selection_ = RangeForFragment(data_.data_.Item(currentID_))
|
||||||
|
Set MovePrev = selection_
|
||||||
|
End Function
|
||||||
|
|
||||||
|
' ======
|
||||||
|
Private Function RangeForFragment(iFragment As PC_Fragment) As Word.Range
|
||||||
|
Dim iRange As Word.Range: Set iRange = selection_.Document.Range(start_, start_)
|
||||||
|
Call iRange.MoveStart(wdCharacter, iFragment.start_)
|
||||||
|
Call iRange.Collapse(wdCollapseStart)
|
||||||
|
Call iRange.MoveEnd(wdCharacter, iFragment.end_ - iFragment.start_)
|
||||||
|
Set RangeForFragment = iRange
|
||||||
|
End Function
|
||||||
|
|
||||||
|
Private Function InitNext() As Boolean
|
||||||
|
Dim nTarget&: nTarget = selection_.End
|
||||||
|
Dim iRange As Word.Range
|
||||||
|
Dim nFragment&
|
||||||
|
For nFragment = 1 To data_.Count Step 1
|
||||||
|
Set iRange = RangeForFragment(data_.data_.Item(nFragment))
|
||||||
|
If iRange.Start >= nTarget Then
|
||||||
|
InitNext = True
|
||||||
|
currentID_ = nFragment
|
||||||
|
Exit Function
|
||||||
|
End If
|
||||||
|
Next nFragment
|
||||||
|
|
||||||
|
If Not NextChunk Then _
|
||||||
|
Exit Function
|
||||||
|
InitNext = True
|
||||||
|
currentID_ = 1
|
||||||
|
End Function
|
||||||
|
|
||||||
|
Private Function InitPrev() As Boolean
|
||||||
|
Dim nTarget&: nTarget = selection_.Start
|
||||||
|
Dim iRange As Word.Range
|
||||||
|
Dim nFragment&
|
||||||
|
For nFragment = data_.Count To 1 Step -1
|
||||||
|
Set iRange = RangeForFragment(data_.data_.Item(nFragment))
|
||||||
|
If iRange.End <= nTarget Then
|
||||||
|
InitPrev = True
|
||||||
|
currentID_ = nFragment
|
||||||
|
Exit Function
|
||||||
|
End If
|
||||||
|
Next nFragment
|
||||||
|
|
||||||
|
If Not PrevChunk Then _
|
||||||
|
Exit Function
|
||||||
|
InitPrev = True
|
||||||
|
currentID_ = data_.Count
|
||||||
|
End Function
|
||||||
|
|
||||||
|
Private Function NextChunk() As Boolean
|
||||||
|
Dim iRange As Word.Range: Set iRange = selection_.Document.Range(start_, start_)
|
||||||
|
Dim oldStart&
|
||||||
|
Do
|
||||||
|
oldStart = iRange.Start
|
||||||
|
Call iRange.Move(wdParagraph, 1)
|
||||||
|
If iRange.Start = oldStart Or iRange.Start + 1 >= selection_.Document.Range.End Then
|
||||||
|
NextChunk = False
|
||||||
|
Exit Function
|
||||||
|
End If
|
||||||
|
Dim sText$: sText = iRange.Paragraphs.First.Range.Text
|
||||||
|
Dim iData As PC_ParsedData: Set iData = detector_.ExtractFragments(sText)
|
||||||
|
If Not iData.IsEmpty Then
|
||||||
|
NextChunk = True
|
||||||
|
start_ = iRange.Start
|
||||||
|
Set data_ = iData
|
||||||
|
Exit Function
|
||||||
|
End If
|
||||||
|
Loop
|
||||||
|
End Function
|
||||||
|
|
||||||
|
Private Function PrevChunk() As Boolean
|
||||||
|
Dim iRange As Word.Range: Set iRange = selection_.Document.Range(start_, start_)
|
||||||
|
Do
|
||||||
|
If iRange.Start = 0 Then
|
||||||
|
PrevChunk = False
|
||||||
|
Exit Function
|
||||||
|
End If
|
||||||
|
Call iRange.Move(wdParagraph, -1)
|
||||||
|
Dim sText$: sText = iRange.Paragraphs.First.Range.Text
|
||||||
|
Dim iData As PC_ParsedData: Set iData = detector_.ExtractFragments(sText)
|
||||||
|
If Not iData.IsEmpty Then
|
||||||
|
PrevChunk = True
|
||||||
|
start_ = iRange.Start
|
||||||
|
Set data_ = iData
|
||||||
|
Exit Function
|
||||||
|
End If
|
||||||
|
Loop
|
||||||
|
End Function
|
178
src/addin/Main.bas
Normal file
178
src/addin/Main.bas
Normal file
|
@ -0,0 +1,178 @@
|
||||||
|
Attribute VB_Name = "Main"
|
||||||
|
Option Explicit
|
||||||
|
|
||||||
|
Public Function ExportAllData(iParamData() As String) As Variant
|
||||||
|
Dim oData As New Collection
|
||||||
|
Dim params As New ExtractionOptions: Call params.FromFlatData(iParamData)
|
||||||
|
|
||||||
|
Dim iDoc As Word.Document: Set iDoc = Word.ActiveDocument
|
||||||
|
Dim oItem As Collection
|
||||||
|
|
||||||
|
On Error GoTo RETURN_EMPTY
|
||||||
|
Dim iDetector As Object: Set iDetector = PTools().Detector(params.detector_, params.param_)
|
||||||
|
Dim oIterator As New IteratorDetected: Call oIterator.Init(iDoc, iDetector)
|
||||||
|
Do While Not oIterator.MoveNext Is Nothing
|
||||||
|
Set oItem = New Collection
|
||||||
|
Call oItem.Add(oIterator.Range.Start)
|
||||||
|
Call oItem.Add(oIterator.Range.End)
|
||||||
|
Call oItem.Add(IIf(oIterator.Fragment.type_ <> 0, oIterator.Fragment.type_, params.loadCategory_))
|
||||||
|
Call oItem.Add(SubstituteWhitespace(oIterator.Range.Text))
|
||||||
|
|
||||||
|
Call oData.Add(oItem)
|
||||||
|
Loop
|
||||||
|
On Error GoTo 0
|
||||||
|
|
||||||
|
RETURN_EMPTY:
|
||||||
|
ExportAllData = ConverToFlat2D(oData)
|
||||||
|
End Function
|
||||||
|
|
||||||
|
Public Sub RunNextFragment()
|
||||||
|
Dim rSelection As Word.Range: Set rSelection = Word.Selection.Range
|
||||||
|
Dim iDetector As Object: Set iDetector = PTools().Detector(GetUIState.detector_, GetUIState.detectionParam_)
|
||||||
|
Dim oIterator As New IteratorDetected: Call oIterator.Init(rSelection.Document, iDetector, rSelection.End)
|
||||||
|
If Not oIterator.MoveNext Is Nothing Then
|
||||||
|
Call oIterator.Range.Select
|
||||||
|
Else
|
||||||
|
Call VBA.Beep
|
||||||
|
End If
|
||||||
|
End Sub
|
||||||
|
|
||||||
|
Public Sub RunPrevFragment()
|
||||||
|
Dim rSelection As Word.Range: Set rSelection = Word.Selection.Range
|
||||||
|
Dim iDetector As Object: Set iDetector = PTools().Detector(GetUIState.detector_, GetUIState.detectionParam_)
|
||||||
|
Dim oIterator As New IteratorDetected: Call oIterator.Init(rSelection.Document, iDetector, rSelection.Start)
|
||||||
|
If Not oIterator.MovePrev Is Nothing Then
|
||||||
|
Call oIterator.Range.Select
|
||||||
|
Else
|
||||||
|
Call VBA.Beep
|
||||||
|
End If
|
||||||
|
End Sub
|
||||||
|
|
||||||
|
Public Sub RunMarkWord()
|
||||||
|
Dim iDoc As Word.Document: Set iDoc = Word.ActiveDocument
|
||||||
|
Dim nCount&: nCount = MarkAllDetected(iDoc, GetUIState.detector_, GetUIState.color_, GetUIState.detectionParam_)
|
||||||
|
Call iDoc.Application.ScreenRefresh
|
||||||
|
Call UserInteraction.ShowMessage(IM_MARKDOWN_COMPLETE, nCount)
|
||||||
|
End Sub
|
||||||
|
|
||||||
|
Public Sub RunMarkParagraph()
|
||||||
|
Dim iDoc As Word.Document: Set iDoc = Word.ActiveDocument
|
||||||
|
Dim nCount&: nCount = MarkAllParagraphs(iDoc, GetUIState.detector_, GetUIState.color_, GetUIState.detectionParam_)
|
||||||
|
Call iDoc.Application.ScreenRefresh
|
||||||
|
Call UserInteraction.ShowMessage(IM_MARKDOWN_COMPLETE, nCount)
|
||||||
|
End Sub
|
||||||
|
|
||||||
|
Public Sub RunBrowseFile()
|
||||||
|
Dim sFile$: sFile = UserInteraction.PromptFileFilter(ActiveDocument.Path & "\", "All files", "*.*")
|
||||||
|
If sFile = vbNullString Then _
|
||||||
|
Exit Sub
|
||||||
|
|
||||||
|
GetUIState.detectionParam_ = sFile
|
||||||
|
GetUIState.ribbon_.Value.Invalidate
|
||||||
|
End Sub
|
||||||
|
|
||||||
|
Public Sub RunMorphoParse()
|
||||||
|
Dim sText$: sText = EnsureSelectedText()
|
||||||
|
If sText = vbNullString Then _
|
||||||
|
Exit Sub
|
||||||
|
Dim sTags$: sTags = MorphoParse(sText)
|
||||||
|
Call UserInteraction.ShowMessage(IM_PARSE_MORPHO, sTags)
|
||||||
|
End Sub
|
||||||
|
|
||||||
|
Public Sub RunContextInfo()
|
||||||
|
Dim sText$: sText = EnsureSelectedText()
|
||||||
|
If sText = vbNullString Then _
|
||||||
|
Exit Sub
|
||||||
|
|
||||||
|
Dim iDetector As Object: Set iDetector = PTools().Detector(GetUIState.detector_, GetUIState.detectionParam_)
|
||||||
|
If Not iDetector.Test(sText) Then
|
||||||
|
Call UserInteraction.ShowMessage(IM_TEST_FAILED, DetectorToStr(GetUIState.detector_))
|
||||||
|
Exit Sub
|
||||||
|
End If
|
||||||
|
|
||||||
|
Dim iParser As Object: Set iParser = PTools().Parser(GetUIState.detector_, GetUIState.detectionParam_)
|
||||||
|
If iParser Is Nothing Then
|
||||||
|
Call UserInteraction.ShowMessage(IM_NO_PARSER_DATA, DetectorToStr(GetUIState.detector_))
|
||||||
|
Exit Sub
|
||||||
|
End If
|
||||||
|
If Not iParser.Parse(sText) Then
|
||||||
|
Call UserInteraction.ShowMessage(IM_NO_PARSER_DATA, DetectorToStr(GetUIState.detector_))
|
||||||
|
Exit Sub
|
||||||
|
End If
|
||||||
|
|
||||||
|
Call UserInteraction.ShowMessage(IM_PARSED_DESCRIPTION, sText, DetectorToStr(GetUIState.detector_), iParser.GetDataDescription())
|
||||||
|
End Sub
|
||||||
|
|
||||||
|
Public Sub RunTransformSingle()
|
||||||
|
Dim rSelection As Word.Range: Set rSelection = WordAdjustRange(Word.Selection.Range)
|
||||||
|
Call rSelection.MoveEndWhile(" ", -1)
|
||||||
|
Dim sText$: sText = VBA.Trim(rSelection.Text)
|
||||||
|
If sText = vbNullString Then
|
||||||
|
Call UserInteraction.ShowMessage(EM_SELECTION_EMPTY)
|
||||||
|
Exit Sub
|
||||||
|
End If
|
||||||
|
|
||||||
|
Dim iDetector As Object: Set iDetector = PTools().Detector(GetUIState.detector_, GetUIState.detectionParam_)
|
||||||
|
If Not iDetector.Test(sText) Then
|
||||||
|
Call UserInteraction.ShowMessage(IM_TEST_FAILED, DetectorToStr(GetUIState.detector_))
|
||||||
|
Exit Sub
|
||||||
|
End If
|
||||||
|
|
||||||
|
Dim iParser As Object: Set iParser = PTools().Parser(GetUIState.detector_, GetUIState.detectionParam_)
|
||||||
|
If iParser Is Nothing Then _
|
||||||
|
Exit Sub
|
||||||
|
|
||||||
|
Dim sNewText$: sNewText = iParser.Transform(sText, GetUIState.transformParam_)
|
||||||
|
If sText <> sNewText Then _
|
||||||
|
rSelection.Text = sNewText
|
||||||
|
Call rSelection.Select
|
||||||
|
End Sub
|
||||||
|
|
||||||
|
Public Sub RunTransformAll()
|
||||||
|
Dim iDoc As Word.Document: Set iDoc = Word.ActiveDocument
|
||||||
|
|
||||||
|
Dim nCount&: nCount = TransformAll(iDoc, GetUIState.GetOptions)
|
||||||
|
|
||||||
|
Call UserInteraction.ShowMessage(IM_TRANSFORM_COMPLETE, nCount)
|
||||||
|
End Sub
|
||||||
|
|
||||||
|
Public Sub RunExportRanges()
|
||||||
|
Dim iDoc As Word.Document: Set iDoc = Word.ActiveDocument
|
||||||
|
|
||||||
|
Dim xlApp As New API_XLWrapper
|
||||||
|
Dim outWB As Excel.Workbook: Set outWB = xlApp.NewDocument
|
||||||
|
Call xlApp.PauseUI
|
||||||
|
|
||||||
|
Call OutputRanges(iDoc, outWB.Sheets(1), GetUIState.GetOptions)
|
||||||
|
|
||||||
|
Call xlApp.ResumeUI
|
||||||
|
|
||||||
|
Call UserInteraction.ShowMessage(IM_EXPORT_COMPLETE)
|
||||||
|
End Sub
|
||||||
|
|
||||||
|
Public Sub RunExportAll()
|
||||||
|
Dim iDoc As Word.Document: Set iDoc = Word.ActiveDocument
|
||||||
|
|
||||||
|
Dim xlApp As New API_XLWrapper
|
||||||
|
Dim outWB As Excel.Workbook: Set outWB = xlApp.NewDocument
|
||||||
|
Call xlApp.PauseUI
|
||||||
|
|
||||||
|
Call OutputAllData(iDoc, outWB.Sheets(1), GetUIState.GetOptions)
|
||||||
|
|
||||||
|
Call xlApp.ResumeUI
|
||||||
|
|
||||||
|
Call UserInteraction.ShowMessage(IM_EXPORT_COMPLETE)
|
||||||
|
End Sub
|
||||||
|
|
||||||
|
Public Sub RunHelp()
|
||||||
|
MsgBox "TODO"
|
||||||
|
End Sub
|
||||||
|
|
||||||
|
' ======
|
||||||
|
Private Function EnsureSelectedText() As String
|
||||||
|
Dim rSelection As Word.Range: Set rSelection = WordAdjustRange(Word.Selection.Range)
|
||||||
|
Dim sText$: sText = VBA.Trim(rSelection.Text)
|
||||||
|
If sText = vbNullString Then _
|
||||||
|
Call UserInteraction.ShowMessage(EM_SELECTION_EMPTY)
|
||||||
|
EnsureSelectedText = sText
|
||||||
|
End Function
|
174
src/addin/MainImpl.bas
Normal file
174
src/addin/MainImpl.bas
Normal file
|
@ -0,0 +1,174 @@
|
||||||
|
Attribute VB_Name = "MainImpl"
|
||||||
|
Option Explicit
|
||||||
|
|
||||||
|
Public Function MarkAllDetected(iDoc As Word.Document, nDetector As TDetector, iColor As TColor, sParam$) As Long
|
||||||
|
Dim nColor&: nColor = ColorToColorIndex(iColor)
|
||||||
|
Dim iDetector As Object: Set iDetector = PTools().Detector(nDetector, sParam)
|
||||||
|
Dim oIterator As New IteratorDetected: Call oIterator.Init(iDoc, iDetector)
|
||||||
|
Dim iRange As Word.Range
|
||||||
|
Dim fragmentColor&
|
||||||
|
Dim nCount&: nCount = 0
|
||||||
|
Do
|
||||||
|
Set iRange = oIterator.MoveNext
|
||||||
|
If iRange Is Nothing Then _
|
||||||
|
Exit Do
|
||||||
|
|
||||||
|
Dim nType&: nType = oIterator.Fragment.type_
|
||||||
|
fragmentColor = IIf(nType = 0, 0, ColorToColorIndex(TColor.[_First] + ((nType - 1) Mod TColor.[_Last])))
|
||||||
|
If nCount = 0 Then
|
||||||
|
Dim oldColor&: oldColor = iRange.HighlightColorIndex
|
||||||
|
If oldColor = nColor Or (oldColor = fragmentColor And fragmentColor <> 0) Then _
|
||||||
|
nColor = wdAuto
|
||||||
|
End If
|
||||||
|
If nColor <> wdAuto And fragmentColor <> 0 Then _
|
||||||
|
nColor = fragmentColor
|
||||||
|
iRange.HighlightColorIndex = nColor
|
||||||
|
nCount = nCount + 1
|
||||||
|
Loop
|
||||||
|
MarkAllDetected = nCount
|
||||||
|
End Function
|
||||||
|
|
||||||
|
Public Function MarkAllParagraphs(iDoc As Word.Document, nDetector As TDetector, iColor As TColor, sParam$) As Long
|
||||||
|
Dim nColor&: nColor = ColorToColorIndex(iColor)
|
||||||
|
Dim iDetector As Object: Set iDetector = PTools().Detector(nDetector, sParam)
|
||||||
|
Dim oIterator As New IteratorDetected: Call oIterator.Init(iDoc, iDetector)
|
||||||
|
Dim iRange As Word.Range
|
||||||
|
Dim nCount&: nCount = 0
|
||||||
|
Dim oldStart&: oldStart = -1
|
||||||
|
Do
|
||||||
|
Set iRange = oIterator.MoveNext
|
||||||
|
If iRange Is Nothing Then _
|
||||||
|
Exit Do
|
||||||
|
If nCount = 0 And iRange.HighlightColorIndex = nColor Then _
|
||||||
|
nColor = wdAuto
|
||||||
|
iRange.Paragraphs.First.Range.HighlightColorIndex = nColor
|
||||||
|
If oldStart <> iRange.Start Then
|
||||||
|
oldStart = iRange.Start
|
||||||
|
nCount = nCount + 1
|
||||||
|
End If
|
||||||
|
Loop
|
||||||
|
MarkAllParagraphs = nCount
|
||||||
|
End Function
|
||||||
|
|
||||||
|
Public Function MorphoParse(sText$) As String
|
||||||
|
MorphoParse = AccessPython.CallFunction(PY_MODULE_TEXT, "parse", Array(sText, ""))
|
||||||
|
End Function
|
||||||
|
|
||||||
|
Public Function ConverToFlat2D(oData As Collection) As Variant
|
||||||
|
Dim iData() As Variant
|
||||||
|
If oData.Count = 0 Then
|
||||||
|
ConverToFlat2D = iData
|
||||||
|
Exit Function
|
||||||
|
End If
|
||||||
|
|
||||||
|
ReDim iData(0 To oData.Count - 1, 0 To oData.Item(1).Count - 1)
|
||||||
|
Dim nRow&: nRow = 0
|
||||||
|
Dim oItem As Object
|
||||||
|
Dim vElement As Variant
|
||||||
|
For Each oItem In oData
|
||||||
|
Dim nCol&: nCol = 0
|
||||||
|
For Each vElement In oItem
|
||||||
|
iData(nRow, nCol) = vElement
|
||||||
|
nCol = nCol + 1
|
||||||
|
Next vElement
|
||||||
|
nRow = nRow + 1
|
||||||
|
Next oItem
|
||||||
|
|
||||||
|
ConverToFlat2D = iData
|
||||||
|
End Function
|
||||||
|
|
||||||
|
Public Function TransformAll(iDoc As Word.Document, iOptions As ExtractionOptions) As Long
|
||||||
|
Dim iParser As Object: Set iParser = PTools().Parser(iOptions.detector_, iOptions.param_)
|
||||||
|
If iParser Is Nothing Then _
|
||||||
|
Exit Function
|
||||||
|
Dim iDetector As Object: Set iDetector = PTools().Detector(iOptions.detector_, iOptions.param_)
|
||||||
|
Dim oIterator As New IteratorDetected: Call oIterator.Init(iDoc, iDetector, iDoc.Range.End - 1)
|
||||||
|
|
||||||
|
Dim nCount&: nCount = 0
|
||||||
|
Do While Not oIterator.MovePrev Is Nothing
|
||||||
|
Dim sText$: sText = oIterator.Range.Text
|
||||||
|
Dim sNewText$: sNewText = iParser.Transform(sText, iOptions.transform_)
|
||||||
|
If sText <> sNewText Then
|
||||||
|
oIterator.Range.Text = sNewText
|
||||||
|
Call oIterator.Init(iDoc, iDetector, oIterator.Range.Start)
|
||||||
|
nCount = nCount + 1
|
||||||
|
End If
|
||||||
|
Loop
|
||||||
|
TransformAll = nCount
|
||||||
|
End Function
|
||||||
|
|
||||||
|
Public Function OutputRanges(iSource As Word.Document, wsOut As Excel.Worksheet, iOptions As ExtractionOptions)
|
||||||
|
Dim iDetector As Object: Set iDetector = PTools().Detector(iOptions.detector_, iOptions.param_)
|
||||||
|
Dim oIterator As New IteratorDetected: Call oIterator.Init(iSource, iDetector)
|
||||||
|
|
||||||
|
With wsOut
|
||||||
|
.Cells(1, S_E_ID) = "ID"
|
||||||
|
.Cells(1, S_E_START) = "Íà÷àëî"
|
||||||
|
.Cells(1, S_E_FINISH) = "Êîíåö"
|
||||||
|
.Cells(1, S_E_TYPE) = "Òèï"
|
||||||
|
End With
|
||||||
|
|
||||||
|
Dim nRow&: nRow = 2
|
||||||
|
Do While Not oIterator.MoveNext Is Nothing
|
||||||
|
With wsOut
|
||||||
|
.Cells(nRow, S_E_ID) = nRow - 1
|
||||||
|
.Cells(nRow, S_E_START) = oIterator.Range.Start
|
||||||
|
.Cells(nRow, S_E_FINISH) = oIterator.Range.End
|
||||||
|
.Cells(nRow, S_E_TYPE) = IIf(oIterator.Fragment.type_ = 0, iOptions.loadCategory_, oIterator.Fragment.type_)
|
||||||
|
End With
|
||||||
|
nRow = nRow + 1
|
||||||
|
Loop
|
||||||
|
End Function
|
||||||
|
|
||||||
|
Public Function OutputAllData(iSource As Word.Document, wsOut As Excel.Worksheet, iOptions As ExtractionOptions)
|
||||||
|
Dim iDetector As Object: Set iDetector = PTools().Detector(iOptions.detector_, iOptions.param_)
|
||||||
|
Dim iParser As Object: Set iParser = PTools().Parser(iOptions.detector_, iOptions.param_)
|
||||||
|
Dim oIterator As New IteratorDetected: Call oIterator.Init(iSource, iDetector)
|
||||||
|
|
||||||
|
With wsOut
|
||||||
|
.Cells(1, S_E_ID) = "ID"
|
||||||
|
.Cells(1, S_E_START) = "Íà÷àëî"
|
||||||
|
.Cells(1, S_E_FINISH) = "Êîíåö"
|
||||||
|
.Cells(1, S_E_TYPE) = "Òèï"
|
||||||
|
.Cells(1, S_E_TEXT) = "Òåêñò"
|
||||||
|
End With
|
||||||
|
|
||||||
|
Dim nRow&: nRow = 2
|
||||||
|
Dim iData As Collection
|
||||||
|
Do While Not oIterator.MoveNext Is Nothing
|
||||||
|
Dim sText$: sText = oIterator.Range.Text
|
||||||
|
With wsOut
|
||||||
|
.Cells(nRow, 1) = nRow - 1
|
||||||
|
.Cells(nRow, 2) = oIterator.Range.Start
|
||||||
|
.Cells(nRow, 3) = oIterator.Range.End
|
||||||
|
.Cells(nRow, 4) = IIf(oIterator.Fragment.type_ = 0, iOptions.loadCategory_, oIterator.Fragment.type_)
|
||||||
|
.Cells(nRow, 5) = sText
|
||||||
|
End With
|
||||||
|
If iParser Is Nothing Then _
|
||||||
|
GoTo NEXT_ROW
|
||||||
|
If Not iParser.Parse(sText) Then _
|
||||||
|
GoTo NEXT_ROW
|
||||||
|
Set iData = iParser.GetData()
|
||||||
|
If iData.Count = 0 Then _
|
||||||
|
GoTo NEXT_ROW
|
||||||
|
|
||||||
|
Dim nCol&: nCol = S_E_DATA
|
||||||
|
Dim vItem As Variant
|
||||||
|
For Each vItem In iData
|
||||||
|
wsOut.Cells(nRow, nCol) = vItem
|
||||||
|
nCol = nCol + 1
|
||||||
|
Next vItem
|
||||||
|
|
||||||
|
If nRow <> 2 Then _
|
||||||
|
GoTo NEXT_ROW
|
||||||
|
Dim iHeader As Scripting.Dictionary: Set iHeader = iParser.GetDataDescription()
|
||||||
|
nCol = S_E_DATA
|
||||||
|
For Each vItem In iHeader.Keys
|
||||||
|
wsOut.Cells(1, nCol) = vItem
|
||||||
|
nCol = nCol + 1
|
||||||
|
Next vItem
|
||||||
|
|
||||||
|
NEXT_ROW:
|
||||||
|
nRow = nRow + 1
|
||||||
|
Loop
|
||||||
|
End Function
|
29
src/addin/ManualSubs.bas
Normal file
29
src/addin/ManualSubs.bas
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
Attribute VB_Name = "ManualSubs"
|
||||||
|
Option Explicit
|
||||||
|
|
||||||
|
'Public Function P_GetNPAFromActive() As Long()
|
||||||
|
' Dim frags As New PC_ParsedData
|
||||||
|
' Dim npaRegex As RegExp: Set npaRegex = GlobalNPARegex
|
||||||
|
'
|
||||||
|
' Dim aPar As Word.Paragraph
|
||||||
|
' Dim parRng As Word.Range
|
||||||
|
' Dim matches As Object
|
||||||
|
' Dim nMatch&
|
||||||
|
' For Each aPar In ActiveDocument.Paragraphs
|
||||||
|
' Set parRng = aPar.Range
|
||||||
|
' Dim sTxt$: sTxt = FixSpecialSymbols(parRng.Text)
|
||||||
|
' Set matches = npaRegex.Execute(sTxt)
|
||||||
|
' For nMatch = 1 To matches.Count Step 1
|
||||||
|
' Dim findRng As Word.Range: Set findRng = parRng.Duplicate
|
||||||
|
' Call findRng.MoveStart(wdCharacter, InStr(1, sTxt, matches.Item(nMatch - 1).SubMatches(0)))
|
||||||
|
' Call findRng.Collapse(wdCollapseStart)
|
||||||
|
' Call findRng.MoveEnd(wdCharacter, Len(matches.Item(nMatch - 1).SubMatches(0)))
|
||||||
|
' Call frags.AddItem(findRng.Start, findRng.End, 0)
|
||||||
|
' Next nMatch
|
||||||
|
' Next aPar
|
||||||
|
'
|
||||||
|
' If frags.data_.Count > 0 Then _
|
||||||
|
' P_GetNPAFromActive = frags.AsFlatData
|
||||||
|
'End Function
|
||||||
|
'
|
||||||
|
'
|
38
src/addin/UIState.cls
Normal file
38
src/addin/UIState.cls
Normal file
|
@ -0,0 +1,38 @@
|
||||||
|
VERSION 1.0 CLASS
|
||||||
|
BEGIN
|
||||||
|
MultiUse = -1 'True
|
||||||
|
END
|
||||||
|
Attribute VB_Name = "UIState"
|
||||||
|
Attribute VB_GlobalNameSpace = False
|
||||||
|
Attribute VB_Creatable = False
|
||||||
|
Attribute VB_PredeclaredId = False
|
||||||
|
Attribute VB_Exposed = False
|
||||||
|
Option Explicit
|
||||||
|
|
||||||
|
Public ribbon_ As API_Ribbon
|
||||||
|
|
||||||
|
Public detector_ As TDetector
|
||||||
|
Public detectionParam_ As String
|
||||||
|
|
||||||
|
Public color_ As TColor
|
||||||
|
|
||||||
|
Public transformParam_ As String
|
||||||
|
|
||||||
|
Public category_ As Long
|
||||||
|
|
||||||
|
Private Sub Class_Initialize()
|
||||||
|
detector_ = T_DETECTOR_REGEX
|
||||||
|
color_ = T_COLOR_YELLOW
|
||||||
|
transformParam_ = vbNullString
|
||||||
|
detectionParam_ = vbNullString
|
||||||
|
category_ = 0
|
||||||
|
Set ribbon_ = New API_Ribbon
|
||||||
|
End Sub
|
||||||
|
|
||||||
|
Public Function GetOptions() As ExtractionOptions
|
||||||
|
Set GetOptions = New ExtractionOptions
|
||||||
|
GetOptions.detector_ = detector_
|
||||||
|
GetOptions.param_ = detector_
|
||||||
|
GetOptions.transform_ = transformParam_
|
||||||
|
GetOptions.loadCategory_ = category_
|
||||||
|
End Function
|
85
src/addin/z_UIMessages.bas
Normal file
85
src/addin/z_UIMessages.bas
Normal file
|
@ -0,0 +1,85 @@
|
||||||
|
Attribute VB_Name = "z_UIMessages"
|
||||||
|
' Messaging module
|
||||||
|
Option Private Module
|
||||||
|
Option Explicit
|
||||||
|
|
||||||
|
Public Enum MsgCode
|
||||||
|
' EM_COMBO_TAKEN = ERR_COMBO_TAKEN
|
||||||
|
|
||||||
|
EM_RIBBON_NOT_REACHABLE = 1
|
||||||
|
EM_SELECTION_EMPTY
|
||||||
|
|
||||||
|
IM_MARKDOWN_COMPLETE
|
||||||
|
IM_PARSE_MORPHO
|
||||||
|
IM_NO_PARSER_DATA
|
||||||
|
IM_TEST_FAILED
|
||||||
|
IM_PARSED_DESCRIPTION
|
||||||
|
IM_EXPORT_COMPLETE
|
||||||
|
IM_TRANSFORM_COMPLETE
|
||||||
|
|
||||||
|
' QM_CONFIG_EDIT_CONFIRM
|
||||||
|
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 ProcessErrorMessages(expectedErrors As Scripting.Dictionary)
|
||||||
|
If Err.Number = 0 Then _
|
||||||
|
Exit Function
|
||||||
|
|
||||||
|
Call Unload(CSE_ProgressBar)
|
||||||
|
If Not expectedErrors.Exists(Err.Number) Then _
|
||||||
|
Call Err.Raise(Err.Number)
|
||||||
|
|
||||||
|
Call UserInteraction.ShowMessage(Err.Number, Err.Source)
|
||||||
|
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_RIBBON_NOT_REACHABLE
|
||||||
|
Call MsgBox("Íå óäàëîñü âîññòàíîâèòü ñâÿçü ñ ëåíòîé!" & vbNewLine & _
|
||||||
|
"Ïîæàëóéñòà, çàêðîéòå âñå îêíà Word äëÿ âîññòàíîâëåíèÿ êîððåêòíîé ðàáîòû è ñîîáùèòå ðàçðàáîò÷èêó", vbExclamation)
|
||||||
|
Case EM_SELECTION_EMPTY: Call MsgBox("Âûäåëåííûé ôðàãìåíò íå ñîäåðæèò òåêñòà", vbExclamation)
|
||||||
|
|
||||||
|
Case IM_MARKDOWN_COMPLETE: Call MsgBox(Fmt("Ðàçìå÷åíî âõîæäåíèé: {1}", unwrapped), vbInformation)
|
||||||
|
Case IM_PARSE_MORPHO: Call MsgBox(Fmt("Òåãè ðàçáîðà: {1}", unwrapped), vbInformation)
|
||||||
|
Case IM_NO_PARSER_DATA: Call MsgBox(Fmt("Äîïîëíèòåëüíûå äàííûå îòñóòñòâóþò: {1}", unwrapped), vbInformation)
|
||||||
|
Case IM_TEST_FAILED: Call MsgBox(Fmt("Âûäåëåííûé òåêñò íå ñîîòâåòñòâóåò òèïó: {1}", unwrapped), vbInformation)
|
||||||
|
Case IM_EXPORT_COMPLETE: Call MsgBox("Ýêñïîðò çàâåðøåí", vbInformation)
|
||||||
|
Case IM_TRANSFORM_COMPLETE: Call MsgBox(Fmt("Îñóùåñòâëåííî ïðåîáðàçîâàíèé: {1}", unwrapped), vbInformation)
|
||||||
|
|
||||||
|
Case IM_PARSED_DESCRIPTION: Call MsgBox(Fmt("Èñõîäíûé òåêñò: {1}" & vbNewLine & _
|
||||||
|
"Òèï ðàçáîðà: {2}" & vbNewLine & _
|
||||||
|
"Äîïîëíèòåëüíûå äàííûå" & 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_CONFIG_EDIT_CONFIRM
|
||||||
|
' answer = MsgBox("Âíèìàíèå! Âû íà÷èíàåòå èçìåíåíèå ëîêàëüíîé êîíôèãóðàöèè ðàçìåòêè. Ýòè èçìåíåíèÿ íå áóäóò îòðàæàòüñÿ äëÿ äðóãèõ ïîëüçîâàòåëåé" & _
|
||||||
|
' vbNewLine & "Äëÿ èçìåíåíèÿ ñåðâåðíîé êîíôèãóðàöèè îáðàòèòåñü ê ðàçðàáîò÷èêó", vbYesNo + vbQuestion)
|
||||||
|
|
||||||
|
Case Else
|
||||||
|
Call MsgBox("Invalid message code", vbCritical)
|
||||||
|
End Select
|
||||||
|
UIAskQuestion = answer = vbYes
|
||||||
|
End Function
|
117
src/addin/z_UIRibbon.bas
Normal file
117
src/addin/z_UIRibbon.bas
Normal file
|
@ -0,0 +1,117 @@
|
||||||
|
Attribute VB_Name = "z_UIRibbon"
|
||||||
|
' Îáðàáîòêà íàæàòèé íà êíîïêè â ðèááîíå
|
||||||
|
Option Explicit
|
||||||
|
|
||||||
|
Global g_UIState As UIState
|
||||||
|
|
||||||
|
Public Function GetUIState() As UIState
|
||||||
|
If g_UIState Is Nothing Then
|
||||||
|
Set g_UIState = New UIState
|
||||||
|
Call g_UIState.ribbon_.LoadFrom(RibbonTempFile)
|
||||||
|
' Call UIUpdateConfigList
|
||||||
|
End If
|
||||||
|
Set GetUIState = g_UIState
|
||||||
|
If g_UIState.ribbon_.Value Is Nothing Then _
|
||||||
|
Call UserInteraction.ShowMessage(EM_RIBBON_NOT_REACHABLE)
|
||||||
|
End Function
|
||||||
|
|
||||||
|
Public Sub Parse_LoadRibbon(aRibbon As IRibbonUI)
|
||||||
|
Set g_UIState = New UIState
|
||||||
|
Call g_UIState.ribbon_.Init(aRibbon, RibbonTempFile)
|
||||||
|
'Call UIUpdateConfigList
|
||||||
|
End Sub
|
||||||
|
|
||||||
|
Public Sub Parse_OnBtn(iControl As IRibbonControl)
|
||||||
|
Call EnsureGlobalState
|
||||||
|
Select Case iControl.ID
|
||||||
|
Case "NextFragment": Call RunNextFragment
|
||||||
|
Case "PrevFragment": Call RunPrevFragment
|
||||||
|
Case "BrowseFile": Call RunBrowseFile
|
||||||
|
Case "MorphoParse": Call RunMorphoParse
|
||||||
|
Case "ContextInfo": Call RunContextInfo
|
||||||
|
|
||||||
|
Case "MarkWord": Call RunMarkWord
|
||||||
|
Case "MarkParagraph": Call RunMarkParagraph
|
||||||
|
|
||||||
|
Case "TransformSingle": Call RunTransformSingle
|
||||||
|
Case "TransformAll": Call RunTransformAll
|
||||||
|
|
||||||
|
Case "ExportAll": Call RunExportAll
|
||||||
|
Case "ExportRanges": Call RunExportRanges
|
||||||
|
|
||||||
|
Case "ViewHelp": Call RunHelp
|
||||||
|
End Select
|
||||||
|
End Sub
|
||||||
|
|
||||||
|
Public Function ParseUI_DetectorCount(iControl As IRibbonControl, ByRef nCount)
|
||||||
|
nCount = TDetector.[_Last]
|
||||||
|
End Function
|
||||||
|
|
||||||
|
Public Function ParseUI_DetectorLabel(iControl As IRibbonControl, nIndex%, ByRef vLabel)
|
||||||
|
vLabel = DetectorToStr(nIndex + 1)
|
||||||
|
End Function
|
||||||
|
|
||||||
|
Public Function ParseUI_DetectorGetSelectedIndex(iControl As IRibbonControl, ByRef nValue)
|
||||||
|
Call EnsureGlobalState
|
||||||
|
nValue = g_UIState.detector_ - 1
|
||||||
|
End Function
|
||||||
|
|
||||||
|
Public Function ParseUI_DetectorChange(iControl As IRibbonControl, sID$, nIndex As Variant)
|
||||||
|
Call EnsureGlobalState
|
||||||
|
g_UIState.detector_ = nIndex + 1
|
||||||
|
' Do any UI updates needed on entity switch
|
||||||
|
End Function
|
||||||
|
|
||||||
|
Public Function ParseUI_ParamText(iControl As IRibbonControl, ByRef vLabel)
|
||||||
|
vLabel = GetUIState.detectionParam_
|
||||||
|
End Function
|
||||||
|
|
||||||
|
Public Function ParseUI_ParamChange(iControl As IRibbonControl, sParam$)
|
||||||
|
Call EnsureGlobalState
|
||||||
|
g_UIState.detectionParam_ = sParam
|
||||||
|
End Function
|
||||||
|
|
||||||
|
Public Function ParseUI_TransformText(iControl As IRibbonControl, ByRef vLabel)
|
||||||
|
vLabel = GetUIState.transformParam_
|
||||||
|
End Function
|
||||||
|
|
||||||
|
Public Function ParseUI_TransformChange(iControl As IRibbonControl, sParam$)
|
||||||
|
Call EnsureGlobalState
|
||||||
|
g_UIState.transformParam_ = sParam
|
||||||
|
End Function
|
||||||
|
|
||||||
|
Public Function ParseUI_CategoryText(iControl As IRibbonControl, ByRef vLabel)
|
||||||
|
vLabel = GetUIState.category_
|
||||||
|
End Function
|
||||||
|
|
||||||
|
Public Function ParseUI_CategoryChange(iControl As IRibbonControl, sParam$)
|
||||||
|
Call EnsureGlobalState
|
||||||
|
g_UIState.category_ = sParam
|
||||||
|
End Function
|
||||||
|
|
||||||
|
Public Function ParseUI_MarkupCount(iControl As IRibbonControl, ByRef nCount)
|
||||||
|
nCount = TColor.[_Last]
|
||||||
|
End Function
|
||||||
|
|
||||||
|
Public Function ParseUI_MarkupLabel(iControl As IRibbonControl, nIndex%, ByRef vLabel)
|
||||||
|
vLabel = ColorToStr(nIndex + 1)
|
||||||
|
End Function
|
||||||
|
|
||||||
|
Public Function ParseUI_MarkupGetSelectedIndex(iControl As IRibbonControl, ByRef nValue)
|
||||||
|
Call EnsureGlobalState
|
||||||
|
nValue = g_UIState.color_ - 1
|
||||||
|
End Function
|
||||||
|
|
||||||
|
Public Function ParseUI_MarkupChange(iControl As IRibbonControl, sID$, nIndex As Variant)
|
||||||
|
Call EnsureGlobalState
|
||||||
|
g_UIState.color_ = nIndex + 1
|
||||||
|
End Function
|
||||||
|
|
||||||
|
' =============
|
||||||
|
Private Function EnsureGlobalState() As Boolean
|
||||||
|
EnsureGlobalState = Not GetUIState Is Nothing
|
||||||
|
End Function
|
||||||
|
|
||||||
|
Private Function RibbonTempFile() As String
|
||||||
|
RibbonTempFile = Environ("TEMP") & "/" & TEMP_FILE_NAME & CStr(GetCurrentProcessId) & ".txt"
|
||||||
|
End Function
|
66
src/database/DataAccess.bas
Normal file
66
src/database/DataAccess.bas
Normal file
|
@ -0,0 +1,66 @@
|
||||||
|
Attribute VB_Name = "DataAccess"
|
||||||
|
Option Explicit
|
||||||
|
Option Private Module
|
||||||
|
|
||||||
|
' TODO: incapsulate into DB class
|
||||||
|
|
||||||
|
Private Const SHEET_SOURCE = "Èñòî÷íèêè"
|
||||||
|
Private Const SHEET_DATA = "Äàííûå"
|
||||||
|
|
||||||
|
Public Function DataSheet() As Excel.Worksheet
|
||||||
|
Set DataSheet = ThisWorkbook.Sheets(SHEET_DATA)
|
||||||
|
End Function
|
||||||
|
|
||||||
|
Public Function SourceSheet() As Excel.Worksheet
|
||||||
|
Set SourceSheet = ThisWorkbook.Sheets(SHEET_SOURCE)
|
||||||
|
End Function
|
||||||
|
|
||||||
|
Public Function AddSource(target As Word.Document) As Long
|
||||||
|
AddSource = SourceSheet.Cells(GetRowFor(target.FullName), SS_ID)
|
||||||
|
End Function
|
||||||
|
|
||||||
|
Public Function SourceFileFor(sourceID&) As String
|
||||||
|
Dim foundRng As Excel.Range
|
||||||
|
Set foundRng = SourceSheet.Columns(SS_ID).Find(sourceID, LookAt:=xlWhole)
|
||||||
|
If foundRng Is Nothing Then _
|
||||||
|
Exit Function
|
||||||
|
|
||||||
|
SourceFileFor = SourceSheet.Cells(foundRng.Row, SS_PATH)
|
||||||
|
End Function
|
||||||
|
|
||||||
|
Public Function RowFor(sourceID&) As Long
|
||||||
|
Dim foundRng As Excel.Range
|
||||||
|
Set foundRng = SourceSheet.Columns(SS_ID).Find(sourceID, LookAt:=xlWhole)
|
||||||
|
If foundRng Is Nothing Then _
|
||||||
|
Exit Function
|
||||||
|
|
||||||
|
RowFor = foundRng.Row
|
||||||
|
End Function
|
||||||
|
|
||||||
|
' ====
|
||||||
|
Private Function GetNextID() As Long
|
||||||
|
Dim docsSht As Excel.Worksheet: Set docsSht = SourceSheet
|
||||||
|
Dim nRow&: nRow = DEFAULT_FIRST_ROW
|
||||||
|
Dim theID&: theID = 1
|
||||||
|
Do While docsSht.Cells(nRow, SS_ID) <> vbNullString
|
||||||
|
If theID >= docsSht.Cells(nRow, SS_ID) Then _
|
||||||
|
theID = docsSht.Cells(nRow, SS_ID) + 1
|
||||||
|
nRow = nRow + 1
|
||||||
|
Loop
|
||||||
|
GetNextID = theID
|
||||||
|
End Function
|
||||||
|
|
||||||
|
Private Function GetRowFor(target$) As Long
|
||||||
|
Dim theSheet As Excel.Worksheet: Set theSheet = SourceSheet
|
||||||
|
Dim foundRng As Excel.Range
|
||||||
|
Set foundRng = theSheet.Columns(SS_PATH).Find(target, LookAt:=xlWhole)
|
||||||
|
If foundRng Is Nothing Then
|
||||||
|
Dim nRow&: nRow = theSheet.Columns(SS_ID).Find(vbNullString, LookAt:=xlWhole).Row
|
||||||
|
theSheet.Cells(nRow, SS_ID) = GetNextID
|
||||||
|
theSheet.Cells(nRow, SS_PATH) = target
|
||||||
|
Call theSheet.Cells(nRow, SS_PATH).Hyperlinks.Add(theSheet.Cells(nRow, SS_PATH), target)
|
||||||
|
GetRowFor = nRow
|
||||||
|
Else
|
||||||
|
GetRowFor = foundRng.Row
|
||||||
|
End If
|
||||||
|
End Function
|
38
src/database/Declarations.bas
Normal file
38
src/database/Declarations.bas
Normal file
|
@ -0,0 +1,38 @@
|
||||||
|
Attribute VB_Name = "Declarations"
|
||||||
|
Option Explicit
|
||||||
|
Option Private Module
|
||||||
|
|
||||||
|
' Ñòðóêòóðà ñòðàíèöû äàííûõ
|
||||||
|
Public Enum DataStruct
|
||||||
|
[_First] = 1
|
||||||
|
|
||||||
|
DS_ID = 1
|
||||||
|
DS_START = 2
|
||||||
|
DS_END = 3
|
||||||
|
DS_TYPE = 4
|
||||||
|
DS_TEXT = 5
|
||||||
|
|
||||||
|
[_Last] = 5
|
||||||
|
End Enum
|
||||||
|
|
||||||
|
' Ñòðóêòóðà ñòðàíèöû èñòî÷íèêîâ
|
||||||
|
Public Enum SourceStruct
|
||||||
|
[_First] = 1
|
||||||
|
|
||||||
|
SS_ID = 1
|
||||||
|
SS_PATH = 2
|
||||||
|
SS_NAME = 3
|
||||||
|
SS_PARS = 4
|
||||||
|
SS_TIME = 5
|
||||||
|
SS_COUNT = 6
|
||||||
|
|
||||||
|
[_Last] = 6
|
||||||
|
End Enum
|
||||||
|
|
||||||
|
Public Const FUNC_PARSE = "ExportAllData"
|
||||||
|
|
||||||
|
Public Const ADDIN_FILENAME = "Parsers.dotm"
|
||||||
|
Public Const DOC_MASK = "*.doc*"
|
||||||
|
|
||||||
|
Public Const DEFAULT_FIRST_ROW = 2
|
||||||
|
Public Const INVALID_ROW = -1
|
50
src/database/DevHelper.bas
Normal file
50
src/database/DevHelper.bas
Normal file
|
@ -0,0 +1,50 @@
|
||||||
|
Attribute VB_Name = "DevHelper"
|
||||||
|
Option Explicit
|
||||||
|
|
||||||
|
Private Const TEST_BASIC_PARSE = "TestBasic.docx"
|
||||||
|
Private Const ADDIN_FILE = "Parsers.dotm"
|
||||||
|
|
||||||
|
Private g_RemoveAddin As Boolean
|
||||||
|
|
||||||
|
Public Function Dev_PrepareSkeleton()
|
||||||
|
Call ClearAll
|
||||||
|
End Function
|
||||||
|
|
||||||
|
Public Sub Dev_ManualRunTest()
|
||||||
|
Dim sSuite$: sSuite = "s_WordInteractions"
|
||||||
|
Dim sTest$: sTest = "t_ImportDates"
|
||||||
|
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_WordInteractions": Set Dev_GetTestSuite = New s_WordInteractions
|
||||||
|
End Select
|
||||||
|
End Function
|
||||||
|
|
||||||
|
Public Function GetTestFile() As String
|
||||||
|
Dim fso As New Scripting.FileSystemObject
|
||||||
|
GetTestFile = ThisWorkbook.Path & "\test\" & TEST_BASIC_PARSE
|
||||||
|
End Function
|
||||||
|
|
||||||
|
Public Function SetupTestAddin()
|
||||||
|
Dim fso As New Scripting.FileSystemObject
|
||||||
|
Dim sLocal$: sLocal = ThisWorkbook.Path & "\Íàäñòðîéêà\" & ADDIN_FILE
|
||||||
|
Dim sAppAddin$: sAppAddin = GetGlobalAddin
|
||||||
|
g_RemoveAddin = Not fso.FileExists(sAppAddin)
|
||||||
|
Call CopyFileOrFolder(sLocal, sAppAddin, fso)
|
||||||
|
End Function
|
||||||
|
|
||||||
|
Public Function TeardownTestAddin()
|
||||||
|
Dim fso As New Scripting.FileSystemObject
|
||||||
|
On Error Resume Next
|
||||||
|
If g_RemoveAddin Then _
|
||||||
|
Call fso.DeleteFile(GetGlobalAddin)
|
||||||
|
End Function
|
||||||
|
|
||||||
|
' ======
|
||||||
|
Private Function GetGlobalAddin() As String
|
||||||
|
GetGlobalAddin = VBA.Environ$("APPDATA") & "\Microsoft\Word\STARTUP\" & ADDIN_FILE
|
||||||
|
End Function
|
92
src/database/ImportDlg.frm
Normal file
92
src/database/ImportDlg.frm
Normal file
|
@ -0,0 +1,92 @@
|
||||||
|
VERSION 5.00
|
||||||
|
Begin {C62A69F0-16DC-11CE-9E98-00AA00574A4F} ImportDlg
|
||||||
|
Caption = "Âûáîð èñòî÷íèêà äàííûõ"
|
||||||
|
ClientHeight = 2805
|
||||||
|
ClientLeft = 120
|
||||||
|
ClientTop = 465
|
||||||
|
ClientWidth = 6780
|
||||||
|
OleObjectBlob = "ImportDlg.frx":0000
|
||||||
|
StartUpPosition = 1 'CenterOwner
|
||||||
|
End
|
||||||
|
Attribute VB_Name = "ImportDlg"
|
||||||
|
Attribute VB_GlobalNameSpace = False
|
||||||
|
Attribute VB_Creatable = False
|
||||||
|
Attribute VB_PredeclaredId = True
|
||||||
|
Attribute VB_Exposed = False
|
||||||
|
Option Explicit
|
||||||
|
|
||||||
|
Public isCancelled_ As Boolean
|
||||||
|
Public isFolder_ As Boolean
|
||||||
|
|
||||||
|
Private Sub UserForm_Initialize()
|
||||||
|
Dim nType As TDetector
|
||||||
|
For nType = TDetector.[_First] To TDetector.[_Last]
|
||||||
|
Call CBType.AddItem(DetectorToStr(nType))
|
||||||
|
Next nType
|
||||||
|
|
||||||
|
isFolder_ = False
|
||||||
|
isCancelled_ = True
|
||||||
|
TBCategory.Value = 0
|
||||||
|
End Sub
|
||||||
|
|
||||||
|
Private Sub UserForm_Terminate()
|
||||||
|
isCancelled_ = True
|
||||||
|
Call Me.Hide
|
||||||
|
End Sub
|
||||||
|
|
||||||
|
Public Property Get FileName() As String
|
||||||
|
FileName = TBDocument.Text
|
||||||
|
End Property
|
||||||
|
|
||||||
|
Public Property Get Options() As ExtractionOptions
|
||||||
|
Set Options = New ExtractionOptions
|
||||||
|
Options.detector_ = CBType.ListIndex + 1
|
||||||
|
Options.param_ = TBParam.Text
|
||||||
|
Options.transform_ = TBTransform.Text
|
||||||
|
Options.loadCategory_ = TBCategory.Value
|
||||||
|
End Property
|
||||||
|
|
||||||
|
' ============
|
||||||
|
Private Sub DocumentBtn_Click()
|
||||||
|
Dim sFile$: sFile = UserInteraction.PromptFileFilter( _
|
||||||
|
ThisWorkbook.Path & "\", _
|
||||||
|
sDescription:="Äîêóìåíò Word", _
|
||||||
|
sFilter:="*.docx;*.doc;*.docm")
|
||||||
|
If sFile = vbNullString Then _
|
||||||
|
Exit Sub
|
||||||
|
isFolder_ = False
|
||||||
|
TBDocument.Text = sFile
|
||||||
|
End Sub
|
||||||
|
|
||||||
|
Private Sub ParameterBtn_Click()
|
||||||
|
Dim sFile$: sFile = UserInteraction.PromptFileFilter( _
|
||||||
|
ThisWorkbook.Path & "\", _
|
||||||
|
"All files", _
|
||||||
|
"*.*")
|
||||||
|
If sFile = vbNullString Then _
|
||||||
|
Exit Sub
|
||||||
|
TBParam.Text = sFile
|
||||||
|
End Sub
|
||||||
|
|
||||||
|
Private Sub FolderBtn_Click()
|
||||||
|
Dim sFile$: sFile = UserInteraction.PromptFolder(ThisWorkbook.Path & "\")
|
||||||
|
If sFile = vbNullString Then _
|
||||||
|
Exit Sub
|
||||||
|
isFolder_ = True
|
||||||
|
TBDocument.Text = sFile
|
||||||
|
End Sub
|
||||||
|
|
||||||
|
Private Sub CancelBtn_Click()
|
||||||
|
isCancelled_ = True
|
||||||
|
Call Me.Hide
|
||||||
|
End Sub
|
||||||
|
|
||||||
|
Private Sub OkBtn_Click()
|
||||||
|
If FileName = vbNullString Or CBType.ListIndex = -1 Then
|
||||||
|
Call UserInteraction.ShowMessage(EM_VALIDATION_FAIL)
|
||||||
|
Exit Sub
|
||||||
|
End If
|
||||||
|
|
||||||
|
isCancelled_ = False
|
||||||
|
Call Me.Hide
|
||||||
|
End Sub
|
BIN
src/database/ImportDlg.frx
Normal file
BIN
src/database/ImportDlg.frx
Normal file
Binary file not shown.
62
src/database/Main.bas
Normal file
62
src/database/Main.bas
Normal file
|
@ -0,0 +1,62 @@
|
||||||
|
Attribute VB_Name = "Main"
|
||||||
|
Option Explicit
|
||||||
|
Option Private Module
|
||||||
|
|
||||||
|
Public Const PRODUCT_VERSION = "1.3.0"
|
||||||
|
Public Const PRODUCT_NAME = "Concept-Mining"
|
||||||
|
|
||||||
|
Public g_VersionTimer As Long
|
||||||
|
|
||||||
|
Public Sub Auto_Open()
|
||||||
|
Dim sCmd$: sCmd = OfficeCommandLine
|
||||||
|
If VBA.InStr(1, sCmd, "/automation", vbTextCompare) <> 0 Then _
|
||||||
|
Exit Sub
|
||||||
|
|
||||||
|
g_VersionTimer = SetTimer(0, 0, CP_VERSION_MSG_DELAY, AddressOf OnVersionCheck)
|
||||||
|
End Sub
|
||||||
|
|
||||||
|
Public Function OnVersionCheck(ByVal nHwnd As Long, ByVal uMsg As Long, ByVal nEvent As Long, ByVal nTime As Long)
|
||||||
|
Call KillTimer(0, g_VersionTimer)
|
||||||
|
Call VersionValidate(PRODUCT_NAME, PRODUCT_VERSION)
|
||||||
|
End Function
|
||||||
|
|
||||||
|
Public Sub RunImportWord()
|
||||||
|
If Not EnsureAddinInstalled Then _
|
||||||
|
Exit Sub
|
||||||
|
|
||||||
|
Call ImportDlg.Show
|
||||||
|
If ImportDlg.isCancelled_ Then
|
||||||
|
Unload ImportDlg
|
||||||
|
Exit Sub
|
||||||
|
End If
|
||||||
|
|
||||||
|
Dim iParams As ExtractionOptions: Set iParams = ImportDlg.Options
|
||||||
|
Dim sPath$: sPath = ImportDlg.FileName
|
||||||
|
Dim bIsFolder As Boolean: bIsFolder = ImportDlg.isFolder_
|
||||||
|
Call Unload(ImportDlg)
|
||||||
|
|
||||||
|
Dim nCount&: nCount = ProcessImports(sPath, bIsFolder, iParams)
|
||||||
|
|
||||||
|
Call UserInteraction.ShowMessage(IM_IMPORT_COMPLETE, nCount)
|
||||||
|
End Sub
|
||||||
|
|
||||||
|
Public Sub RunFollowLink()
|
||||||
|
Dim theSheet As Excel.Worksheet: Set theSheet = DataSheet
|
||||||
|
If ThisWorkbook.ActiveSheet.Name <> theSheet.Name Then
|
||||||
|
Call UserInteraction.ShowMessage(EM_EXPECTED_DATASHEET)
|
||||||
|
Exit Sub
|
||||||
|
End If
|
||||||
|
|
||||||
|
Dim nRow&: nRow = ThisWorkbook.Application.Selection.Cells(1, 1).Row
|
||||||
|
Dim srcID$: srcID = theSheet.Cells(nRow, DS_ID)
|
||||||
|
If srcID = vbNullString Or Not IsNumeric(srcID) Then
|
||||||
|
Call UserInteraction.ShowMessage(EM_INVALID_SOURCE_ID)
|
||||||
|
Exit Sub
|
||||||
|
End If
|
||||||
|
Call FollowLinkAt(CLng(srcID), theSheet.Cells(nRow, DS_START), theSheet.Cells(nRow, DS_END))
|
||||||
|
End Sub
|
||||||
|
|
||||||
|
Public Sub RunClearAll()
|
||||||
|
Call ClearAll
|
||||||
|
Call UserInteraction.ShowMessage(IM_CLEAR_ALL)
|
||||||
|
End Sub
|
152
src/database/MainImpl.bas
Normal file
152
src/database/MainImpl.bas
Normal file
|
@ -0,0 +1,152 @@
|
||||||
|
Attribute VB_Name = "MainImpl"
|
||||||
|
Option Explicit
|
||||||
|
Option Private Module
|
||||||
|
|
||||||
|
Public Function EnsureAddinInstalled() As Boolean
|
||||||
|
Dim sPath$: sPath = Environ("APPDATA") & "\Microsoft\Word\STARTUP\" & ADDIN_FILENAME
|
||||||
|
Dim fso As New Scripting.FileSystemObject
|
||||||
|
EnsureAddinInstalled = fso.FileExists(sPath)
|
||||||
|
If Not EnsureAddinInstalled Then _
|
||||||
|
Call UserInteraction.ShowMessage(EM_NO_ADDIN)
|
||||||
|
End Function
|
||||||
|
|
||||||
|
Public Function ClearAll()
|
||||||
|
SourceSheet.UsedRange.Offset(1).ClearContents
|
||||||
|
DataSheet.UsedRange.Offset(1).ClearContents
|
||||||
|
End Function
|
||||||
|
|
||||||
|
Private Function ScanDocsFolder(target$) As Collection
|
||||||
|
Set ScanDocsFolder = New Collection
|
||||||
|
|
||||||
|
Dim sFolder$: sFolder = target & "\"
|
||||||
|
Dim sFile$: sFile = Dir(sFolder & DOC_MASK)
|
||||||
|
Do While Len(sFile) > 0 And sFile <> sFolder
|
||||||
|
Call ScanDocsFolder.Add(sFolder & sFile)
|
||||||
|
sFile = Dir
|
||||||
|
Loop
|
||||||
|
End Function
|
||||||
|
|
||||||
|
Public Function ProcessImports(sPath$, bIsFolder As Boolean, params As ExtractionOptions, Optional bSilent As Boolean = False) As Long
|
||||||
|
Dim wordApp As New API_WordWrapper: Call wordApp.CreateApplication(bIsVisible:=False)
|
||||||
|
If bSilent Then _
|
||||||
|
Call wordApp.DisableMessages
|
||||||
|
|
||||||
|
Dim xlUI As New API_XLWrapper: Call xlUI.SetApplication(ThisWorkbook.Application)
|
||||||
|
Call xlUI.PauseUI
|
||||||
|
ThisWorkbook.Application.DisplayAlerts = False
|
||||||
|
|
||||||
|
Dim nCount&: nCount = 0
|
||||||
|
Dim theDoc As Word.Document
|
||||||
|
If Not bIsFolder Then
|
||||||
|
Set theDoc = wordApp.OpenDocument(sPath, bReadOnly:=True)
|
||||||
|
If theDoc Is Nothing Then _
|
||||||
|
GoTo SAFE_EXIT
|
||||||
|
nCount = nCount + ScanDataFrom(wordApp, params)
|
||||||
|
Call wordApp.ReleaseDocument
|
||||||
|
Else
|
||||||
|
Dim docs As Collection: Set docs = ScanDocsFolder(sPath)
|
||||||
|
Call CSE_ProgressBar.Init("Îáðàáîòêà äîêóìåíòîâ", maxVal:=docs.Count - 1, canInterrupt:=True)
|
||||||
|
If Not bSilent Then _
|
||||||
|
Call CSE_ProgressBar.Show
|
||||||
|
|
||||||
|
Dim sFile As Variant
|
||||||
|
For Each sFile In docs
|
||||||
|
Set theDoc = wordApp.OpenDocument(CStr(sFile), bReadOnly:=True)
|
||||||
|
If theDoc Is Nothing Then _
|
||||||
|
GoTo SAFE_EXIT
|
||||||
|
|
||||||
|
theDoc.Range.NoProofing = True
|
||||||
|
|
||||||
|
CSE_ProgressBar.Description = theDoc.Name
|
||||||
|
nCount = nCount + ScanDataFrom(wordApp, params)
|
||||||
|
Call wordApp.ReleaseDocument(bCloseApplication:=False)
|
||||||
|
|
||||||
|
Call CSE_ProgressBar.IncrementA
|
||||||
|
If CSE_ProgressBar.Interrupted Then _
|
||||||
|
Exit For
|
||||||
|
Next sFile
|
||||||
|
|
||||||
|
Call Unload(CSE_ProgressBar)
|
||||||
|
End If
|
||||||
|
|
||||||
|
SAFE_EXIT:
|
||||||
|
ThisWorkbook.Application.DisplayAlerts = True
|
||||||
|
Call xlUI.ResumeUI
|
||||||
|
Call wordApp.ReleaseApplication
|
||||||
|
ProcessImports = nCount
|
||||||
|
End Function
|
||||||
|
|
||||||
|
Public Function FollowLinkAt(target&, nStart&, nEnd&)
|
||||||
|
Dim sPath$: sPath = SourceFileFor(target)
|
||||||
|
If sPath = vbNullString Then
|
||||||
|
Call UserInteraction.ShowMessage(EM_INVALID_SOURCE_ID)
|
||||||
|
Exit Function
|
||||||
|
End If
|
||||||
|
|
||||||
|
Dim fso As New Scripting.FileSystemObject
|
||||||
|
If Not fso.FileExists(sPath) Then
|
||||||
|
Call UserInteraction.ShowMessage(EM_INVALID_PATH, sPath)
|
||||||
|
Exit Function
|
||||||
|
End If
|
||||||
|
|
||||||
|
Dim wordApp As New API_WordWrapper
|
||||||
|
Dim theDoc As Word.Document: Set theDoc = wordApp.OpenDocument(sPath)
|
||||||
|
If theDoc Is Nothing Then _
|
||||||
|
Exit Function
|
||||||
|
|
||||||
|
If theDoc.Range.End < nEnd Then
|
||||||
|
Call UserInteraction.ShowMessage(EM_INVALID_LINK, sPath)
|
||||||
|
Exit Function
|
||||||
|
End If
|
||||||
|
|
||||||
|
Dim targetRng As Word.Range: Set targetRng = theDoc.Range(nStart, nEnd)
|
||||||
|
Call targetRng.Select
|
||||||
|
Call theDoc.ActiveWindow.ScrollIntoView(targetRng)
|
||||||
|
|
||||||
|
Call wordApp.Application.Activate
|
||||||
|
End Function
|
||||||
|
|
||||||
|
' ======
|
||||||
|
Private Function ScanDataFrom(target As API_WordWrapper, params As ExtractionOptions) As Long
|
||||||
|
Dim dataSht As Excel.Worksheet: Set dataSht = DataSheet
|
||||||
|
Dim srcSht As Excel.Worksheet: Set srcSht = SourceSheet
|
||||||
|
Dim theTimer As New API_Timer
|
||||||
|
|
||||||
|
Call theTimer.Start
|
||||||
|
Call target.Document.Activate
|
||||||
|
|
||||||
|
Dim srcID&: srcID = AddSource(target.Document)
|
||||||
|
Dim srcRow: srcRow = RowFor(srcID)
|
||||||
|
Dim nCount&: nCount = 0
|
||||||
|
Dim newData As Variant
|
||||||
|
|
||||||
|
Call target.Document.Activate
|
||||||
|
On Error GoTo EXIT_FUNCTION
|
||||||
|
newData = target.Run(FUNC_PARSE, params.AsFlatData)
|
||||||
|
On Error GoTo 0
|
||||||
|
If ArraySize(newData) <= 0 Then _
|
||||||
|
Exit Function
|
||||||
|
|
||||||
|
Dim nRow&: nRow = dataSht.Columns(DS_ID).Find(vbNullString, LookAt:=xlWhole).Row
|
||||||
|
Dim nDataRow&
|
||||||
|
Dim nDataCol&
|
||||||
|
For nDataRow = LBound(newData, 1) To UBound(newData, 1) Step 1
|
||||||
|
dataSht.Cells(nRow, DS_ID) = srcID
|
||||||
|
Dim nCol&: nCol = DS_ID + 1
|
||||||
|
For nDataCol = LBound(newData, 2) To UBound(newData, 2) Step 1
|
||||||
|
dataSht.Cells(nRow, nCol) = newData(nDataRow, nDataCol)
|
||||||
|
nCol = nCol + 1
|
||||||
|
Next nDataCol
|
||||||
|
|
||||||
|
nRow = nRow + 1
|
||||||
|
nCount = nCount + 1
|
||||||
|
Next nDataRow
|
||||||
|
|
||||||
|
srcSht.Cells(srcRow, SS_TIME) = theTimer.TimeElapsed
|
||||||
|
srcSht.Cells(srcRow, SS_COUNT) = nCount
|
||||||
|
srcSht.Cells(srcRow, SS_NAME) = target.Document.Name
|
||||||
|
srcSht.Cells(srcRow, SS_PARS) = target.Document.Paragraphs.Count
|
||||||
|
|
||||||
|
EXIT_FUNCTION:
|
||||||
|
ScanDataFrom = nCount
|
||||||
|
End Function
|
6
src/database/ManualSubs.bas
Normal file
6
src/database/ManualSubs.bas
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
Attribute VB_Name = "ManualSubs"
|
||||||
|
Option Explicit
|
||||||
|
|
||||||
|
Public Sub RunClear()
|
||||||
|
Call ClearAll
|
||||||
|
End Sub
|
69
src/database/z_UIMessages.bas
Normal file
69
src/database/z_UIMessages.bas
Normal file
|
@ -0,0 +1,69 @@
|
||||||
|
Attribute VB_Name = "z_UIMessages"
|
||||||
|
' Messaging module
|
||||||
|
Option Private Module
|
||||||
|
Option Explicit
|
||||||
|
|
||||||
|
Public Enum MsgCode
|
||||||
|
MSG_OK = 0
|
||||||
|
|
||||||
|
EM_EXPECTED_DATASHEET
|
||||||
|
EM_NO_ADDIN
|
||||||
|
EM_INVALID_SOURCE_ID
|
||||||
|
EM_INVALID_PATH
|
||||||
|
EM_INVALID_LINK
|
||||||
|
EM_VALIDATION_FAIL
|
||||||
|
|
||||||
|
IM_IMPORT_COMPLETE
|
||||||
|
IM_CLEAR_ALL
|
||||||
|
|
||||||
|
'QM_ADD_TITLELINK
|
||||||
|
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_EXPECTED_DATASHEET: Call MsgBox("Äàííàÿ ôóíêöèÿ äîñòóïíà òîëüêî äëÿ ëèñòà ""Äàííûå""", vbExclamation)
|
||||||
|
Case EM_NO_ADDIN: Call MsgBox("Âíèìàíèå! Äëÿ êîððåêòíîé ðàáîòû ïàðñåðîâ íåîáõîäèìî óñòàíîâèòü íàäñòðîéêó äëÿ Word", vbCritical)
|
||||||
|
Case EM_INVALID_SOURCE_ID: Call MsgBox("Âûäåëèòå ñòðîêó ñ êîððåêòíûì èäåíòèôèêàòîðîì èñòî÷íèêà", vbExclamation)
|
||||||
|
Case EM_INVALID_PATH: Call MsgBox(Fmt("Ôàéë íå zñóùåñòâóåò: {1}", unwrapped), vbExclamation)
|
||||||
|
Case EM_INVALID_LINK: Call MsgBox(Fmt("Äèàïàçîí ññûëêè èìååò êîîðäèíàòû, ïðåâûøàþùèå ðàçìåð îòêðûòîãî ôàéëà {1}", unwrapped), vbExclamation)
|
||||||
|
Case EM_VALIDATION_FAIL: Call MsgBox("Çàïîëíèòå âñå ïîëÿ", vbExclamation)
|
||||||
|
|
||||||
|
Case IM_IMPORT_COMPLETE: Call MsgBox(Fmt("Èìïîðò äàííûõ ïðîèçâåäåí óñïåøíî" & vbNewLine & "Äîáàâëåíî ñòðîê: {1}", unwrapped), vbInformation)
|
||||||
|
Case IM_CLEAR_ALL: Call MsgBox("Âñå äàííûå óäàëåíû", 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 As Long: answer = vbNo
|
||||||
|
Select Case theCode
|
||||||
|
' Case QM_ADD_TITLELINK
|
||||||
|
' answer = MsgBox("Âíèìàíèå! Âû äîáàâëÿåòå äîêóìåíò íå èç ÃÀÐÀÍÒà" & vbNewLine & _
|
||||||
|
' "Äëÿ íåãî ñãåíåðèðîâàí ID: " & p1 & vbNewLine & _
|
||||||
|
' "Â ïåðâûé àáçàö áóäåò äîáàâëåíà ñîîòâåòñòâóþùàÿ ññûëêà. Ïðîäîëæèòü?", vbYesNo + vbQuestion)
|
||||||
|
|
||||||
|
Case Else
|
||||||
|
Call MsgBox("Íåâåðíûé êîä ñîîáùåíèÿ", vbCritical)
|
||||||
|
End Select
|
||||||
|
UIAskQuestion = answer = vbYes
|
||||||
|
End Function
|
11
src/database/z_UIRibbon.bas
Normal file
11
src/database/z_UIRibbon.bas
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
Attribute VB_Name = "z_UIRibbon"
|
||||||
|
' Îáðàáîòêà íàæàòèé íà êíîïêè â ðèááîíå
|
||||||
|
Option Explicit
|
||||||
|
|
||||||
|
Sub OnRibbonBtn(control As IRibbonControl)
|
||||||
|
Select Case control.ID
|
||||||
|
Case "ImportWord": Call RunImportWord
|
||||||
|
Case "FollowLink": Call RunFollowLink
|
||||||
|
Case "ClearAll": Call RunClearAll
|
||||||
|
End Select
|
||||||
|
End Sub
|
56
src/test/s_WordInteractions.cls
Normal file
56
src/test/s_WordInteractions.cls
Normal file
|
@ -0,0 +1,56 @@
|
||||||
|
VERSION 1.0 CLASS
|
||||||
|
BEGIN
|
||||||
|
MultiUse = -1 'True
|
||||||
|
END
|
||||||
|
Attribute VB_Name = "s_WordInteractions"
|
||||||
|
Attribute VB_GlobalNameSpace = False
|
||||||
|
Attribute VB_Creatable = False
|
||||||
|
Attribute VB_PredeclaredId = False
|
||||||
|
Attribute VB_Exposed = False
|
||||||
|
Option Explicit
|
||||||
|
|
||||||
|
Public Function Setup()
|
||||||
|
Call SetupTestAddin
|
||||||
|
End Function
|
||||||
|
|
||||||
|
Public Function Teardown()
|
||||||
|
Call TeardownTestAddin
|
||||||
|
Call ClearAll
|
||||||
|
End Function
|
||||||
|
|
||||||
|
Public Function t_ImportInvalid()
|
||||||
|
On Error GoTo PROPAGATE_ERROR
|
||||||
|
|
||||||
|
Dim iParams As New ExtractionOptions
|
||||||
|
iParams.detector_ = T_DETECTOR_DATE
|
||||||
|
|
||||||
|
Call Dev_NewCase("No file")
|
||||||
|
Call Dev_ExpectEQ(ProcessImports("invalid.txt", False, iParams, bSilent:=True), 0)
|
||||||
|
Call Dev_ExpectEQ(SourceSheet.Cells(2, 1), "")
|
||||||
|
|
||||||
|
Call Dev_NewCase("Invalid detector")
|
||||||
|
iParams.detector_ = T_DETECTOR_UNKNOWN
|
||||||
|
Call Dev_ExpectEQ(ProcessImports(GetTestFile, False, iParams, bSilent:=True), 0)
|
||||||
|
|
||||||
|
Call Dev_NewCase("Invalid parameter")
|
||||||
|
iParams.detector_ = T_DETECTOR_LIST
|
||||||
|
iParams.param_ = "invalid.txt"
|
||||||
|
Call Dev_ExpectEQ(ProcessImports(GetTestFile, False, iParams, bSilent:=True), 0)
|
||||||
|
|
||||||
|
Exit Function
|
||||||
|
PROPAGATE_ERROR:
|
||||||
|
Call Dev_LogError(Err.Number, Err.Description)
|
||||||
|
End Function
|
||||||
|
|
||||||
|
Public Function t_ImportDates()
|
||||||
|
On Error GoTo PROPAGATE_ERROR
|
||||||
|
|
||||||
|
Dim iParams As New ExtractionOptions
|
||||||
|
iParams.detector_ = T_DETECTOR_DATE
|
||||||
|
Call Dev_ExpectEQ(ProcessImports(GetTestFile, False, iParams, bSilent:=True), 4)
|
||||||
|
Call Dev_ExpectNE(SourceSheet.Cells(2, 1), "")
|
||||||
|
|
||||||
|
Exit Function
|
||||||
|
PROPAGATE_ERROR:
|
||||||
|
Call Dev_LogError(Err.Number, Err.Description)
|
||||||
|
End Function
|
BIN
test/TestBasic.docx
Normal file
BIN
test/TestBasic.docx
Normal file
Binary file not shown.
2
ui/addin/.rels
Normal file
2
ui/addin/.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>
|
108
ui/addin/customUI.xml
Normal file
108
ui/addin/customUI.xml
Normal file
|
@ -0,0 +1,108 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui"
|
||||||
|
onLoad="Parse_LoadRibbon" >
|
||||||
|
<ribbon>
|
||||||
|
<tabs>
|
||||||
|
<tab id="MiningTab" label="МАЙНИНГ">
|
||||||
|
<group id="DetectionGroup" label="Извлечение">
|
||||||
|
<dropDown id="DetectorPicker" sizeString="WWWWWWWW"
|
||||||
|
label = "Способ"
|
||||||
|
getItemCount="ParseUI_DetectorCount"
|
||||||
|
getItemLabel="ParseUI_DetectorLabel"
|
||||||
|
getSelectedItemIndex="ParseUI_DetectorGetSelectedIndex"
|
||||||
|
onAction ="ParseUI_DetectorChange"/>
|
||||||
|
<editBox id="ParamInput" sizeString="WWWWWWWWW"
|
||||||
|
label = "Параметр"
|
||||||
|
getText="ParseUI_ParamText"
|
||||||
|
onChange="ParseUI_ParamChange"/>
|
||||||
|
|
||||||
|
<buttonGroup id="NavigationBtns">
|
||||||
|
<button id="NextFragment"
|
||||||
|
supertip="Следующее вхождение"
|
||||||
|
imageMso="_3DPerspectiveDecrease"
|
||||||
|
onAction="Parse_OnBtn"/>
|
||||||
|
<button id="PrevFragment"
|
||||||
|
supertip="Предыдущее вхождение"
|
||||||
|
imageMso="_3DPerspectiveIncrease"
|
||||||
|
onAction="Parse_OnBtn"/>
|
||||||
|
<button id="BrowseFile"
|
||||||
|
supertip="Выбрать файл в качестве параметра"
|
||||||
|
imageMso="AlwaysMoveConversation"
|
||||||
|
onAction="Parse_OnBtn"/>
|
||||||
|
<button id="MorphoParse"
|
||||||
|
supertip="Разбор выделенного слова / фразы"
|
||||||
|
imageMso="ActiveXLabel"
|
||||||
|
onAction="Parse_OnBtn"/>
|
||||||
|
<button id="ContextInfo"
|
||||||
|
supertip="Извлеченные данные из выделенного фрагмента"
|
||||||
|
imageMso="ARMPreviewButton"
|
||||||
|
onAction="Parse_OnBtn"/>
|
||||||
|
</buttonGroup>
|
||||||
|
</group>
|
||||||
|
|
||||||
|
<group id="MarkdownGroup" label="Отображение">
|
||||||
|
<dropDown id="ColorPicker" sizeString="WWWWW"
|
||||||
|
label = "Выделение"
|
||||||
|
getItemCount="ParseUI_MarkupCount"
|
||||||
|
getItemLabel="ParseUI_MarkupLabel"
|
||||||
|
getSelectedItemIndex="ParseUI_MarkupGetSelectedIndex"
|
||||||
|
onAction ="ParseUI_MarkupChange"/>
|
||||||
|
|
||||||
|
<button id="MarkWord"
|
||||||
|
label="Вхождения"
|
||||||
|
supertip="Выделить вхождения сущностей"
|
||||||
|
imageMso="AsianLayoutPhoneticGuide"
|
||||||
|
onAction="Parse_OnBtn"/>
|
||||||
|
<button id="MarkParagraph"
|
||||||
|
label="Абзацы"
|
||||||
|
supertip="Выделить абзацы, содержащие выбранные сущности"
|
||||||
|
imageMso="AlignJustifyHigh"
|
||||||
|
onAction="Parse_OnBtn"/>
|
||||||
|
</group>
|
||||||
|
|
||||||
|
<group id="TransformGroup" label="Преобразование">
|
||||||
|
<editBox id="TransformInput" sizeString="WWWWWWW"
|
||||||
|
label = "Параметр"
|
||||||
|
getText="ParseUI_TransformText"
|
||||||
|
onChange="ParseUI_TransformChange"/>
|
||||||
|
<button id="TransformSingle"
|
||||||
|
label="Преобразовать один"
|
||||||
|
supertip="Провести преобразование выделенной сущности (используйте навигацию)"
|
||||||
|
imageMso="FontsReplaceFonts"
|
||||||
|
onAction="Parse_OnBtn"/>
|
||||||
|
<button id="TransformAll"
|
||||||
|
label="Преобразовать все"
|
||||||
|
supertip="Провести преобразования всех сущностей"
|
||||||
|
imageMso="AsianLayoutMenu"
|
||||||
|
onAction="Parse_OnBtn"/>
|
||||||
|
</group>
|
||||||
|
|
||||||
|
<group id="LoadGroup" label="Выгрузка">
|
||||||
|
<editBox id="CategoryInput" sizeString="WWW"
|
||||||
|
label = "Категория"
|
||||||
|
getText="ParseUI_CategoryText"
|
||||||
|
onChange="ParseUI_CategoryChange"/>
|
||||||
|
<button id="ExportAll"
|
||||||
|
label="Выгрузить все"
|
||||||
|
supertip="Выгрузить вхождения с текстами"
|
||||||
|
imageMso="ExportExcel"
|
||||||
|
onAction="Parse_OnBtn"/>
|
||||||
|
<button id="ExportRanges"
|
||||||
|
label="Только вхождения"
|
||||||
|
supertip="Выгрузить информацию о вхождениях (без текста)"
|
||||||
|
imageMso="MindMapExportExcel"
|
||||||
|
onAction="Parse_OnBtn"/>
|
||||||
|
</group>
|
||||||
|
|
||||||
|
<group id="MiscGroup" label="Информация">
|
||||||
|
<button id="ViewHelp" size="large"
|
||||||
|
label="Справка"
|
||||||
|
supertip="Вызов справки"
|
||||||
|
imageMso="Info"
|
||||||
|
onAction="Parse_OnBtn"/>
|
||||||
|
|
||||||
|
</group>
|
||||||
|
</tab>
|
||||||
|
</tabs>
|
||||||
|
</ribbon>
|
||||||
|
</customUI>
|
2
ui/database/.rels
Normal file
2
ui/database/.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="xl/workbook.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>
|
29
ui/database/customUI.xml
Normal file
29
ui/database/customUI.xml
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui" >
|
||||||
|
<ribbon>
|
||||||
|
<tabs>
|
||||||
|
<tab id="MarkupAggregator" label="Концепт.Майнинг" >
|
||||||
|
<group id="Actions" label="Действия" >
|
||||||
|
<button id="ImportWord" visible="true" size="large"
|
||||||
|
label="Обработать источники"
|
||||||
|
supertip="Загрузить данные из текстовых документов"
|
||||||
|
onAction="OnRibbonBtn"
|
||||||
|
imageMso="ExportWord"/>
|
||||||
|
<button id="FollowLink" visible="true" size="large"
|
||||||
|
label="Показать документ"
|
||||||
|
supertip="Открыть выделенный фрагмент в документе"
|
||||||
|
onAction="OnRibbonBtn"
|
||||||
|
imageMso="PivotTableGroupSelection"/>
|
||||||
|
|
||||||
|
<separator id="separator" />
|
||||||
|
|
||||||
|
<button id="ClearAll" visible="true" size="large"
|
||||||
|
label="Очистить"
|
||||||
|
supertip="Удалить все добавленные данные"
|
||||||
|
onAction="OnRibbonBtn"
|
||||||
|
imageMso="ArrangeByRecurrence"/>
|
||||||
|
</group>
|
||||||
|
</tab>
|
||||||
|
</tabs>
|
||||||
|
</ribbon>
|
||||||
|
</customUI>
|
Loading…
Reference in New Issue
Block a user