[XSL-LIST Mailing List Archive Home] [By Thread] [By Date] [Recent Entries] [Reply To This Message]

Re: Line break algorithm

Subject: Re: Line break algorithm
From: "Michael Müller-Hillebrand mmh@xxxxxxxxx" <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx>
Date: Sun, 3 May 2020 13:04:05 -0000
Re:  Line break algorithm
Hi Rick,

I pulled this function using regular expressions (assuming there are no inline
elements present) from some past project (no XSLT 3, sorry):

  <!--
    try to break a string at the latest space character before the defined
width
    returns a sequence of strings
  -->
  <xsl:function name="dy:wrapTextToLines" as="xs:string+">
    <xsl:param name="text" as="xs:string" />
    <xsl:param name="width" as="xs:integer" />
    <xsl:choose>
      <xsl:when test="normalize-space($text) = ''">
        <!-- return empty string -->
        <xsl:value-of select="''"/>
      </xsl:when>
      <xsl:otherwise>
        <xsl:variable name="cleaned" select="mormalize-space($text)"/>
        <xsl:variable name="wrapped" select="
          replace(concat($cleaned,' '),
          concat('(.{0,', $width, '}) '), concat('$1', $gLF))"/>
        <xsl:sequence select="tokenize(replace($wrapped, concat($gLF, '$'),
''), $gLF)"/>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:function>

It works by adding a space to the end and then using a regular expression to
select up to the max characters followed by a space. Since regexes are greedy
by default, it will try to capture as many words as possible within the given
limit.

In my situation $gLF was a linefeed character, and in the last line I removed
the closing LF before tokenizing the result.

HTH,

- Michael

PS: Always nice remembering our FrameMaker timesb&



> Am 03.05.2020 um 02:45 schrieb Rick Quatro rick@xxxxxxxxxxxxxx
<mailto:rick@xxxxxxxxxxxxxx> <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx
<mailto:xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx>>:
>
> Hi All,
>
> I have lines in my input that I want to add <break> elements to in my
output. For example, this might be the input:
>
> <xsl:param name="line" select="'Takeoff from Unlisted and Alternate
Airports'"/>
>
> and I want to replace a space with a <break> so that each line doesn't
exceed, for example, 35 characters
>
> <line>Takeoff from Unlisted and Alternate<break/>Airports</line>
>
> I am thinking the I can tokenize the line and then recursively build the
string back up from the beginning, checking its length. Any other suggestions
on a general-purpose algorithm that I can use in XSLT 3 would be appreciated.
Thanks in advance.
>
> Rick

Current Thread

PURCHASE STYLUS STUDIO ONLINE TODAY!

Purchasing Stylus Studio from our online shop is Easy, Secure and Value Priced!

Buy Stylus Studio Now

Download The World's Best XML IDE!

Accelerate XML development with our award-winning XML IDE - Download a free trial today!

Don't miss another message! Subscribe to this list today.
Email
First Name
Last Name
Company
Subscribe in XML format
RSS 2.0
Atom 0.3
Site Map | Privacy Policy | Terms of Use | Trademarks
Free Stylus Studio XML Training:
W3C Member
Stylus Studio® and DataDirect XQuery ™are products from DataDirect Technologies, is a registered trademark of Progress Software Corporation, in the U.S. and other countries. © 2004-2013 All Rights Reserved.