2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему На страницу 1, 2  След.
 
 интерпретатор html-Паскаль
Сообщение30.10.2009, 14:13 


10/05/07
97
Нужно из html файла извлечь информацию о фоне и написанном обычном тексте и выполнить тоже самое в программе в Паскале.
(цвет задаётся на английском, только совпадающие названия)
Я ничего в этом не понимаю, подскажите, пжл!
для фона у меня вышло вот это:
Цитата:
Program 111;
Var t:text;
Str, col: string;
Begin
Assign (t, ‘text1. html’);
While not eof(t) do
Begin
Readln (t, str);
Copy (col, pos, str, ‘bgcolor=”’);
End;

Procedure SetTextParm (background);
Begin
Bkcolor1:=col;
End;
Readln;
End.

как именно выделить название цвета? и как выделить текст, который будет на экране сайта, не учитывая тегов?? :roll: :roll: :roll:

 Профиль  
                  
 
 Re: интерпретатор html-Паскаль
Сообщение30.10.2009, 14:33 
Заслуженный участник
Аватара пользователя


18/05/06
13438
с Территории
Был такой Рип ван Винкль. Он проспал 20 лет. Некоторые преподаватели тоже проспали, скажем, лет 10. Хотя это ладно; bgcolor кое-где ещё можно увидеть in the wild.
А текст, ну что ж. Игнорируйте все тэги; что останется - это и будет текст.

 Профиль  
                  
 
 Re: интерпретатор html-Паскаль
Сообщение30.10.2009, 14:35 
Заслуженный участник


09/08/09
3438
С.Петербург
В таком общем виде это весьма нетривиальная задача. Цвет может задаваться в тегах, а может - в CSS (в том числе, во внешних).
Это у Вас учебная программа или что-то, имеющее отношение к реальности?

 Профиль  
                  
 
 Re: интерпретатор html-Паскаль
Сообщение30.10.2009, 14:37 
Заслуженный участник


11/05/08
32166
Rony в сообщении #256623 писал(а):
как именно выделить название цвета?

Ну уж точно не так, это какая-то чушь:
Rony в сообщении #256623 писал(а):
Код:
Copy (col, pos, str, ‘bgcolor=”’);

Примерно так:
Код:
. . . . . . . . . . . . .
i:=Pos(‘bgcolor=”’, str);
if i<>0 then begin
    col:=Copy(str, i+9, length(str)-i-8);
    i:=Pos(‘”’, col);
    col:=Copy(str, 1, i-1);
end;
. . . . . . . . . . . . .

(если я нигде на единичку не сбился).

Rony в сообщении #256623 писал(а):
и как выделить текст, который будет на экране сайта, не учитывая тегов??

Подсчитывайте по мере поступления текста уровень вложенности открывающих "<" и закрывающих ">" (при поступлении открывающей скобки уровень увеличивается, при поступлении закрывающей уменьшается на 1). Очередной символ принадлежит тексту, если на момент его поступления уровень -- нулевой.

Правда, есть два нюанса.

Во-первых, надо заменять символы табуляции пробелами, а дублирующие пробелы -- удалять. Ну и уж заодно можно вставлять переводы строк.

Во-вторых, это будет работать, только если сам текст не содержит угловых скобок -- иначе придётся отслеживать появление не просто скобок, а именно всех допустимых тегов, что есть морока, но тут уж ничего не поделаешь.

 Профиль  
                  
 
 Re: интерпретатор html-Паскаль
Сообщение30.10.2009, 14:42 
Заслуженный участник


09/08/09
3438
С.Петербург
ewert в сообщении #256641 писал(а):
Во-вторых, это будет работать, только если сам текст не содержит угловых скобок -- иначе придётся отслеживать появление не просто скобок, а именно всех допустимых тегов, что есть морока, но тут уж ничего не поделаешь.
Текст в HTML не может содержать угловых скобок; вместо них вставляются последовательности < и > И одна из проблем как раз в том, как выводить на экран подобные последовательности, если они присутствуют в тексте.

-- Пт окт 30, 2009 14:53:09 --

А еще цвет словами может задаваться:
Код:
<html>
<body bgcolor="red">
Red background.
</body>
</html>

 Профиль  
                  
 
 Re: интерпретатор html-Паскаль
Сообщение30.10.2009, 15:14 
Заслуженный участник


11/05/08
32166
Maslov в сообщении #256647 писал(а):
Текст в HTML не может содержать угловых скобок;

Ну я не знаю, каков там стандарт языка; факт лишь то, что угловые скобки внутри текста прекрасно отображаются и не портят структуру файла.

 Профиль  
                  
 
 Re: интерпретатор html-Паскаль
Сообщение30.10.2009, 15:15 
Заслуженный участник


