Заслуженный участник |
|
26/07/09 1559 Алматы
|
Текст в 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;
Блин, так писать нельзя, но вроде-бы должно работать. 2 ewertЦитата: Ну я не знаю, каков там стандарт языка; факт лишь то, что угловые скобки внутри текста прекрасно отображаются и не портят структуру файла. Да. Но есть xhtml, с более строгими требованиями.
|
|