-
Notifications
You must be signed in to change notification settings - Fork 14
/
Copy pathparser.h
148 lines (133 loc) · 7.09 KB
/
parser.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
#ifndef _avalon_parser_h_
#define _avalon_parser_h_
/*!
* \file parser.h
* \brief Медоды для парсинга текста сообщений
*
* <b>Общее описание алгоритма парсинга</b>
*
* 1) Входной текст разбивается на строки, а каждая строка на
* две части - квоту и строку после квотирования. Это необходимо для того
* чтобы часть цитирования можно было вынести за пределы монолитного блока
* (напрмер, тэга кода) и не включать в подсветку синтаксиса кода. (см. parseQuotes)
*
* 2) Набор квотированных строк разбивается на монолитные блоки, каждый из
* которых содержит свой поднабор квотированных строк и тип/подтип моноблока.
* Подтип моноблока используется для корректного определения способа экранирования "]"
* (в исходном коде "]]" так и остается, а в остальных случаях заменяется одиночным "]")
* (см. parseBlocks). Дополнительно производится "схлопывание" пустых блоков, которые
* не несут никакой полезной информации.
*/
#include "sysheaders.h"
/*!
* \brief Описатель квотированной строки
*/
typedef struct AQuotedString
{
int QuoteLevel; /*!< \brief Уровень квотирования (0 - нет) */
QString QuoteText; /*!< \brief Текст квотирования */
QString Data; /*!< \brief Текст строки */
} AQuotedString;
/*!
* \brief Список квотированных строк
*/
typedef QList<AQuotedString> AQuotedStringList;
/*!
* \brief Тип монолитного блока сообщения
*/
typedef enum
{
pbtText, /*!< \brief Блок с простым текстом */
pbtCode, /*!< \brief Блок с исходным кодом */
pbtAssembler, /*!< \brief Блок ассемблера */
pbtC, /*!< \brief Блок си */
pbtCPP, /*!< \brief Блок c++ */
pbtCSharp, /*!< \brief Блок c# */
pbtMSIL, /*!< \brief Блок MSIL */
pbtIDL, /*!< \brief Блок IDL/MIDL */
pbtPascal, /*!< \brief Блок Pascal/Delphi */
pbtBasic, /*!< \brief Блок Basic/Visual Basic */
pbtSQL, /*!< \brief Блок SQL/TSQL/PSQL */
pbtPerl, /*!< \brief Блок Perl */
pbtPHP, /*!< \brief Блок PHP */
pbtJava, /*!< \brief Блок Java */
pbtXML, /*!< \brief Блок XML/XSL */
pbtLisp, /*!< \brief Блок Lisp */
pbtHaskell, /*!< \brief Блок Haskell */
pbtErlang, /*!< \brief Блок Erlang */
pbtOCaml, /*!< \brief Блок OCaml */
pbtProlog, /*!< \brief Блок Prolog */
pbtPython, /*!< \brief Блок Python */
pbtRuby, /*!< \brief Блок Ruby */
pbtNemerle, /*!< \brief Блок Nemerle */
pbtTagline, /*!< \brief Блок подписи */
pbtModerator, /*!< \brief Блок сообщения модератора */
pbtQuote, /*!< \brief Блок цитаты */
pbtTable, /*!< \brief Блок таблицы */
pbtCut /*!< \brief Блок cut */
} AParsedBlockType;
/*
* \brief Подтип монолитного блока сообщения
* Флаг необходим из за разных алгоритмов обработки экранирующего [[
* (см. https://rsdn.ru/forum/test/4217775.1 - в блоке исходного кода экранирование работать не должно),
* а так же, возможно, для новых тэгов, требующих специальной обработки
*/
typedef enum
{
pbstText, /*!< \brief Простой текст - "]" экранируется */
pbstSourceCode, /*!< \brief Исходный код - "]" не экранируется */
pbstBlock /*!< \brief Блок блоков */
} AParsedBlockSubType;
/*!
* \brief Описатель монолитного блока сообщения (см. ниже)
*/
struct AParsedBlock;
/*!
* \brief Список разобранных монолитных блоков
*/
typedef QList<AParsedBlock> AParsedBlockList;
/*!
* \brief Описатель монолитного блока сообщения
*/
typedef struct AParsedBlock
{
AParsedBlockType Type; /*!< \brief Тип монолитного блока */
AParsedBlockSubType SubType; /*!< \brief Подтип монолитного блока */
QString Title; /*!< \brief Заголовок блока (для тэга cut) */
AQuotedStringList Strings; /*!< \brief Список квотированных строк */
AParsedBlockList SubBlocks; /*!< \brief Список подблоков */
} AParsedBlock;
/*!
* \brief Класс парсера BB сообщений
*/
class AParser
{
public:
/*!
* \brief Парсинг одиночной строки на квотированную часть и данные
* \param line Исходная строка
* \return Строка разделенная на квоту и данные
* из квоты удаляются пробелы, данные не изменяются
*/
static AQuotedString parseQuote (const QString& line);
/*!
* \brief Парсинг списка строк на квотированную часть и данные
* \param source Исходный текст
* \return Строки разделенные на квоту и данные
* (список строк после обработки каждой вызовом parseQuote),
*/
static AQuotedStringList parseQuotes (const QString& source);
/*!
* \brief Парсинг списка строк на монолитные блоки
* \param source Исходный текст
* \return Список описателей монолитных блоков
*/
static AParsedBlockList parseBlocks (const QString& source);
/*!
* \brief Проверка является ли текст URL
* \param text Текст для проверки
* \return 0, если текст не является ссылкой, 1 - если текст является ссылкой, 2 - если текст является опасной ссылкой
*/
static int isURL (const QString& text);
};
#endif // _avalon_parser_h_