Методы построения HTML в коде

Шаблон html компилируется в приложение как ресурс. фрагмент шаблона HTML выглядит так:

<A href = "%PANELLINK%" target = "_blank">
   <IMG border = "0" src = "%PANELIMAGE%" style = "%IMAGESTYLE%">
</A><BR>
%CAPTIONTEXT%

Мне это нравится, потому что более крупный HTML-файл ресурса содержит стили, режим без причуд и т. д.

Но, как всегда, они теперь хотят опустить тег Anchor, если нет ссылки. Также, если заголовок отсутствует, следует опустить тег BR.


Рассматриваемая техника №1

Учитывая, что я не хочу создавать целые фрагменты HTML в коде C#, я считается что-то вроде:

%ANCHORSTARTTAGPREFIX%<A href = "%PANELLINK%" target = "_blank">%ANCHORSTARTTAGPOSTFIX%
   <IMG border = "0" src = "%PANELIMAGE%" style = "%IMAGESTYLE%">
%ANCHORENDTAGPREFIX%</A>%ANCHORENDTAGPOSTFIX%CAPTIONPREFIX%<BR>
%CAPTIONTEXT%%CAPTIONPOSTFIX%

с идеей, что я мог бы использовать префиксы и постфиксы, чтобы превратить HTML-код в:

<!--<A href = "%PANELLINK%" target = "_blank">-->
   <IMG border = "0" src = "%PANELIMAGE%" style = "%IMAGESTYLE%">
<!--</A>--><!--<BR>
%CAPTIONTEXT%-->

Но это просто смешно, плюс один отвечающий напоминает нам, что это тратит впустую полосу пропускания и может содержать ошибки.


Рассматриваемая техника №2

Оптовая замена бирок:

%AnchorStartTag%
   <IMG border = "0" src = "%PANELIMAGE%" style = "%IMAGESTYLE%">
%AnchorEndTag%%CaptionStuff%

и выполняем поиск-замену, чтобы изменить

%AnchorStartTag%

с участием

"<A href=\"foo\" target=\"blank\""

Рассматриваемая техника №3

Я подумал о присвоении идентификатора важным элементам HTML:

<A id = "anchor" href = "%PANELLINK%" target = "_blank">
   <IMG border = "0" src = "%PANELIMAGE%" style = "%IMAGESTYLE%">
</A><BR id = "captionBreak">
%CAPTIONTEXT%

а затем с помощью парсера HTML DOM для программного удаления узлов. Но нет простого доступа к надежному парсеру HTML DOM. Если бы вместо HTML был xhtml, я бы использовал различные встроенные / изначально доступные парсеры xml DOM.


Рассматриваемая техника №4

На самом деле у меня есть:

private const String htmlEmptyTemplate = 
    @"<!DOCTYPE HTML PUBLIC ""-//W3C//DTD HTML 4.01//EN\"""+Environment.NewLine+
    @"   ""http://www.w3.org/TR/html4/strict.dtd"">"+Environment.NewLine+
    @"<HTML>"+Environment.NewLine+
    @"<HEAD>"+Environment.NewLine+
    @"  <TITLE>New Document</TITLE>"+Environment.NewLine+
    @"  <META http-equiv = ""X-UA-Compatible"" content = ""IE=edge"">"""+Environment.NewLine+
    @"  <META http-equiv = ""Content-Type"" content = ""text/html; charset=UTF-8"">"+Environment.NewLine+
    @"</HEAD>"+Environment.NewLine+
    @""+Environment.NewLine+
    @"<BODY style = ""margin: 0 auto"">"+Environment.NewLine+
    @"  <DIV style = ""text-align:center;"">"+Environment.NewLine+
    @"      %ContentArea%"+Environment.NewLine+
    @"  </DIV>" + Environment.NewLine +
    @"</BODY>" + Environment.NewLine +
    @"</HTML>";

private const String htmlAnchorStartTag = 
    @"<A href = ""%PANELLINK%"" target = ""_blank"">";

//Image is forbidden from having end tag
private const String htmlImageTag = 
    @"<IMG border = ""0"" src = ""%PANELIMAGE%"" style = ""%IMAGESTYLE%"">";

private const String htmlCaptionArea =
    @"<BR>%CAPTIONTEXT%";

