==i-common.xsl

===Описание
Модуль с разнообразными общими функциями и шаблонами.

{{TOC}}

===$lego:id
Переменная ##$lego:id## содержит id проекта. Задается через ((../../../params.wiki lego:params)).

===$lego:locale
Переменная ##$lego:locale## содержит текущую локаль. Дефолтное значение -- ##ru##.
Для того, чтобы выставить у себя другую локаль, нужно переопределить этот шаблон:
%%(html)
<xsl:template match="/" mode="lego:locale">
    <xsl:text>ru</xsl:text> <!-- возможные варианты: ru, uk, en -->
</xsl:template>
%%
Помимо этого нужно озаботиться подключением ##i-locale.xsl## и подключением проектного xml'я в нужной локали. См. ((../../../localization.wiki Локализация)).

===lego:params()
Функция-обертка над ##$lego:params## -- в данный момент не используется, но потенциально нужна для использования в атрибутах ##match##.
%%(html)
<!-- гипотетический код -->
<xsl:template match="lego:b-head-userinfo[lego:params()/lego:index]">
   ...
</xsl:template>
%%

===lego:auth()
Функция-обертка над ##$lego:params/lego:login## -- используется для того, чтобы использовать в атрибутах ##match##:
%%(html)
<xsl:template match="lego:b-head-userinfo">
   <!-- сделать что-то для незалогиненного юзера -->
</xsl:template>

<xsl:template match="lego:b-head-userinfo[lego:auth()]">
   <!-- сделать что-то для залогиненного юзера -->
</xsl:template>
%%
Тем самым мы блюдем чистоту стандартов и не используем переменные в ##match##'ах :)

===lego:name()
Внутренняя функция, используется для получения имени независимого блока или вложенного элемента. Возращает строку типа ##b-suggest## или ##b-head-userinfo.user##.

===lego:is-block()
Внутренняя функция. Возвращает ##true##, если блок является независимым.

===lego:css
%%(html)
<xsl:call-template name="lego:css">
    <xsl:with-param name="css" select="'/css/video'"/>
</xsl:call-template>
%%

На выходе:
%%(html)
    <meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7"/>
    <!--[if gt IE 7]><!--><link rel="stylesheet" href="/css/video.css"/><!--<![endif]-->
    <!--[if lt IE 8]><link rel=stylesheet href="/css/video.ie.css"><![endif]-->
%%

Можно указать несколько стилей через запятую:
%%(html)
<xsl:call-template name="lego:css">
    <xsl:with-param name="css" select="'/css/video, /css/page.index'"/>
</xsl:call-template>
%%

На выходе:
%%(html)
    <meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7"/>
    <!--[if gt IE 7]><!--><link rel="stylesheet" href="/css/video.css"/><!--<![endif]-->
    <!--[if lt IE 8]><link rel=stylesheet href="/css/video.ie.css"><![endif]-->
    <!--[if gt IE 7]><!--><link rel="stylesheet" href="/css/page.index.css"/><!--<![endif]-->
    <!--[if lt IE 8]><link rel=stylesheet href="/css/page.index.ie.css"><![endif]-->
%%

По-умолчанию, вначале выводится ##<meta>## для IE. Если необходимо вызывать шаблон несколько раз, то во всех вызовах, кроме первого, можно передать параметр ##lego:meta## со значением ##false()##:
%%(html)
<xsl:call-template name="lego:css">
    <xsl:with-param name="css" select="'/css/video'"/>
    <xsl:with-param name="meta" select="false()"/>
</xsl:call-template>
%%

===lego:js
%%(html)
<xsl:call-template name="lego:js">
    <xsl:with-param name="js" select="'/js/video.js'"/>
    <xsl:with-param name="charset" select="'utf-8'"/> <!-- дефолтное значение: utf-8 -->
</xsl:call-template>
%%

На выходе:
%%(html)
<script type="text/javascript" charset="utf-8" src="/js/video.js"/>
%%

Можно указать несколько файлов через запятую:
%%(html)
<xsl:call-template name="lego:js">
    <xsl:with-param name="js">/js/video.js, /js/jquery.js</xsl:with-param>
</xsl:call-template>
%%

===lego:js-inline
%%(html)
<xsl:call-template name="lego:js-inline">
    <xsl:with-param name="js">init();</xsl:with-param>
</xsl:call-template>
%%

На выходе:
%%(html)
<script type="text/javascript">init();</script>
%%