09/08/09
3438
С.Петербург
ewert в сообщении #256656 писал(а):
факт лишь то, что угловые скобки внутри текста прекрасно отображаются и не портят структуру файла
Это Вы почему так думаете?

 Профиль  
                  
 
 Re: интерпретатор html-Паскаль
Сообщение30.10.2009, 15:18 
Заслуженный участник


11/05/08
32166
Maslov в сообщении #256658 писал(а):
Это Вы почему так думаете?

А только что проверил. Запортил файл -- и прекрасно открыл его (во всяком случае, в Опере и в ИЕ).

 Профиль  
                  
 
 Re: интерпретатор html-Паскаль
Сообщение30.10.2009, 15:21 
Заслуженный участник


26/07/09
1559
Алматы
Maslov в сообщении #256647 писал(а):
Текст в HTML не может содержать угловых скобок; вместо них вставляются последовательности < и > И одна из проблем как раз в том, как выводить на экран подобные последовательности, если они присутствуют в тексте.

В отображаемом тексте, извлеченном из html кода, специальные последовательности можно обнаруживать по начальному амперсанду, а затем проверять последовательность по заранее заготовленному списку.

Примерно так:
Код:
const
  Entities: array [1..100, 1..2] of string=(
    ('"',  '"'),
    ('&',   '&'),
    ('<',    '<'),
    ('>',    '>'),
    (' ',  ' '),
    ('¡', '¡'),
    ('¢',  '¢'),
    ('£', '£'),
    ('¤','¤'),
    ('¥',   '¥'),
    ('¦','¦'),
    ('§',  '§'),
    ('¨',   '¨'),
    ('©',  '©'),
    ('ª',  'ª'),
    ('«', '«'),
    ('¬',   '¬'),
    ('­',   '­'),
    ('®',   '®'),
    ('¯',  '¯'),
    ('°',   '°'),
    ('±','±'),
    ('²',  '²'),
    ('³',  '³'),
    ('´', '´'),
    ('µ', 'µ'),
    ('¶',  '¶'),
    ('·','·'),
    ('¸', '¸'),
    ('¹',  '¹'),
    ('º',  'º'),
    ('»', '»'),
    ('¼','¼'),
    ('½','½'),
    ('¾','¾'),
    ('¿','¿'),
    ('À','À'),
    ('Á','Á'),
    ('Â', 'Â'),
    ('Ã','Ã'),
    ('Ä',  'Ä'),
    ('Å', 'Å'),
    ('Æ', 'Æ'),
    ('Ç','Ç'),
    ('È','È'),
    ('É','É'),
    ('Ê', 'Ê'),
    ('Ë',  'Ë'),
    ('Ì','Ì'),
    ('Í','Í'),
    ('Î', 'Î'),
    ('Ï',  'Ï'),
    ('Ð',   'Ð'),
    ('Ñ','Ñ'),
    ('Ò','Ò'),
    ('Ó','Ó'),
    ('Ô', 'Ô'),
    ('Õ','Õ'),
    ('Ö',  'Ö'),
    ('×', '×'),
    ('Ø','Ø'),
    ('Ù','Ù'),
    ('Ú','Ú'),
    ('Û', 'Û'),
    ('Ü',  'Ü'),
    ('Ý','Ý'),
    ('Þ', 'Þ'),
    ('ß', 'ß'),
    ('à','à'),
    ('á','á'),
    ('â', 'â'),
    ('ã','ã'),
    ('ä',  'ä'),
    ('å', 'å'),
    ('æ', 'æ'),
    ('ç','ç'),
    ('è','è'),
    ('é','é'),
    ('ê', 'ê'),
    ('ë',  'ë'),
    ('ì','ì'),
    ('í','í'),
    ('î', 'î'),
    ('ï',  'ï'),
    ('ð',   'ð'),
    ('ñ','ñ'),
    ('ò','ò'),
    ('ó','ó'),
    ('ô', 'ô'),
    ('õ','õ'),
    ('ö',  'ö'),
    ('÷','÷'),
    ('ø','ø'),
    ('ù','ù'),
    ('ú','ú'),
    ('û', 'û'),
    ('ü',  'ü'),
    ('ý','ý'),
    ('þ', 'þ'),
    ('ÿ',  'ÿ'));

...

procedure Decode(var Line:string);
var
  j,i: integer;
  IsEntity: boolean;
  Entity: string;
  EnLen, EnPos, d, c: integer;