А я уже хочу себе глаза выбить. Создание HTML в коде - это кошмар. Это кошмар - писать, кошмар, чтобы отлаживать, и кошмар, который нужно поддерживать, - и это усложнит жизнь следующему парню. Я надеюсь на другое решение - так как я являюсь следующий парень.

Это не совсем языковой агностик. Лучший способ зависит от используемого вами шаблонизатора.

singpolyma 17.12.2008 23:24

Я использую механизм шаблонов - это встроенное в язык средство поиска строк. Может быть C, C#, C++, Object pascal, javascript, Java, DelphiScript, Chrome.

Ian Boyd 17.12.2008 23:26
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Введение в CSS
Введение в CSS
CSS является неотъемлемой частью трех основных составляющих front-end веб-разработки.
Как выровнять Div по центру?
Как выровнять Div по центру?
Чтобы выровнять элемент <div>по горизонтали и вертикали с помощью CSS, можно использовать комбинацию свойств и значений CSS. Вот несколько методов,...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Travel Booking Angular Template один из лучших Travel & Tour booking template in the world. 30+ валидированных HTML5 страниц, которые помогут...
3
2
593
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

Уровень моей репутации в этой игре и без того низкий, что дает мне возможность прямо сказать вам, что вы, сэр или мадам, серьезно нуждаетесь в XSLT. В противном случае (и вы, вероятно, будете) вам нужно посмотреть на XML-литералы в VB.NET (который предоставляет вам решение на основе шаблонов, которое вы ищете ...). Поскольку я предпочитаю оставаться на C# (хотя я родился и вырос на VBA), я использую XSLT.

Обе мои нежелательные рекомендации требуют использования XHTML вместо HTML. Само по себе это требование отталкивает многих традиционных разработчиков. Благодаря тому, что вы используете заглавные буквы в элементах HTML, я уже вижу, что вы сочтете мои замечания совершенно бесполезными. Так что я должен прекратить писать сейчас.

я буду использовать решение на основе xml, как только ситуация начнет использовать xhtml

Ian Boyd 17.12.2008 23:50

XHTML вообще не требуется. Смотрите мое решение.

Tomalak 18.12.2008 00:07

вы получите +1 за XSLT, и я бы дал вам еще один за юмор, если бы мог

annakata 18.12.2008 00:09

+1 для XSLT, один из самых подходящих инструментов для работы ИМХО

seanb 18.12.2008 00:16

У тебя +1 от меня за юмор :). Я дополняю эту мысль аннакатой. Конечно, XSLT - самый мощный, естественный и подходящий инструмент для генерации HTML.

Dimitre Novatchev 20.12.2008 07:10

Да, ребята, я с нетерпением жду, когда Microsoft поддержит XSLT 2.0!

rasx 07.01.2009 22:46

1.) Не используйте комментарии, вы отправите в браузер бесполезные данные, тратя впустую полосу пропускания и столкнувшись с ОШИБКИ в IE.

