X:stylesheet {

X:output method="text";

X:param format="'generic'";
X:param pkgname="'nginx'";
X:param versionmask="'0'";
X:param configuration="'change_log_conf.xml'";

X:var conf = "document($configuration)/configuration";

X:var start = {
    X:choose {
        X:when "$format='rpm'" {
            !{$conf/rpm/start}
        }
        X:when "$format='deb'" {
            !{$conf/deb/start}
        }
        X:when "$format='generic'" {
            !{$conf/generic/start}
        }
    }
}

X:var indent = {
    X:choose {
        X:when "$format='rpm'" {
            !{$conf/rpm/indent}
        }
        X:when "$format='deb'" {
            !{$conf/deb/indent}
        }
        X:when "$format='generic'" {
            !{$conf/generic/indent}
        }
    }
}

X:var max = {
    X:choose {
        X:when "$format='rpm'" {
            !{$conf/rpm/length}
        }
        X:when "$format='deb'" {
            !{$conf/deb/length}
        }
        X:when "$format='generic'" {
            !{$conf/generic/length}
        }
    }
}

X:var br = {&lt;br&gt;}


X:template = "/" { !! "change_log"; }
X:template = "change_log" { !! "changes"; }


X:template = "changes" {
    X:var pday = { !padded_day(date="@date") }
    X:var dow = { !day_of_week(date="@date") }
    X:var apply = { !string_in_list(list="@apply", string="$pkgname") }

    X:var _pkgs = {}

    X:var basever_t = {
        X:choose {
            X:when "position()=1 and $versionmask='1'" {%%TARGET_VERSION%%}
            X:otherwise { !{@basever} }
        }
    }

    X:var ver_t = {
        X:choose {
            X:when "position()=1 and $versionmask='1' and $pkgname='nginx'" {%%BASE_VERSION%%}
            X:when "position()=1 and $versionmask='1' and $pkgname!='nginx'" {%%MODULE_VERSION%%}
            X:otherwise { !{@ver} }
        }
    }

    X:var rev_t = {
        X:choose {
            X:when "position()=1 and $versionmask='1' and $pkgname='nginx'" {%%BASE_RELEASE%%}
            X:when "position()=1 and $versionmask='1' and $pkgname!='nginx'" {%%MODULE_RELEASE%%}
            X:otherwise { !{@rev} }
        }
    }

    X:var ver_ = {
        X:choose {
            X:when "@basever = '0'" { !{$ver_t} }
            X:otherwise {
                X:choose {
                    X:when "@basever = @ver" { !{$ver_t} }
                    X:otherwise { !{concat($basever_t, '+', @ver) } }
                }
            }
        }
    }

    X:choose {
    X:when "$pkgname='nginx' and $format='generic' and @rev!=1" {}
    X:otherwise {
    X:if "$apply=$pkgname" {

    X:if "$format='generic'" {
        X:text {&#10;}

        !{substring(concat($conf/changes/title,
                           $pkgname,
                           ' ', @ver,
                           '                                                    '),
                    1, $conf/changes/length)}

        !{substring(@date, 9, 2)}
        !{$conf/changes/month[number(substring(current()/@date,
                                                            6, 2))]}
        !{substring(@date, 1, 4)}
    }

    X:if "$format='rpm'" {
        !{concat('* ', $conf/changes/day[number($dow)],
                 $conf/changes/month[number(substring(current()/@date, 6, 2))],
                 $pday, ' ',
                 substring(@date, 1, 4), ' ', @packager, ' - ',
                 $ver_, '-', $rev_t, '%{?dist}.ngx')}
    }

    X:if "$format='deb'" {
        !{concat($pkgname, ' (', $ver_, '-', $rev_t,
                 '~%%CODENAME%%) %%CODENAME%%; urgency=low')}

        X:text {&#10;}
    }

    X:text {&#10;}

    !! "change";

    X:text {&#10;}

    X:if "$format='deb'" {
        !{concat(' -- ', @packager, '  ',
                 $conf/changes/day[number($dow)], ', ',
                 $pday,
                 $conf/changes/month[number(substring(current()/@date, 6, 2))],
                 substring(@date, 1, 4), ' ', @time)}

        X:text {&#10;}
        X:text {&#10;}
    }
    }
    }
    }
}


X:template = "change" {
    X:var prefix = "$conf/changes/*[local-name(.)=current()/@type]"

    X:var postfix = { X:if "$prefix" { X:text {: } } }

    !! "para" (prefix = "concat($start, $prefix, $postfix)");
}


X:template para(prefix) = "para" {
    X:var text = { !!; }

    X:if "$format='generic'" {
        X:text {&#10;}
    }

    !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:choose {
                X:when "starts-with($text, concat($br, ' '))" {
                    !{string-length($br) + 2}
                }
                X:when "starts-with($text, $br)" {
                    !{string-length($br) + 1}
                }
                X:otherwise {
                    1
                }
            }
        }

        X:var length = {
            !length(text = "substring($text, $offset)",
                    prefix = "string-length($prefix)",
                    length = "$max")
        }

        !{$prefix}

        !{normalize-space(translate(substring($text, $offset, $length),
                                    '&#xA0;', ' '))}

        X:text {&#10;}

        !wrap(text = "substring($text, $length + $offset)", prefix = "$indent")
    }
}


X:template length(text, prefix, length) {
    X:var break = "substring-before(substring($text, 1,
                                    $length - $prefix + string-length($br)),
                                    $br)"

    X:choose {
        X:when "$break" { !{string-length($break)} }

        X:when "$length = 0" { !{$max - $prefix} }

        X:when "string-length($text) + $prefix &lt;= $length" {
            !{$length - $prefix}
        }

        X:when "substring($text, $length - $prefix + 1, 1) = ' '" {
            !{$length - $prefix + 1}
        }

        X:otherwise {
            !length(text = "$text", prefix = "$prefix", length = "$length - 1")
        }
    }
}


X:template day_of_week(date) {
    X:param year = "substring-before($date, '-')";
    X:param month = "substring-before(substring-after($date, '-'), '-')";
    X:param day = "substring-after(substring-after($date, '-'), '-')";

    X:var a = "floor((14 - $month) div 12)";

    X:var y = "$year - $a";

    X:var m = "$month + 12 * $a - 2";

    !{($day + $y + floor($y div 4) - floor($y div 100)
    + floor($y div 400) + floor((31 * $m) div 12)) mod 7 + 1}
}


X:template padded_day(date) {
    !{substring(concat('  ', format-number(substring($date, 9, 2), '##')),
           1 + string-length(format-number(substring($date, 9, 2), '##')))}
}


X:template string_in_list(list, string) {
    X:choose {
        X:when "contains($list, ' ')" {
            X:var str = "substring-before($list, ' ')";
            X:choose {
                X:when "$str=$string" {
                    !{$string}
                }
                X:otherwise {
                    !string_in_list(list="substring-after($list, ' ')",
                                    string="$string")
                }
            }
        }
        X:otherwise {
            X:if "$list=$string" { !{$string} }
            X:if "$list='*'" { !{$string} }
        }
    }
}


X:template = "at" {@}
X:template = "br" { !{$br} }
X:template = "nobr" { !{translate(., ' ', '&#xA0;')} }


}
