Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > Изменить код функции для поиска полужирного текста


Автор: Massaget 30.7.2015, 21:01
Приветствую всех!

В текущей функции парсируется только слово написанное прописным и полужирным шрифтом.
А следующие слова с теми же атрибутами расположенными далее, просто игнорируются.
Необходимо парсировать все слова имеющие одинаковые атрибуты форматирования и расположенные на одной строке разделённые через: пробел, дефис, кавычки (Word'овские и возможно такие - " ").
Буду рад, если поможете отредактировать код!

Код

function GetIsTitle(AValue: String): Boolean;
Var  S: String;
     InX, InY: Integer;
Begin
InY := 0; S := AValue;
InX := Pos(Ch_BraceSqrBegin, S);
If InX > 0 then S := S_Copy(S, 1, InX - 1);
For InX := 1 to Length(S) do
If S_IsLetter(S[InX]) and (S[InX] = S_UpperChar(S[InX])) then Inc(InY);
Result := InY > 1;
End;

Автор: Poseidon 2.8.2015, 21:59
Код не полный. Что за функции и переменные (Ch_BraceSqrBegin, S_IsLetter, S_UpperChar) не ясно. Но чуется мне, что данную задачу можно решить через регулярные выражения. Дай пример что передается в AValue. Подозреваю что там HTML, но все же. Так же определи конкретно в каких случая функция должна возвращать True (лучше с примерами).

Автор: Massaget 3.8.2015, 18:15
Poseidon, давайте объясню всё по порядку. Функция выдернута из приложения, в котором все компоненты кроме формы не являются стандартными VCL. Ни самих компонентов ни их исходных кодов у меня нет. Поэтому на некоторые ваши уточнения не могу ответить. Понимаю, чем больше  Вам знать, тем быстрее мне получить ответ.

Цитата
переменные (Ch_BraceSqrBegin, S_IsLetter, S_UpperChar)
.
Ch_BraceSqrBegin - упоминается ещё и в процедуре ниже (прилагаю код).
Код

procedure ScanType_0_0;
Var  InX: Integer;
     FList: TStringList;
Begin
// Scan Images Files
SImages := SImages + S;
FList := TStringList.Create;
S_CutLabel(SImages, FList, 1);
For InX := 0 to FList.Count - 1 do
  Begin
  If FileExists(F_NowPath + 'images\' + S_Cut(FList[InX], 1, Ch_Spec)) then
    Begin
    G_ResizePicture(F_NowPath + 'images\' + S_Cut(FList[InX], 1, Ch_Spec), F_NowPath + 'images\' + Ch_BottomLine + S_Cut(FList[InX], 1, Ch_Spec), 0, 100, True);
    ReadyList.TableCellLoadPicture(FTable, F_NowPath + 'images\' + Ch_BottomLine + S_Cut(FList[InX], 1, Ch_Spec), FTable.RowCount - 1, InX + 3, 1);
    ReadyList.TableCellText(FTable, FTable.RowCount - 1, InX + 3, S_Cut(FList[InX], 2, Ch_Spec), -1, 1, False);
    ReadyList.TableCellText(FTable, FTable.RowCount - 1, 8, Ch_BraceSqrBegin + FList[InX] + Ch_BraceSqrEnd, -1, -1, False);
    End;
  SImages := S_ReplaceText(SImages, [Ch_BraceSqrBegin + FList[InX] + Ch_BraceSqrEnd], [Ch_Free]);
  End;
FList.Free;
LeftX := FRect.Right + 1;
TopX := AnalystList.GetOffsBeforeItem(FRect.Right + 1);
End;


S_IsLetter - упоминается только в обработчике снизу.
Код

procedure TForm1.AnalysesFile(AFileName: String);
Var  InX, InY, StartX, StartY: Integer;
     Found: Boolean;
Begin
If AnalysText.LoadRTFEx(AFileName) then
  Begin
  StartX := 0; StartY := 0; Found := False;
  For InX := 0 to AnalysText.ItemCount - 1 do If Found then Break Else
  For InY := 0 to AnalysText.GetOffsAfterItem(InX) - 1 do
    Begin
    AnalysText.SetSelectionBounds(InX, InY, InX, InY + 1);
    If (AnalysText.GetSelTextA <> Ch_Free) and S_IsLetter(AnalysText.GetSelTextA[1]) then
      Begin
      StartX := InX;
      StartY := InY;
      Found := True;
      Break;
      End;
    End;
  AnalysText.SetSelectionBounds(0, 0, StartX, StartY);
  AnalysText.DeleteSelection;
  AnalysText.Reformat;
  AnalysText.SaveRTF(AFileName, False);
  End;
End;


S_UpperChar - упоминается только в функции 
Код
function GetIsTitle(AValue: String): Boolean;
.

Цитата
Дай пример что передается в AValue.
 - прилагаю код
Код

function TextToAlias(AValue: String): String;
Var  S1, S2: String;
Begin
S1 := Trim(S_Cut(AValue, 1, Ch_Path));
S2 := Trim(S_Cut(AValue, 2, Ch_Path));
Result := S_CryllToLatin(S1, Ch_Minus);
If S2 <> Ch_Free then Result := Result + Ch_Path + S_ReplaceText(S_CryllToLatin(S2, Ch_Minus), [Ch_Minus], [Ch_Free]);
Result := S_CharCase(Result, cc_Lower);
End;

function FormatFullText(AValue: String): String;
Var  FindPos, EndPos: Integer;
     FTag: String;
Begin
FindPos := 1;
Result := Trim(S_ReplaceText(HTML_DelTags(AValue, ['font']), [' align=justify', '<div', '/div>'], ['', '<p', '/p>']));
Repeat
FindPos := S_PosText('<IMG', Result, FindPos);
If FindPos > 0 then
  Begin
  EndPos := S_PosText(Ch_TagEnd, Result, FindPos + 4);
  FTag := S_CopyIndex(Result, FindPos + 1, EndPos - 1);
  FTag := 'img valign=middle src="' + HTML_GetImageSrc(FTag) + '"';
  Result := S_DelIndex(Result, FindPos + 1, EndPos - 1);
  Insert(FTag, Result, FindPos + 1);
  FindPos := FindPos + Length(FTag) + 2;
  End;
Until FindPos = 0;
//Result := HTML_ClearFreeTags(Result);
End;


Цитата
Подозреваю что там HTML
 - подозрения оправдались. HTML действительно присутствует.

Хотя бы можно просто проверить является ли следующее слово прописным. Если да, то нужно взять все прописные слова как один элемент.

Автор: Poseidon 4.8.2015, 16:12
Цитата(Massaget @  3.8.2015,  18:15 Найти цитируемый пост)
- прилагаю код
Не надо код, надо конкретная строка.

Цитата(Massaget @  3.8.2015,  18:15 Найти цитируемый пост)
Хотя бы можно просто проверить является ли следующее слово прописным.
Хорошо, допустим там html. Прописные в html - это тег <i>. C помощью регулярного выражения "<i>.*?</i>" мы можем просканировать текст на предмет данного тега. Если он есть, значит есть прописные.

Код

uses
  System.RegularExpressions;

function GetIsTitle(AValue: String): Boolean;
const
  Pattern = '<i>.*?</i>';
begin
  Result := TRegEx.IsMatch(AValue, Pattern);
end;

Автор: Massaget 4.8.2015, 18:41
Задача и упоминание HTML в приложении начинается после анализа текста загруженного в визуальный компонент AnalystList. Так что анализ происходит после загрузки документа. А извлечение нужного текста выполняется именно функцией 
Код
function GetIsTitle(AValue: String): Boolean;
. Все телодвижения для определения прописных слов как единое целое нужно прикрутить к этой функции. Сам пытаюсь который день, но опыта и справки маловато. 

Автор: Poseidon 5.8.2015, 09:02
Цитата(Massaget @  4.8.2015,  18:41 Найти цитируемый пост)
А извлечение нужного текста выполняется именно функцией

Этой функцией выполняется не извлечение, а определение. В функцию передается какой-то текст (AValue), эта функция что-то определяет и возвращает либо True, либо False. Вот и возникло 2 вопроса, ответ на которые ускорит решение задачи:
Цитата(Poseidon @  2.8.2015,  21:59 Найти цитируемый пост)
Дай пример что передается в AValue. 
 
Цитата(Poseidon @  2.8.2015,  21:59 Найти цитируемый пост)
определи конкретно в каких случая функция должна возвращать True (лучше с примерами)


Автор: Massaget 5.8.2015, 21:24
Цитата
Дай пример что передается в AValue.
 Как показала процедура ShowMessage в AValue находится уже (в недоступном мне модуле) готовое с ошибками решение. Т.е, слово написанное в верхнем регистре. При этом второе и следующее слово в верхнем регистре AValue не содержит.

Цитата
определи конкретно в каких случая функция должна возвращать True (лучше с примерами)

Имеется следующий текст (изображение во вложении). В тексте прописные слова начинающиеся с нового абзаца (параграфа) являются нужным элементом. Нужных элементов до 8. Другие обрабатываются корректно. В общем если второе прописное слово начинается с символа не являющегося русским алфавитом, то AValue возвращает:
1) первое прописное слово в котором все символы русские,
2) часть первого прописного слова в котором все символы русские до первого "чужого" символа. (смешанное слово понимается до первого чужого символа),
3) два и более слов до первого встречного чужого символа.

Сегодня накидал пару строк кода, который вроде как работает. Но нужно ещё потестить. Если в случае желаемого результата мне остаётся прикрутить его вместо AValue. Это возможно сделать?

Автор: Massaget 5.8.2015, 21:27
А вот и те символы - чужаки, из-за которых и весь сыр-бор.

Автор: Massaget 12.8.2015, 19:44
Всем спасибо за участие! Вопрос снят!
Как говорится "На бога надейся, а сам не плошай!"

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)