• Техногрет
  • HTML и CSSXSLTJavaScriptИзображенияСофтEtc
    Андрей Шитов

    Типографика на основе XSLT 1 апреля 2007


     
    Задача. Рассказать о новом подходе к быстрому типографированию текста на вебе.

    На всех новых сайтах, которые делают в студии, автоматически расставляется типографика в текстах новостей, статей и публикаций. Существует как минимум четыре варианта программ-типографов, написанных на перле, яваскрипте, парсере и Си++. Чтобы не отстать от современных тенденций, мы включили в этот комплект новый типограф, применяющий XSLT-преобразования.


    Подготовка текста
    Необработанный исходный текст вначале преобразуют в XML-формат, это легко сделать несложной вспомогательной утилитой. Данные, поступающие на вход XSLT-процессора, выглядят так:

    <?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()) &lt; 3]">
                <xsl:text disable-output-escaping="yes">&amp;#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">&amp;#171;</xsl:text>
    </xsl:template>
    
    <xsl:template match="quote[preceding-sibling::*[1][name() = 'word']]">
        <xsl:text disable-output-escaping="yes">&amp;#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-преобразований рекомендуется к внедрению на высоконагруженных серверах.