<?xml version="1.0" encoding="UTF-8"?>
<!--
  ~ Licensed to the Apache Software Foundation (ASF) under one or more
  ~ contributor license agreements.  See the NOTICE file distributed with
  ~ this work for additional information regarding copyright ownership.
  ~ The ASF licenses this file to you under the Apache License, Version 2.0
  ~ (the "License"); you may not use this file except in compliance with
  ~ the License.  You may obtain a copy of the License at
  ~
  ~ http://www.apache.org/licenses/LICENSE-2.0
  ~
  ~ Unless required by applicable law or agreed to in writing, software
  ~ distributed under the License is distributed on an "AS IS" BASIS,
  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  ~ See the License for the specific language governing permissions and
  ~ limitations under the License.
  -->

<!-- Content Stylesheet for "jmeter-site" -->

<!DOCTYPE xsl:stylesheet [
  <!ENTITY copy  "&#x000A9;">
  <!ENTITY nbsp  "&#160;">
  <!ENTITY ndash "&#x02013;">
  <!ENTITY para  "&#x000B6;">
  <!ENTITY rarr  "&#x02192;">
  <!ENTITY trade "&#x02122;">
]>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  version="3.0"
>

  <!-- Defined parameters (overrideable) -->
  <xsl:param name="relative-path" select="'.'" />
  <xsl:param name="subdir" select="''" />
  <xsl:param name="imgdir" select="concat($relative-path, '/images')" />
  <xsl:param name="sshotdir" select="concat($imgdir, '/screenshots')" />
  <xsl:param name="cssdir" select="concat($relative-path, '/css')" />
  <xsl:param name="apidir" select="concat($relative-path, '/api')" />
  <xsl:param name="jakarta-site" select="'https://jakarta.apache.org'" />
  <xsl:param name="year" select="'2023'" />
  <xsl:param name="max-img-width" select="'600'" />

  <!-- Output method -->
  <xsl:output method="html" html-version="5.0" encoding="iso-8859-15"
    indent="yes" doctype-system="about:legacy-compat" />

  <xsl:template match="document">
    <xsl:variable name="project" select="document('project.xml')/project" />
    <html lang="en">
      <head>
        <title>
          <xsl:value-of select="$project/title" />
          -
          <xsl:value-of select="properties/title" />
        </title>
        <xsl:for-each select="properties/author">
          <xsl:variable name="name">
            <xsl:value-of select="." />
          </xsl:variable>
          <xsl:variable name="email">
            <xsl:value-of select="@email" />
          </xsl:variable>
          <meta name="author" value="{$name}" />
          <meta name="email" value="{$email}" />
        </xsl:for-each>
        <!-- VIEWPORT -->
        <meta name="viewport" content="width=device-width, initial-scale=1" />
        <link
          href='https://fonts.googleapis.com/css?family=Merriweather:400normal'
          rel='stylesheet' type='text/css'
        ></link>
        <link
          href="https://maxcdn.bootstrapcdn.com/font-awesome/4.6.1/css/font-awesome.min.css"
          rel="stylesheet" type='text/css'
        ></link>
        <link rel="stylesheet" type="text/css"
          href="{concat($cssdir, '/new-style.css')}"
        ></link>
        <link rel="apple-touch-icon-precomposed" href="{$imgdir}/apple-touch-icon.png"></link>
        <link rel="icon" href="{$imgdir}/favicon.png"></link>
        <meta name="msapplication-TileColor" content="#ffffff" />
        <meta name="msapplication-TileImage" content="{$imgdir}/mstile-144x144.png" />
        <meta name="theme-color" content="#ffffff" />
      </head>
      <body role="document">
        <a href="#content" class="hidden" >Main content</a>
        <div class="header">
          <xsl:comment>
            APACHE LOGO
          </xsl:comment>
          <div>
            <a href="https://www.apache.org">
              <img title="Apache Software Foundation" class="asf-logo logo"
                  src="{$imgdir}/asf-logo.svg" alt="Logo ASF" />
            </a>
          </div>
          <xsl:if test="$project/logo">
            <xsl:variable name="alt">
              <xsl:value-of select="$project/logo" />
            </xsl:variable>
            <xsl:variable name="home">
              <xsl:value-of select="$project/@href" />
            </xsl:variable>
            <xsl:variable name="src">
              <xsl:value-of
                select="concat($relative-path, $project/logo/@href)" />
            </xsl:variable>
            <xsl:comment>
              PROJECT LOGO
            </xsl:comment>
            <div>
              <a href="{$home}">
                <img class="logo" src="{$src}" alt="{$alt}"/>
              </a>
            </div>
          </xsl:if>
          <div class="banner">
            <a href="https://www.apache.org/events/current-event.html">
              <img src="https://www.apache.org/events/current-event-234x60.png" alt="Current Apache event teaser" />
            </a>
            <div class="clear"></div>
          </div>
        </div>
        <div class="nav">
            <xsl:apply-templates select="$project/body/menu" />
        </div>
        <div class="main" id="content">
          <xsl:call-template name="social-media-links" />
          <xsl:call-template name="pagelinks" />
          <xsl:if test="@index">
            <xsl:call-template name="section-index" />
          </xsl:if>
          <xsl:apply-templates select="body/section"></xsl:apply-templates>
          <xsl:call-template name="pagelinks" />
          <xsl:call-template name="share-links" />
          <a href="#top" id="topButton">Go to top</a>
        </div>
        <div class="footer">
          <div class="copyright">
            Copyright &copy;
            1999 &ndash;
            <xsl:value-of select="$year" />
            , Apache Software Foundation
          </div>
          <div class="trademarks">Apache, Apache JMeter, JMeter, the Apache
            feather, and the Apache JMeter logo are
            trademarks of the
            Apache Software Foundation.
          </div>
        </div>
        <script><![CDATA[(function(){
            "use strict";
            // enable 'go to top' button functionality
            document.addEventListener('scroll', function() {
                if (document.body.scrollTop > 500 || document.documentElement.scrollTop > 500) {
                    document.getElementById("topButton").style.display = "block";
                } else {
                    document.getElementById("topButton").style.display = "none";
                }
            });
            // fill in the current location into social links on this page.
            var as = document.getElementsByTagName('a');
            var loc = document.location.href;
            if (!loc.toLowerCase().startsWith('http')) {
                return;
            }
            for (var i=0; i<as.length; i++) {
                var href = as[i].getAttribute('data-social-url');
                if (href !== null) {
                    as[i].href = href + encodeURIComponent(loc);
                }
            }
        })();]]></script>
      </body>
    </html>
  </xsl:template>

  <xsl:template name="social-media-links">
    <div class="social-media">
      <ul class="social-media-links">
        <li class="twitter"><a href="https://twitter.com/ApacheJMeter" title="Follow us on Twitter"><i class="fa fa-twitter" aria-hidden="true"></i>Twitter</a></li>
        <li class="github"><a href="https://github.com/apache/jmeter" title="Fork us on github"><i class="fa fa-github" aria-hidden="true"></i>github</a></li>
      </ul>
    </div>
  </xsl:template>

  <xsl:template name="share-links">
    <div class="share-links">
      Share this page:
      <ul>
        <li class="fb"><a data-social-url="https://facebook.com/sharer/sharer.php?u=" title="Share on facebook"><i class="fa fa-facebook" aria-hidden="true"></i>share</a></li>
        <li class="twitter"><a data-social-url="https://twitter.com/intent/tweet?url=" title="Tweet on twitter"><i class="fa fa-twitter" aria-hidden="true"></i>tweet</a></li>
      </ul>
    </div>
  </xsl:template>

  <xsl:template name="pagelinks">
    <xsl:if test="@prev or @next">
      <ul class="pagelinks">
        <xsl:if test="@prev">
          <li>
            <a href="{@prev}">&lt; Prev</a>
          </li>
        </xsl:if>
        <li>
          <a href="{concat($relative-path, '/index.html')}">Index</a>
        </li>
        <xsl:if test="@next">
          <li>
            <a href="{@next}">Next &gt;</a>
          </li>
        </xsl:if>
      </ul>
    </xsl:if>
  </xsl:template>

  <xsl:template name="section-index">
    <ul class="section-index">
      <xsl:for-each select="body/section">
        <li>
          <a href="#{@anchor}">
            <xsl:value-of select="@name" />
          </a>
          <ul>
            <xsl:for-each select="component">
              <li>
                <a href="#{translate(normalize-space(@name), ' ', '_')}">
                  <xsl:value-of select="@name" />
                  <xsl:if test="@was">
                    (was:
                    <xsl:value-of select="@was" />
                    )
                  </xsl:if>
                </a>
              </li>
            </xsl:for-each>
          </ul>
        </li>
      </xsl:for-each>
    </ul>
  </xsl:template>

  <xsl:template name="image">
    <xsl:param name="srcdir" />
    <xsl:param name="image" />
    <xsl:param name="width" />
    <xsl:param name="height" />
    <xsl:param name="alt" />
    <xsl:variable name="name" select="concat($srcdir, '/', $image)" />
    <a href="{$name}"><img src="{$name}" width="{$width}" height="{$height}" alt="{$alt}" /></a>
  </xsl:template>

  <!-- Process a menu for the navigation bar -->
  <xsl:template match="menu">
    <ul class="menu">
      <li onClick="return true">
        <div class="menu-title">
          <xsl:value-of select="@name" />
        </div>
        <ul>
          <xsl:apply-templates select="item" />
        </ul>
      </li>
    </ul>
  </xsl:template>

  <!-- Process a menu item for the navigation bar -->
  <xsl:template match="item">
    <xsl:variable name="href">
      <xsl:choose>
        <xsl:when test="starts-with(@href, 'http')">
          <xsl:value-of select="@href" />
        </xsl:when>
        <xsl:when test="starts-with(@href, '/site')">
          <xsl:value-of select="concat($jakarta-site, @href)" />
        </xsl:when>
        <xsl:otherwise>
          <xsl:value-of select="concat($relative-path, @href)" />
        </xsl:otherwise>
      </xsl:choose>
    </xsl:variable>
    <li>
      <a href="{$href}">
        <xsl:value-of select="@name" />
        <xsl:if test="@icon">
          <img src="{concat($imgdir, '/', @icon)}" alt="{concat('Icon for ', @name)}"/>
        </xsl:if>
      </a>
    </li>
  </xsl:template>

  <xsl:template match="section">
    <div class="section">
      <h1>
        <xsl:if test="@anchor">
          <xsl:attribute name="id">
            <xsl:value-of select="translate(normalize-space(@anchor), ' ', '_')" />
          </xsl:attribute>
        </xsl:if>
        <xsl:value-of select="@name" />
        <xsl:if test="@anchor">
          <xsl:call-template name="sectionlink">
            <xsl:with-param name="anchor" select="@anchor" />
          </xsl:call-template>
        </xsl:if>
      </h1>
      <xsl:apply-templates />
    </div>
  </xsl:template>

  <xsl:template match="ch_section">
    <h2 class="ch_section" id="{.}">
      <xsl:apply-templates />
    </h2>
  </xsl:template>

  <xsl:template match="ch_title">
    <h3 class="ch_title">
      <xsl:apply-templates />
    </h3>
  </xsl:template>

  <xsl:template match="ch_category">
    <h2 class="ch_category">
      <xsl:apply-templates />
    </h2>
  </xsl:template>

  <xsl:template match="subsection">
    <div class="subsection">
      <h2>
        <xsl:if test="@anchor">
          <xsl:attribute name="id">
            <xsl:value-of select="translate(normalize-space(@anchor), ' ' , '_')" />
          </xsl:attribute>
        </xsl:if>
        <xsl:value-of select="@name" />
        <xsl:if test="@anchor">
          <xsl:call-template name="sectionlink">
            <xsl:with-param name="anchor" select="@anchor" />
          </xsl:call-template>
        </xsl:if>
      </h2>
      <xsl:apply-templates />
    </div>
  </xsl:template>

  <xsl:template match="source">
    <pre class="source">
      <xsl:apply-templates />
    </pre>
  </xsl:template>

  <xsl:template match="code">
    <span class="code">
      <xsl:apply-templates />
    </span>
  </xsl:template>

  <xsl:template match="description">
    <div class="description">
      <xsl:apply-templates />
    </div>
  </xsl:template>

  <xsl:template match="component">
    <div class="component">
      <h2 id="{translate(@name, ' ', '_')}">
        <xsl:value-of select="@name" />
        <xsl:if test="@was">
          <a name="{translate(normalize-space(@was), ' ', '_')}">
            (was:
            <xsl:value-of select="@was" />
            )
          </a>
        </xsl:if>
        <xsl:call-template name="sectionlink">
          <xsl:with-param name="anchor" select="@name" />
        </xsl:call-template>
      </h2>
      <xsl:if test="@useinstead">
        <div class="deprecated">
          *** This element is deprecated. Use
          <a
            href="{concat($relative-path, '/usermanual/component_reference.html#', translate(normalize-space(@useinstead), ' ', '_'))}"
          >
            <xsl:value-of select="@useinstead" />
          </a>
          instead ***
        </div>
      </xsl:if>
      <xsl:apply-templates select="description" />
      <xsl:if test="@screenshot != ''">
        <div class="screenshot">
          <figure>
            <xsl:call-template name="image">
              <xsl:with-param name="srcdir" select="$sshotdir" />
              <xsl:with-param name="image" select="@screenshot" />
              <xsl:with-param name="width" select="@width" />
              <xsl:with-param name="height" select="@height" />
              <xsl:with-param name="alt" select="concat('Screenshot for Control-Panel of ', @name)" />
            </xsl:call-template>
            <figcaption>Screenshot of Control-Panel of <xsl:value-of select="@name"/></figcaption>
          </figure>
        </div>
      </xsl:if>
      <xsl:apply-templates select="*[not(self::description)]" />
      <div class="go-top">
        <a href="#">^</a>
      </div>
    </div>
  </xsl:template>

  <xsl:template name="sectionlink">
    <xsl:param name="anchor" />
    <a class="sectionlink" href="#{translate(normalize-space($anchor), ' ', '_')}"
      title="Link to here"
    >&para;</a>
  </xsl:template>

  <xsl:template match="properties">
    <xsl:variable name="prop-count" select="count(preceding-sibling::properties) + 1" />
    <div class="properties">
      <h3>
        <xsl:if test="name(..) = 'component'">
          <xsl:attribute name="id">
            <xsl:value-of select="concat(translate(normalize-space(../@name), ' ', '_'), '_parms', $prop-count)" />
          </xsl:attribute>
        </xsl:if>
        Parameters
        <xsl:if test="name(..) = 'component'">
          <xsl:call-template name="sectionlink">
            <xsl:with-param name="anchor"
              select="concat(translate(normalize-space(../@name), ' ', '_'), '_parms', $prop-count)" />
          </xsl:call-template>
        </xsl:if>
      </h3>
      <div class="property title">
        <div class="name title">Attribute</div>
        <div class="description title">Description</div>
        <div class="required title">Required</div>
      </div>
      <xsl:apply-templates />
    </div>
  </xsl:template>

  <xsl:template match="property">
    <div class="property">
      <div
        class="name req-{contains('yYtT', substring(normalize-space(@required), 1, 1))}"
      >
        <xsl:value-of select="@name" />
      </div>
      <div
        class="description req-{contains('yYtT', substring(normalize-space(@required), 1, 1))}"
      >
        <xsl:apply-templates />
      </div>
      <div
        class="required req-{contains('yYtT', substring(normalize-space(@required), 1, 1))}"
      >
        <xsl:choose>
          <xsl:when test="@required">
            <xsl:value-of select="@required" />
          </xsl:when>
          <xsl:otherwise>
            No
          </xsl:otherwise>
        </xsl:choose>
      </div>
    </div>
  </xsl:template>

  <xsl:template match="note">
    <div class="clear"></div>
    <div class="note">
      <xsl:apply-templates />
    </div>
    <div class="clear"></div>
  </xsl:template>

  <xsl:template name="apilink">
    <xsl:param name="href" />
    <a
      href="{concat($apidir, '/', @href)}"
    >
      <xsl:value-of select="." />
    </a>
  </xsl:template>

  <xsl:template match="apilink">
    <xsl:call-template name="apilink">
      <xsl:with-param name="name" select="@href" />
    </xsl:call-template>
  </xsl:template>

  <xsl:template name="complink">
    <xsl:param name="name" />
    <a
      href="{concat($relative-path, '/usermanual/component_reference.html#', translate(@name, ' ', '_'))}"
    >
      <xsl:value-of select="@name" />
    </a>
  </xsl:template>

  <xsl:template match="complink">
    <xsl:call-template name="complink">
      <xsl:with-param name="name" select="@name" />
    </xsl:call-template>
  </xsl:template>

  <xsl:template name="funclink">
    <xsl:param name="name" />
    <a
      href="{concat($relative-path, '/usermanual/functions.html#', translate(@name, ' ()', '_'))}"
    >
      <xsl:value-of select="@name" />
    </a>
  </xsl:template>

  <xsl:template match="funclink">
    <xsl:call-template name="funclink">
      <xsl:with-param name="name" select="@name" />
    </xsl:call-template>
  </xsl:template>

  <xsl:template match="figure">
    <figure>
      <xsl:call-template name="image">
        <xsl:with-param name="srcdir" select="$sshotdir" />
        <xsl:with-param name="image" select="@image" />
        <xsl:with-param name="width" select="@width" />
        <xsl:with-param name="height" select="@height" />
        <xsl:with-param name="alt" select="text()"/>
      </xsl:call-template>
      <figcaption>
        <xsl:apply-templates />
      </figcaption>
    </figure>
  </xsl:template>

  <xsl:template match="bugzilla">
    <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id={./text()}">
      Bug
      <xsl:value-of select="./text()" />
    </a>
  </xsl:template>

  <xsl:template match="bug">
    <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id={./text()}">
      Bug
      <xsl:value-of select="./text()" />
    </a>
    <xsl:call-template name="issue_separator"/>
  </xsl:template>

  <xsl:template match="rfc">
    <xsl:choose>
      <xsl:when test="./text()">
        <a href="https://tools.ietf.org/html/{@link}"><xsl:value-of select="./text()" /></a>
      </xsl:when>
      <xsl:otherwise>
        <a href="https://tools.ietf.org/html/{@link}">RFC <xsl:value-of select="@link" /></a>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>

  <xsl:template match="pr">
    <a href="https://github.com/apache/jmeter/pull/{./text()}">
      PR#<xsl:value-of select="./text()" />
    </a>
    <xsl:call-template name="issue_separator"/>
  </xsl:template>

  <xsl:template match="issue">
    <a href="https://github.com/apache/jmeter/issues/{./text()}">
      Issue#<xsl:value-of select="./text()" />
    </a>
    <xsl:call-template name="issue_separator"/>
  </xsl:template>

  <xsl:template name="issue_separator">
    <xsl:choose>
      <xsl:when test="following-sibling::issue or following-sibling::pr or following-sibling::bug">, </xsl:when>
      <!-- If preceding element is text, then avoid adding "," or "-". It looks like inline reference to an issue, PR -->
      <xsl:when test="preceding-sibling::text()[normalize-space() != '']"/>
      <xsl:otherwise> &ndash; </xsl:otherwise>
    </xsl:choose>
  </xsl:template>

  <xsl:template match="links">
    <div class="links">
      <div class="title">See also:</div>
      <ul class="links">
        <xsl:for-each select="link|complink">
          <li>
            <xsl:choose>
              <xsl:when test="name(.) = 'link'">
                <a href="{@href}">
                  <xsl:apply-templates />
                </a>
              </xsl:when>
              <xsl:when test="name(.) = 'complink'">
                <xsl:call-template name="complink">
                  <xsl:with-param name="name" select="@name" />
                </xsl:call-template>
              </xsl:when>
            </xsl:choose>
          </li>
        </xsl:for-each>
      </ul>
    </div>
  </xsl:template>

  <xsl:template match="link">
    <li>
      <a href="{@href}">
        <xsl:apply-templates />
      </a>
    </li>
  </xsl:template>

  <xsl:template match="example">
    <div class="example">
      <div class="title">
        <xsl:value-of select="@title" />
        <xsl:if test="@anchor">
          <xsl:attribute name="id">
            <xsl:value-of select="translate(normalize-space(@anchor), ' ', '_')" />
          </xsl:attribute>
          <xsl:call-template name="sectionlink">
            <xsl:with-param name="anchor" select="@anchor" />
          </xsl:call-template>
        </xsl:if>
      </div>
      <xsl:apply-templates />
    </div>
  </xsl:template>

  <xsl:template match="table">
    <table>
      <xsl:apply-templates />
    </table>
  </xsl:template>

  <xsl:template
    match="abbr|h1|h2|h3|h4|h5|p|b|em|ul|ol|li|a|i|pre|br|tt|tr|th|td|dl|dt|dd|sup|span|u|strong|thead|tbody|form|select|option|input|font|center|img|body|style|div|hr"
  >
    <xsl:copy>
      <xsl:apply-templates select="@*|*|text()" />
    </xsl:copy>
  </xsl:template>


  <!-- Process everything else by just passing it through -->
  <xsl:template match="*">
    <div class="nostyle">
      <xsl:copy>
        <xsl:apply-templates select="@*|*|text()" />
      </xsl:copy>
    </div>
  </xsl:template>

  <xsl:template match="@*">
    <xsl:copy>
      <xsl:apply-templates select="@*|*|text()" />
    </xsl:copy>
  </xsl:template>

  <xsl:template match="guimenuitem">
    <span class="guimenuitem"><xsl:apply-templates /></span>
    <xsl:if test="following-sibling::guimenuitem">&nbsp;&rarr;&nbsp;</xsl:if>
  </xsl:template>

  <xsl:template match="keysym">
    <span class="keysym"><xsl:apply-templates /></span>
    <xsl:if test="following-sibling::keysym and parent::keycombo">&nbsp;+&nbsp;</xsl:if>
  </xsl:template>

  <xsl:template match="keycombo">
    <span class="keycombo"><xsl:apply-templates select="keysym" /></span>
  </xsl:template>

  <xsl:template match="shortcut">
    (<xsl:apply-templates select="keycombo"/>)
  </xsl:template>

  <xsl:template match="menuchoice">
    <span class="menuchoice">
      <xsl:apply-templates select="guimenuitem"/>
      <xsl:apply-templates select="shortcut"/>
    </span>
  </xsl:template>

</xsl:stylesheet>
