/
bear
/
aot
Обзор
Документация
Войти
/
bear
/
aot
Код
Запросы
0
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
Source/graphan/GraphanLib/Consent.cpp
153 строки
4 KB
sokirko74
distribute over folders
01 дек 2021, 21:21
01 дек 2021, 21:21
9bdfb1a
Код
Авторство
О чём код?
// ========== This file is under LGPL, the GNU Lesser General Public Licence // ========== Dialing Graphematical Module (www.aot.ru) // ========== Copyright by Alexey Sokirko (1996-2001) // ============ Consent.CPP ========================== //================================================================== // Этот модуль - часть макросинтаксического анализа. // Сюда включены функции анализа, которые создают // макросинтаксические единицы (ConSent), проводят инициализацию, // записывают в выходной файл. //================================================================== #include "StdGraph.h" #include "GraphmatFile.h" #include <assert.h> #include <stdlib.h> #include "Consent.h" const CGraLine& CConSent::GetUnit(size_t i) const { return m_GraFile->GetUnits()[i]; }; bool CConSent::IsBullet() const { return IsGround() && m_GraFile->HasDescr(m_HardGraphStartNo, OBullet); }; bool CConSent::IsParag() const { return IsGround() && m_GraFile->HasDescr(m_HardGraphStartNo, OPar); }; bool CConSent::IsSoft() const { return m_HardGraphEndNo == 0; }; bool CConSent::IsFirstWord(const std::string& s) const { return m_GraFile->StrSuperCompare(m_HardGraphStartNo, s.c_str()); }; //== Условие, что начало МЕ оформлено стандартным способом //=== для российских нормативных актов // Примеры стандартного оформления: // Глава 1. // Подраздел X-A. inline bool CConSent::SetUsualLawDocumentDivision() { if (IsFirstWord(_R("глава"))) m_UsualLawDocumentDivision = Chapter; else if (IsFirstWord(_R("статья"))) m_UsualLawDocumentDivision = Article; else if (IsFirstWord(_R("раздел"))) m_UsualLawDocumentDivision = Section; else if (IsFirstWord(_R("подраздел"))) m_UsualLawDocumentDivision = SubSection; else if (IsFirstWord(_R("часть"))) m_UsualLawDocumentDivision = Part; else m_UsualLawDocumentDivision = None; if ((m_UsualLawDocumentDivision == None) && (!GetUnit(m_HardGraphStartNo).IsParagraphChar())) return false; size_t nh = m_HardGraphStartNo; size_t nt = m_HardGraphEndNo + 1; size_t k = nh + 1; if (k >= nt) return false; if (!GetUnit(k).IsSpace()) return false; k++; if (k >= nt) return false; return m_GraFile->IsBulletWord(k); } bool CConSent::InitBasicInformation() { m_NumberOfLines = 0; m_CountFullStops = 0; m_HardGraphStartNo = m_GraFile->PSoft(m_StartNo, m_GraFile->GetUnits().size()); assert(m_HardGraphStartNo < m_GraFile->GetUnits().size()); m_HardGraphEndNo = m_GraFile->BSoft(m_EndNo); assert(m_HardGraphEndNo > 0); if (IsSoft()) m_GraLineNoToMark = m_EndNo; else m_GraLineNoToMark = m_GraFile->HasDescr(m_HardGraphEndNo, OPun) ? m_HardGraphEndNo : m_GraFile->BSpace(m_EndNo); m_bFirstUpper = m_GraFile->HasDescr(m_HardGraphEndNo, OUp); for (size_t i = m_StartNo; i <= m_EndNo; i++) { if (GetUnit(i).IsEOLN()) m_NumberOfLines += GetUnit(i).GetScreenLength(); if (m_GraFile->IsSentenceEndMark(i)) m_CountFullStops++; }; SetUsualLawDocumentDivision(); return true; } std::string CConSent::GetString() const { std::string Result; int LastLength = 0; bool bHasHard = false; Result = "<sent>"; for (int i = m_StartNo; i <= m_EndNo; i++) { std::string s(m_GraFile->GetUnits()[i].GetToken(), m_GraFile->GetUnits()[i].GetTokenLength()); Result += ConvertASCIIToHtmlSymbols(s); if (m_GraFile->HasDescr(i, OSentEnd)) { Result += "</sent>"; LastLength = Result.length(); Result += "<sent>"; }; }; if (bHasHard) Result += "</sent>"; else Result.erase(LastLength); return Result; };