2.) Разве это не было бы лучше как какой-то метод? (Я не знаком с C#), но что-то вроде этого имеет для меня больше смысла.

//using PHP in this example
function HTMLImage($imageData, $linkData){
  var str = '';
  //if there is link data, start <a> tag
  $str .= '<a '.{expand any attributes}.'>';

  //add image tag and attributes from $imageData
  $str .= '<img '.{expand any attributes}.'/>';

  //if there is link data, close <a> tag
  $str .= '</a>';
  return $str;
}

Я только что обновил свой первоначальный вопрос, у меня есть что-то подобное - и чего-то в этом роде я отчаянно пытаюсь избежать.

Ian Boyd 17.12.2008 23:54
Ответ принят как подходящий

Как насчет этого: Сохраните XML как свой фрагмент:

<fragment type = "link_img_caption">
  <link href = "%PANELLINK%" />
  <img src = "%PANELIMAGE%" style = "%IMAGESTYLE%" />
  <caption text = "%CAPTIONTEXT%" />
</fragment>

Вытащите его, замените заполнители на "настоящие" строки (которые вы, конечно, тщательно экранировали с помощью XML),

... и используйте простое преобразование XML для вывода HTML:

<xsl:stylesheet version = "1.0" xmlns:xsl = "http://www.w3.org/1999/XSL/Transform">
  <xsl:output method = "html" version = "4.0" encoding = "iso-8859-1" indent = "yes"/>

  <xsl:template match = "/">
    <xsl:apply-templates select = "fragment" />
  </xsl:template>

  <xsl:template match = "fragment[@type = 'link_img_caption']">
    <xsl:choose>
      <xsl:when test = "link[@href != '']">
        <a href = "{link/@href}" target = "_blank">
          <img src = "{img/@src}" style = "{img/@style}" border = "0" />
        </a>
      </xsl:when>
      <xsl:otherwise>
        <img src = "{img/@src}" style = "{img/@style}" border = "0" />
      </xsl:otherwise>
    </xsl:choose>
    <xsl:if test = "caption[@text !='']">
      <br />
      <xsl:value-of select = "caption/@text" />
    </xsl:if>
  </xsl:template>

</xsl:stylesheet>

Другие типы фрагментов могут быть добавлены из-за атрибута type. Есть много возможностей для улучшения этого, поэтому посмотрите на это как на пример того, как это сделать мог.

Выход:

<a href = "%PANELLINK%" target = "_blank">
  <img src = "%PANELIMAGE%" style = "%IMAGESTYLE%" border = "0">
</a>
<br>
%CAPTIONTEXT%

и, если ссылка href в XML пуста:

<img src = "%PANELIMAGE%" style = "%IMAGESTYLE%" border = "0">
<br>
%CAPTIONTEXT%

Это похоже на то, что могло бы сработать, хотя а) xslt не очень удобен для написания веб-разработчиком b) я предполагаю, что мне потребуется два или три дня, чтобы адаптировать его к моей ситуации c) может ли xslt выводить полный html, включая доктайп?

Ian Boyd 18.12.2008 00:33

Потому что, хотя я знаком с xslt, я не настолько хорошо разбираюсь в том, что вы написали, - а теперь получасовое изменение происходит на третьем часе.

Ian Boyd 18.12.2008 00:34

Похоже, вы нуждаетесь в общем решении, и это самое общее решение для этой задачи. В зависимости от вашей кодовой базы, это займет время для реализации, тем более что вы, кажется, относительно новичок в XSLT. Да, и да, XSLT также может выводить типы документа, если вы ему это скажете.

Tomalak 18.12.2008 00:45

Хотя я не буду использовать это в данном случае - поскольку у меня нет времени изучать весь XSLT, вероятно, это хорошее решение в целом.

Ian Boyd 19.12.2008 19:56

Я бы использовал Набор инструментов для шаблонов, к сожалению, в настоящее время он реализован только в Perl и Python.

test.pl:

use Template;

my $template = Template->new({
  VARIABLES => {
    ImageStyle  => "default",
    CaptionText => "Place Caption Here"
  },
});

$template->process( 'test.tt', {
    panel => {
      link  => "http://Stackoverflow.com/",
      image => "/Content/Img/stackoverflow-logo-250.png",
      alt   => "logo link to homepage"
    }
} );

test.tt:


[% IF panel.link -%]
<A href = "[% panel.link %]" alt = "[% panel.alt %]" target = "_blank">
[%- END -%]

[%- IF panel.image -%]
   <IMG border = "0" src = "[% panel.image %]" style = "[% ImageStyle %]">
[%- END -%]

[%- IF panel.link %]</A>[% END %]<BR>
[% CaptionText %]

Выходы:

<A href = "http://Stackoverflow.com/" alt = "logo link to homepage" target = "_blank">
   <IMG border = "0" src = "/Content/Img/stackoverflow-logo-250.png" style = "default">
</A><BR>
Place Caption Here

Если переменная panel.link не определена, теги привязки пропускаются.

   <IMG border = "0" src = "/Content/Img/stackoverflow-logo-250.png" style = "default">
<BR>
Place Caption Here

Я не могу заставить это выделить так, как я хочу.

Brad Gilbert 25.12.2008 00:00

Используйте шаблонизатор, например эти.

Шаблоны - это серьезный запах кода. Посмотрите, как Seaside генерирует html.

[Edit] Еще один, где кто-то без понятия проголосовал против.

Что ж, ваш ответ немного краток, вы можете подробно рассказать, что это DSL, шаблон компоновщика, что на нем работают рефакторинги и т. д. :)

Damien Pollet 26.04.2009 00:07

Другие вопросы по теме