===lego:init
Дефолтный init для лего-проекта:
%%(html)
<head>
    <xsl:apply-templates select="/" mode="lego:init"/>
</head>
%%
Шаблон должен вызываться первым в <head> для корректной работы меты, эмулирующей IE7 в IE8.

Шаблон определен следующим образом:
%%(html)
<xsl:template match="/" mode="lego:init">
    <xsl:apply-templates select="." mode="lego:css-include"/>
    <xsl:apply-templates select="." mode="lego:favicon"/>
    <xsl:apply-templates select="." mode="lego:js-include"/>
    <xsl:apply-templates select="." mode="lego:js-init"/>
</xsl:template>
%%

====lego:css-include
Шаблон подключает проектные стили. Если, скажем, id проекта это ##video##, то будут подключены файлы ##/css/_video.css## и ##/css/_video.ie.css##. Для продакшена это будут статически собранные файлы, а для девелоперского окружения нужно настроить динамическую сборку через ((../../../ycssjs.wiki fastcgi-модуль)).

====lego:favicon
Шаблон подключает favicon

====lego:js-include
Шаблон подключает три js-файла:
  * jQuery соответствующей версии. Путь к jquery можно переопределить через ##$lego:params/lego:js-jquery##.
  * Леговский common.js. Путь к нему можно переопределить через ##$lego:params/lego:js-common##.
  * Проектный js-файл. Если, например, id проекта это ##video##, то будет подключен файл ##/js/_video.js##. См. выше про ##lego:css-init##.

====lego:js-init
Шаблон генерит вызов функции ##Lego.init()## с нужными параметрами.

===lego:apply
Шоткат для обработки динамически сгенеренного xml'я:
%%(html)
<xsl:call-template name="lego:apply">
    <xsl:with-param name="content">
        <lego:b-userpic login="alpha-san" type="small"/>
    </xsl:with-param>
</xsl:call-template>
%%

===mode="lego:copy"
Identity transform
%%(html)
<xsl:template match="lego:item" mode="lego:content">
    <xsl:apply-templates mode="lego:copy"/>
</xsl:template>
%%
Мода копирует xml в выходное дерево.

===lego:child-node()
Функция для динамической генерации child-нод в текущем контексте.

Пример. Пусть есть вот такой xml:
%%(html)
<lego:b-head-search/>
%%

И мы накладываем на него вот такой xsl:
%%(html)
<xsl:template match="lego:b-head-search">
    <form>
        <xsl:apply-templates select="." mode="lego:class"/>
        <xsl:apply-templates select="lego:child-node('input, button')"/>
        ...
    </form>
</xsl:template>

<xsl:template match="lego:b-head-search/input">
    <input>
        <xsl:apply-templates select="." mode="lego:class"/>
        ...
    </input>
</xsl:template>

<xsl:template match="lego:b-head-search/button">
    <button>
        <xsl:apply-templates select="." mode="lego:class"/>
        ...
    </button>
</xsl:template>
%%
Даже если в элементе ##lego:b-head-search## не содержатся элементы ##input## и ##button##, можно будет заматчиться на ##lego:b-head-search/input## и ##lego:b-head-search/button##.
Функция используется при "недостатке контекста" -- когда хочется разделить код на более мелкие шаблоны, но нет подходящих нод, чтобы на них заматчиться. При этом использование мод нежелательно. Например, в этом примере во всех трех шаблонах используется ##<xsl:apply-templates select="." mode="lego:class"/>##. Если бы мы не меняли контекст, а использовали бы моды, то были бы проблемы:
%%(html)
<xsl:template match="lego:b-head-search">
    <form>
        <xsl:apply-templates select="." mode="lego:class"/>
        <xsl:apply-templates select="." mode="input"/>
        <xsl:apply-templates select="." mode="button"/>
        ...
    </form>
</xsl:template>

<xsl:template match="lego:b-head-search" mode="input">
    <input>
        <xsl:apply-templates select="." mode="lego:class"/> <!-- !!! проблема -->
        ...
    </input>
</xsl:template>

<xsl:template match="lego:b-head-search" mode="button">
    <button>
        <xsl:apply-templates select="." mode="lego:class"/> <!-- !!! проблема -->
        ...
    </button>
</xsl:template>
%%
Тут все ##<xsl:apply-templates select="." mode="lego:class"/>## попадут в один контекст -- не то поведение, что было нужно.

