![]() | Андрей Шитов
Типографика на основе XSLT 1 апреля 2007 |
![]() | Задача. | Рассказать о новом подходе к быстрому типографированию текста на вебе. | ![]() |
![]() | ![]() |
На всех новых сайтах, которые делают в студии, автоматически расставляется типографика в текстах новостей, статей и публикаций. Существует как минимум четыре варианта программ-типографов, написанных на перле, яваскрипте, парсере
Подготовка текста
Необработанный исходный текст вначале преобразуют
<?xml version="1.0" encoding="UTF-8"?> <text> <paragraph> <quote type="double"/> <word caps="first">Многие</word> <space/> <word>люди</word> <space/> <word>получают</word> <space/> <word>удовольствие</word> <space/> <word type="preposition">от</word> <space/> <word>прямого</word> <space/> <word>контакта</word> <space/> <word type="preposition">с</word> <space/> <word>электрическими</word> <space/> <word>сетями</word> <space/> <word>общего</word> <space/> <word>пользования</word> <quote type="double"/> <punctuation type="fullstop"/> </paragraph> <paragraph> <word caps="first">Обычно</word> <space/> <word type="preposition">для</word> <space/> <word>этих</word> <space/> <word>целей</word> <space/> <word>используются</word> <space/> <word> <part caps="first">П</part> <part>образные</part> </word> <space/> <word>фрагменты</word> <space/> <word>неизолированного</word> <space/> <word>провода</word> <punctuation type="fullstop"/> </paragraph> </text>
Код XSLT-типографа
XSLT исключительно удачно подходит для описания правил типографики любого языка. Мало того, у программиста существует возможность выбирать между двумя подходами — записывать правила в виде XPath-выражений непосредственно в атрибуте match шаблонов, либо воспользоваться конструкциями xsl:choose и xsl:if.
Фрагмент XSLT-файла с правилами типографики для русского языка показан ниже.
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output encoding="UTF-8" method="html" /> <xsl:template match="/text"> <xsl:apply-templates select="paragraph"/> </xsl:template> <xsl:template match="paragraph"> <p> <xsl:apply-templates select="word | space | punctuation | quote"/> </p> </xsl:template> <xsl:template match="word[not (part)]"> <xsl:value-of select="text()"/> </xsl:template> <xsl:template match="word[part]"> <nobr> <xsl:for-each select="part"> <xsl:value-of select="text()"/> <xsl:if test="position() != last()"> <xsl:text>-</xsl:text> </xsl:if> </xsl:for-each> </nobr> </xsl:template> <xsl:template match="space"> <xsl:choose> <xsl:when test="preceding-sibling::word[1][string-length (text()) < 3]"> <xsl:text disable-output-escaping="yes">&#160;</xsl:text> </xsl:when> <xsl:otherwise> <xsl:text> </xsl:text> </xsl:otherwise> </xsl:choose> </xsl:template> <xsl:template match="quote[following-sibling::*[1][name() = 'word']]"> <xsl:text disable-output-escaping="yes">&#171;</xsl:text> </xsl:template> <xsl:template match="quote[preceding-sibling::*[1][name() = 'word']]"> <xsl:text disable-output-escaping="yes">&#187;</xsl:text> </xsl:template> <xsl:template match="quote"> <xsl:choose> <xsl:when test="@type = 'double'"> <xsl:text>"</xsl:text> </xsl:when> <xsl:otherwise> <xsl:text>'</xsl:text> </xsl:otherwise> </xsl:choose> </xsl:template> <xsl:template match="punctuation[@type = 'fullstop']"> <xsl:text>.</xsl:text> </xsl:template> <xsl:template match="punctuation[@type = 'comma']"> <xsl:text>,</xsl:text> </xsl:template> </xsl:stylesheet>
Желающие легко убедятся в работоспособности предложенного подхода, используя показанные примеры, а при необходимости — самостоятельно дополнят набор правил.
Автоматическое типографирование текстов на основе XSLT-преобразований рекомендуется к внедрению на высоконагруженных серверах.
© 19952023 Студия Артемия Лебедева
|