begin
  i:=1;
  IsEntity:=false;
  EnPos:=0;

  while (i<=Length(Line)) do
  begin
    if Line[i]='&' then
    begin
      EnPos:=i;
      IsEntity:=true;
      Entity:='';
    end;

    if IsEntity then Entity:=Entity+Line[i];

    if IsEntity then
      if (Line[i]=';') or (Line[i]=' ') then
      begin
        EnLen:=Length(Entity);

        if (EnLen>2) and (Entity[2]='#') then
        begin
          delete(Entity, EnLen, 1);
          delete(Entity, 1, 2);

          if (Length(Entity)<=3) then
          begin
            val(Entity, d, c);

            if c=0 then
            begin
              delete(Line, EnPos, EnLen);
              insert(Chr(d), Line, EnPos);
              i:=EnPos;
            end;
          end;
        end
        else
        begin
          j:=1;

          while (j<=100) do
          begin
            if Entity=(Entities[j,1]) then
            begin
              delete(Line, EnPos, EnLen);
              insert(Entities[j,2], Line, EnPos);
              j:=102;
            end;

            Inc(j);
          end;

          if j=103 then
            i:=EnPos-1
          else
            i:=EnPos;
        end;

        IsEntity:=false;
      end;

    Inc(i);
  end;
end;

Блин, так писать нельзя, но вроде-бы должно работать. :)


2ewert
Цитата:
Ну я не знаю, каков там стандарт языка; факт лишь то, что угловые скобки внутри текста прекрасно отображаются и не портят структуру файла.

Да. Но есть xhtml, с более строгими требованиями.

 Профиль  
                  
 
 Re: интерпретатор html-Паскаль
Сообщение30.10.2009, 15:27 
Заслуженный участник


09/08/09
3438
С.Петербург
ewert в сообщении #256659 писал(а):
Запортил файл -- и прекрасно открыл его (во всяком случае, в Опере и в ИЕ).
Открывать-то браузер такой файл открывает, да вот только игнорирует все содержимое от '<' до следующего '>'.

-- Пт окт 30, 2009 15:39:32 --

Circiter в сообщении #256660 писал(а):
Блин, так писать нельзя, но вроде-бы должно работать. :)

По-моему, проще зачитать весь файл в строку и глобальными заменами всё это сделать.
Но остаётся вопрос, как всё это великолепие на экран выводить.

 Профиль  
                  
 
 Re: интерпретатор html-Паскаль
Сообщение30.10.2009, 15:47 
Заслуженный участник


11/05/08
32166
Maslov в сообщении #256662 писал(а):
Открывать-то браузер такой файл открывает, да вот только игнорирует все содержимое от '<' до следующего '>'.

Да нет же. Вот, пожалуйста, прогоните:

Код:
<html>
<head>
<title>Пример запорченного файла</title>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
</head>

<body>

  <i><H1>Пример файла с угло<выми</H1></i>
  скобками в тексте
  <BR><BR><BR>

  <a href="http://dxdy.ru/">Это - сайт DXDY.RU</a>

</body>
</html>

 Профиль  
                  
 
 Re: интерпретатор html-Паскаль
Сообщение30.10.2009, 15:58 
Заслуженный участник


09/08/09
3438
С.Петербург
ewert в сообщении #256670 писал(а):
Да нет же. Вот, пожалуйста, прогоните

А так? :)
Код:
<html>
<head>
<title>Пример запорченного файла</title>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
</head>

<body>

  <i><H1>Example of file with <angle </H1></i>
  brackets
  <BR><BR><BR>

  <a href="http://dxdy.ru/">Это - сайт DXDY.RU</a>

</body>
</html>

Короче, предлагаю ничью :)

 Профиль  
                  
 
 Re: интерпретатор html-Паскаль
Сообщение30.10.2009, 16:13 
Заслуженный участник


11/05/08
32166
Так нечестно -- Вы вставили не просто скобку, а тег!

Да ладно, согласен.

 Профиль  
                  
 
 Re: интерпретатор html-Паскаль
Сообщение30.10.2009, 16:36 
Заслуженный участник


26/07/09
1559
Алматы
2Maslov
Цитата:
По-моему, проще зачитать весь файл в строку и глобальными заменами всё это сделать.
Но остаётся вопрос, как всё это великолепие на экран выводить.

Дык тот код и делает глобальные замены в строке (при этом специальные последовательсности заменяются на печатные символы, например © заменяется на ©). Или вы что-то другое имели ввиду?

 Профиль  
                  
 
 Re: интерпретатор html-Паскаль
Сообщение30.10.2009, 17:11 
Заслуженный участник


09/08/09
3438
С.Петербург
To Circiter

Circiter в сообщении #256688 писал(а):
Дык тот код и делает глобальные замены в строке (при этом специальные последовательсности заменяются на печатные символы, например © заменяется на ©). Или вы что-то другое имели ввиду?

Я имел в виду что-нибудь такого плана:

Код:
procedure Decode(var Txt: string)
var i: integer;

procedure Replace(var Str: string; var Src: string; var Dst: string);
begin
    (* глобальная замена Src на Dst в Str *)
end;

begin
    for i:=1 to 100 do
        Replace(Txt, Entities[i,1], Entities[2]);
end

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 18 ]  На страницу 1, 2  След.

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group