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
13440
с Территории
Был такой Рип ван Винкль. Он проспал 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, Супермодераторы



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

Сейчас этот форум просматривают: Google [Bot]


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

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