Модераторы: Snowy, MetalFan, bems, Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Изменить код функции для поиска полужирного текста, Есть функция нужно её корректировать 
V
    Опции темы
Massaget
  Дата 30.7.2015, 21:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 30.7.2015

Репутация: нет
Всего: нет



Приветствую всех!

В текущей функции парсируется только слово написанное прописным и полужирным шрифтом.
А следующие слова с теми же атрибутами расположенными далее, просто игнорируются.
Необходимо парсировать все слова имеющие одинаковые атрибуты форматирования и расположенные на одной строке разделённые через: пробел, дефис, кавычки (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:54
PM MAIL   Вверх
Poseidon
Дата 2.8.2015, 21:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 9
Всего: 133



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


--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
Massaget
Дата 3.8.2015, 18:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 30.7.2015

Репутация: нет
Всего: нет



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 действительно присутствует.

Хотя бы можно просто проверить является ли следующее слово прописным. Если да, то нужно взять все прописные слова как один элемент.
PM MAIL   Вверх
Poseidon
Дата 4.8.2015, 16:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 9
Всего: 133



Цитата(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;



--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
Massaget
Дата 4.8.2015, 18:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 30.7.2015

Репутация: нет
Всего: нет



Задача и упоминание HTML в приложении начинается после анализа текста загруженного в визуальный компонент AnalystList. Так что анализ происходит после загрузки документа. А извлечение нужного текста выполняется именно функцией 
Код
function GetIsTitle(AValue: String): Boolean;
. Все телодвижения для определения прописных слов как единое целое нужно прикрутить к этой функции. Сам пытаюсь который день, но опыта и справки маловато. 
PM MAIL   Вверх
Poseidon
Дата 5.8.2015, 09:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 9
Всего: 133



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

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




--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
Massaget
Дата 5.8.2015, 21:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 30.7.2015

Репутация: нет
Всего: нет



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

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

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

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

Это сообщение отредактировал(а) Massaget - 5.8.2015, 21:25

Присоединённый файл ( Кол-во скачиваний: 4 )
Присоединённый файл  Word_sample_text.jpg 138,60 Kb
PM MAIL   Вверх
Massaget
Дата 5.8.2015, 21:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 30.7.2015

Репутация: нет
Всего: нет



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

Присоединённый файл ( Кол-во скачиваний: 6 )
Присоединённый файл  UZB_simbols_MARKER.jpg 64,56 Kb
PM MAIL   Вверх
Massaget
Дата 12.8.2015, 19:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 30.7.2015

Репутация: нет
Всего: нет



Всем спасибо за участие! Вопрос снят!
Как говорится "На бога надейся, а сам не плошай!"
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0928 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.