| X:stylesheet { | 
 |  | 
 | X:output method="text" encoding="koi8-r"; | 
 |  | 
 | X:param lang="'en'"; | 
 | X:param configuration="'../xml/change_log_conf.xml'"; | 
 |  | 
 | X:var conf = "document($configuration)/configuration"; | 
 | X:var start = "$conf/start"; | 
 | X:var indent = "$conf/indent"; | 
 | X:var max = "$conf/length"; | 
 | X:var br = {<br>} | 
 |  | 
 |  | 
 | X:template = "/" { !! "change_log"; } | 
 | X:template = "change_log" { !! "changes"; } | 
 |  | 
 |  | 
 | X:template = "changes" { | 
 |     X:text {
} | 
 |  | 
 |     !{substring(concat($conf/changes[@lang=$lang]/title, | 
 |                        //change_log/@title, | 
 |                        ' ', @ver, | 
 |                        '                                                    '), | 
 |                 1, $conf/changes[@lang=$lang]/length)} | 
 |  | 
 |     X:if "$lang='ru'" { !{@date} } | 
 |  | 
 |     X:if "$lang='en'" { | 
 |         !{substring(@date, 1, 2)} | 
 |         !{$conf/changes[@lang=$lang]/month[number(substring(current()/@date, | 
 |                                                             4, 2))]} | 
 |         !{substring(@date, 7, 4)} | 
 |     } | 
 |  | 
 |     X:text {
} | 
 |  | 
 |     !! "change"; | 
 |  | 
 |     X:text {
} | 
 | } | 
 |  | 
 |  | 
 | X:template = "change" { | 
 |     X:var prefix = "$conf/changes[@lang=$lang]/*[local-name(.)=current()/@type]" | 
 |  | 
 |     X:var postfix = { X:if "$prefix" { X:text {: } } } | 
 |  | 
 |     !! "para[@lang=$lang]" (prefix = "concat($start, $prefix, $postfix)"); | 
 | } | 
 |  | 
 |  | 
 | X:template para(prefix) = "para" { | 
 |     X:var text = { !!; } | 
 |  | 
 |     X:text {
} | 
 |  | 
 |     !wrap(text = "normalize-space($text)", | 
 |           prefix = { X:if "position() = 1" { !{$prefix} } else { !{$indent} } }) | 
 | } | 
 |  | 
 |  | 
 | X:template wrap(text, prefix) { | 
 |     X:if "$text" { | 
 |         X:var offset = { | 
 |             X:if "starts-with($text, concat($br, ' '))" { | 
 |                 !{string-length($br) + 2} | 
 |             } else { | 
 |                 1 | 
 |             } | 
 |         } | 
 |  | 
 |         X:var length = { | 
 |             !length(text = "substring($text, $offset)", | 
 |                     prefix = "string-length($prefix)", | 
 |                     length = "$max") | 
 |         } | 
 |  | 
 |         !{$prefix} | 
 |  | 
 |         !{translate(substring($text, $offset, $length), ' ', ' ')} | 
 |  | 
 |         X:text {
} | 
 |  | 
 |         !wrap(text = "substring($text, $length + $offset)", prefix = "$indent") | 
 |     } | 
 | } | 
 |  | 
 |  | 
 | X:template length(text, prefix, length) { | 
 |     X:var break = "substring-before(substring($text, 1, $length - $prefix), | 
 |                                     $br)" | 
 |  | 
 |     X:choose { | 
 |         X:when "$break" { !{string-length($break)} } | 
 |  | 
 |         X:when "$length = 0" { !{$max} } | 
 |  | 
 |         X:when "string-length($text) + $prefix <= $length | 
 |                 or substring($text, $length - $prefix, 1) = ' '" | 
 |         { | 
 |             !{$length - $prefix} | 
 |         } | 
 |  | 
 |         X:otherwise { | 
 |             !length(text = "$text", prefix = "$prefix", length = "$length - 1") | 
 |         } | 
 |     } | 
 | } | 
 |  | 
 |  | 
 | X:template = "at" {@} | 
 | X:template = "br" { !{$br} } | 
 | X:template = "nobr" { !{translate(., ' ', ' ')} } | 
 |  | 
 |  | 
 | } |