jhalfs git · trunk
jhalfs LFS build automation (mirror)
Python 78.4% Shell 19.8% Makefile 1.8%git clone https://git.christianimmanuel.de/mirrors-forks/jhalfs.gitwget https://git.christianimmanuel.de/mirrors-forks/jhalfs/archive/jhalfs.tar.gzProcess <prompt> tags in mit-kerberos
when we have a command followed by prompts: command <prompt>command:</prompt> instr ... we want to transform to: command << PROMPT_EOF instr ... quit PROMPT_EOF. This patch implements this. The problem is that the <prompt> tags may occur in several consecutive <screen> ones. So we create a fragment tree and process it recursively.
BLFS/xsl/process-prompt.xsl | 99 +++++++++++++++++++++++++++++++++++++++++++++ BLFS/xsl/scripts.xsl | 20 ++++++++- 2 files changed, 117 insertions(+), 2 deletions(-) diff --git a/BLFS/xsl/process-prompt.xsl b/BLFS/xsl/process-prompt.xsl new file mode 100644 index 0000000..8f3457c --- /dev/null +++ b/BLFS/xsl/process-prompt.xsl @@ -0,0 +1,99 @@ +<?xml version="1.0" encoding="ISO-8859-1"?> +<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" + version="1.0"> + + <xsl:template name="process-prompt"> + <xsl:param name="instructions"/> + <xsl:param name="root-seen"/> + <xsl:param name="prompt-seen"/> + +<!-- Isolate the current instruction --> + <xsl:variable name="current-instr" select="$instructions[1]"/> + + <xsl:choose> +<!--============================================================--> +<!-- First, if we have an empty tree, close everything and exit --> + <xsl:when test="not($current-instr)"> + <xsl:if test="$prompt-seen"> + <xsl:call-template name="end-prompt"/> + </xsl:if> + <xsl:if test="$root-seen"> + <xsl:call-template name="end-root"/> + </xsl:if> + </xsl:when><!-- end empty tree --> +<!--============================================================--> + <xsl:when test="$current-instr[@role='root']"> + <xsl:choose> + <xsl:when test="$current-instr//prompt"> + <xsl:if test="not($root-seen)"> + <xsl:call-template name="begin-root"/> + </xsl:if> + <xsl:text>
</xsl:text> + <xsl:if test="not($prompt-seen)"> + <xsl:copy-of + select="substring-before($current-instr//text()[1],'
')"/> + <xsl:text> << PROMPT_EOF +</xsl:text> + </xsl:if> + <xsl:apply-templates + select="$current-instr/userinput/node()[position()>1]"/> + <xsl:call-template name="process-prompt"> + <xsl:with-param + name="instructions" + select="$instructions[position()>1]"/> + <xsl:with-param name="root-seen" select="boolean(1)"/> + <xsl:with-param name="prompt-seen" select="boolean(1)"/> + </xsl:call-template> + </xsl:when><!-- end prompt as root --> +<!--____________________________________________________________ --> + <xsl:otherwise><!-- we have no prompt --> + <xsl:if test="$prompt-seen"> + <xsl:text> +quit +PROMPT_EOF</xsl:text> + </xsl:if> + <xsl:apply-templates + select="$current-instr" + mode="config"/> + <!-- the above will call "end-root" if the next screen + sibling is not role="root". We need to pass root-seen=false + in this case. Otherwise, we need to pass root-seen=true. + So create a variable --> + <xsl:variable name="rs" + select="$instructions[2][@role='root']"/> + <xsl:call-template name="process-prompt"> + <xsl:with-param + name="instructions" + select="$instructions[position()>1]"/> + <xsl:with-param name="root-seen" select="boolean($rs)"/> + <xsl:with-param name="prompt-seen" select="boolean(0)"/> + </xsl:call-template> + </xsl:otherwise><!-- end no prompt --> +<!--____________________________________________________________ --> + </xsl:choose> + </xsl:when><!-- role="root" --> +<!--============================================================--> + <xsl:otherwise><!-- no role --> + <xsl:if test="$prompt-seen"> + <xsl:text> +quit +PROMPT_EOF</xsl:text> + </xsl:if> + <xsl:if test="$root-seen"> + <xsl:call-template name="end-root"/> + </xsl:if> + <xsl:apply-templates select="$current-instr/userinput"/> + <xsl:call-template name="process-prompt"> + <xsl:with-param + name="instructions" + select="$instructions[position()>1]"/> + <xsl:with-param name="root-seen" select="boolean(0)"/> + <xsl:with-param name="prompt-seen" select="boolean(0)"/> + </xsl:call-template> + </xsl:otherwise><!-- no role --> +<!--============================================================--> + </xsl:choose> + </xsl:template> + + <xsl:template match="prompt"/> +</xsl:stylesheet> diff --git a/BLFS/xsl/scripts.xsl b/BLFS/xsl/scripts.xsl index 78f61ad..01ff31c 100644 --- a/BLFS/xsl/scripts.xsl +++ b/BLFS/xsl/scripts.xsl @@ -80,6 +80,9 @@ done</xsl:variable> <!-- include the template for replaceable tags --> <xsl:include href="process-replaceable.xsl"/> +<!-- include the template for prompt tags --> + <xsl:include href="process-prompt.xsl"/> + <!--=================== Begin processing ========================--> <xsl:template match="/"> @@ -385,8 +388,21 @@ echo Start Time: ${SECONDS} >> $INFOLOG <xsl:when test="@role = 'configuration'"> <xsl:text>
</xsl:text> - <xsl:apply-templates mode="config" - select=".//screen[not(@role = 'nodump') and ./userinput]"/> + <xsl:choose> + <xsl:when test=".//screen/userinput/prompt"> + <xsl:call-template name="process-prompt"> + <xsl:with-param + name="instructions" + select=".//screen[not(@role = 'nodump') and ./userinput]"/> + <xsl:with-param name="root-seen" select="false"/> + <xsl:with-param name="prompt-seen" select="false"/> + </xsl:call-template> + </xsl:when> + <xsl:otherwise> + <xsl:apply-templates mode="config" + select=".//screen[not(@role = 'nodump') and ./userinput]"/> + </xsl:otherwise> + </xsl:choose> </xsl:when><!-- @role="configuration" --> </xsl:choose>