There is one other exceptional case that the program does not cover which occurs in the rexxpg book. There are lots of examples that are tagged with <programlisting language=C++> which the startNeedle does not match. If you can handle that case too, I think we will have covered all the bases!

Gil

On 2/22/2020 12:58 PM, Rony G. Flatscher wrote:

Dear P.O.,

thank you for all of your efforts and work which allowed me to quickly find the reason for spurious additional blank lines!

The reason is that there are quite a few programlisting elements with a CDATA-section content which the script has not tackled so far.

So here an adjusted version of the script that processes CDATA sections as well:

    ---rgf, 2020-02-02, 2020-02-22: strip CR-LF from ooRexx xml program listings
    start=.dateTime~new
    call sysfiletree "*.xml", "files.", "FOS"
    end =.dateTime~new
    say "SysFileTree duration:" end-start", about to process" files.0 "files"

    len=files.0~length
    do i=1 to files.0
        say i~right(len)":" files.i
        call stripBlankLines files.i
    end
    end =.dateTime~new
    say "processed" .count~counter "<programlisting> elements, duration:" 
end-start

    ::routine stripBlankLines
        parse arg fileName

        inStr=.stream~new(fileName)~~open("read")
        chars=inStr~chars
        allChars=inStr~charin(1,chars)
        inStr~close

        startNeedle="<programlisting>"
        endNeedle  ="</programlisting>"
        cdataStart ="<![CDATA["
        cdataEnd   ="]]>"
        crlf       ="0d0a"x
        mbOut=.mutableBuffer~new(,chars)
        bEdited=.false

        do while allChars<>""
           parse var allChars before (startNeedle) program (endNeedle) allChars
           if program="" then
           do
              if allChars="" then  -- arrived at end of file
                 mbOut~append(before)
              else  -- maybe a placeholder of whitespace
              do
                 mbOut~append(before, startNeedle, program, endNeedle)
                 .count~increase
              end
           end
           else     -- strip leading and trailing CR-LF characters
           do
              -- check for CDATA-section, remove leading trailing blank lines 
there as well
              if program~pos(cdataStart)>0 then
              do
                 parse var program (cdataStart) program (cdataEnd)
                 mbOut~append(before, startNeedle, cdataStart, 
program~strip("both",crlf), cdataEnd, endNeedle)
              end
              else
              do
                 mbOut~append(before, startNeedle, program~strip("both",crlf), 
endNeedle)
              end

              .count~increase
              bEdited=.true
           end
        end

           -- write new file, if strip changes took place
        if bEdited then
          .stream~new(fileName)~~open("write 
replace")~~charout(mbOut~string)~close

    ::class count
    ::attribute counter class

    ::method    init   class
       expose counter
       counter=0

    ::method    increase class
       expose counter
       counter+=1

Cheers,

---rony





_______________________________________________
Oorexx-devel mailing list
Oorexx-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/oorexx-devel

--
Gil Barmwater

_______________________________________________
Oorexx-devel mailing list
Oorexx-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/oorexx-devel

Reply via email to