From: <jfa...@us...> - 2009-08-10 02:36:01
|
Revision: 5077 http://oorexx.svn.sourceforge.net/oorexx/?rev=5077&view=rev Author: jfaucher Date: 2009-08-10 02:35:52 +0000 (Mon, 10 Aug 2009) Log Message: ----------- Work in progress : new script transformdir. Modified Paths: -------------- incubator/DocMusings/makevalidxml/_diary.txt incubator/DocMusings/makevalidxml/myxmlparser.cls Added Paths: ----------- incubator/DocMusings/makevalidxml/arguments.rex incubator/DocMusings/makevalidxml/directory.rex incubator/DocMusings/makevalidxml/help.rex incubator/DocMusings/makevalidxml/string2args.rex incubator/DocMusings/makevalidxml/transformdir.rex incubator/DocMusings/makevalidxml/transformfile.rex Removed Paths: ------------- incubator/DocMusings/makevalidxml/makevalidxml.rex Modified: incubator/DocMusings/makevalidxml/_diary.txt =================================================================== --- incubator/DocMusings/makevalidxml/_diary.txt 2009-08-10 00:25:38 UTC (rev 5076) +++ incubator/DocMusings/makevalidxml/_diary.txt 2009-08-10 02:35:52 UTC (rev 5077) @@ -1,4 +1,62 @@ =============================================================================== +2009 august 09 + +Renamed makevalidxml to transformfile because the script is not limited to +making a valid XML file. + +Added transformdir which lets process all the sgml files of a given directory. +Transformation in place is not allowed, must pass an output directory different +from input directory. Does not process recursively, so must process separately +each directory under trunk. +Ex : +rexx transformdir.rex trunk/rexxref trunk/rexxref.new + +A minimal conformity checking is done, and some errors are found : +buildmachine\vmware.sgml + line 2 : missing closing ">" : <title +oodialog\editcontrolc.sgml + line 1393 : Uppercase "L" in <Listitem> + line 1501 : Uppercase "L" in <Listitem> + line 1573 : Uppercase "L" in <Listitem> + line 1643 : Uppercase "L" in <Listitem> +oodialog\progressbarc.sgml + line 173 : Missing quotes around mthStep in <link linkend=mthStep> + line 180 : Missing quotes around mthStep in <section id=mthStep> +oodialog\windowBaseCommon.sgml + Lot of errors because railroad not in cdata + For the moment, I skip this file when iterating over the sgml files +oodialog\windowExtensionsCommon.sgml + Lot of errors because railroad not in cdata + For the moment, I skip this file when iterating over the sgml files +readme\newinrelease.sgml + line 407 : Insert the missing </listitem></varlistentry> after </para> + to close <varlistentry> at line 401 and <listitem> at line 402 +readme\windows.sgml + line 107 : <para> has no closing </para> + line 510 : <para> has no closing </para> +rexxpg\api.sgml + line 4294 : <</para> +rexxpg\classicapi.sgml + line 3042 : missing closing ">" : </title + line 3105 : remove this tag <section>, it has no counterpart +rexxref\instrc.sgml + line 3576 : Use < instead of "<" in <computeroutput><=</computeroutput> +winextensions\windowmanager.sgml + line 56 : lower case <computeroutput>winSystm.cls</COMPUTEROUTPUT> +winextensions\wineventlog.sgml + line 55 : lower case <computeroutput>winSystm.cls</COMPUTEROUTPUT> + +Except these errors, all the sgml files are parsed correctly. A diff between the +original version and the generated file shows zero difference. +Unbalanced <imagedata> and <colspec> are supported (that will be easy to generate +a valid XML with balanced tags). +In fact, I realize it will be easy to do a roundtrip sgml docbook-->xml docbook +and vice versa. + +Todo : Implement -dsssl, -xslt and -xinclude. + + +=============================================================================== 2009 july 26 [out of subject, but...] @@ -92,7 +150,7 @@ <!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook V4.2//EN" must have a system identifier -<!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook V4.2//EN" "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" +<!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN" "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" <imagedata> must be completed by </imagedata> Added: incubator/DocMusings/makevalidxml/arguments.rex =================================================================== --- incubator/DocMusings/makevalidxml/arguments.rex (rev 0) +++ incubator/DocMusings/makevalidxml/arguments.rex 2009-08-10 02:35:52 UTC (rev 5077) @@ -0,0 +1,72 @@ +::requires 'string2args.rex' + +::class CommonArguments public subclass Directory +::attribute args + +::method init + self~setMethod("UNKNOWN", "return ''") -- I want '' instead of .nil when accessing an unset entry + self~debug = .false + self~dsssl = .false + self~dump = .false + self~errors = .List~new + self~help = .false + self~xinclude = .false + self~xslt = .false + + -- Tokenize the arguments, if needed + use strict arg callType, arguments -- always an array + select + when callType == "COMMAND" & arguments~items == 1 then self~args = String2Args(arguments[1]) + when callType == "SUBROUTINE" & arguments~items == 1 & arguments[1]~isA(.array) then self~args = arguments[1] + otherwise self~args = arguments + end + + -- Use makeArray to have a non-sparse array, + -- because omitted parameters have no corresponding index, + -- and we ignore omitted parameters here. + loop i=1 to self~args~items + if self~args[i] == "" then self~args~remove(i) + end + self~args = self~args~makeArray + + if self~args~items == 0 then do + self~help = .true + return + end + +::method parseOption + use strict arg option + select + when "-debug"~caseLessEquals(option) then do + self~debug = .true + self~debugOption = option + end + when "-dsssl"~caseLessEquals(option) then do + self~dsssl = .true + self~dssslOption = option + end + when "-dump"~caseLessEquals(option) then do + self~dump = .true + self~dumpOption = option + end + when "-help"~caseLessEquals(option) then do + self~help = .true + self~helpOption = option + end + when "-xinclude"~caseLessEquals(option) then do + self~xinclude = .true + self~xincludeOption = option + end + when "-xslt"~caseLessEquals(option) then do + self~xslt = .true + self~xsltOption = option + end + otherwise return 0 + end + return 1 + +::method verifyOptions + self~errors~empty + if self~dsssl & self~xslt then self~errors~append("[error] You can't specify both "self~dssslOption" and "self~xsltOption) + if self~xinclude & \self~xslt then self~errors~append("[error] You must specify -xslt if you want to use "self~xincludeOption) + return self~errors~isEmpty Added: incubator/DocMusings/makevalidxml/directory.rex =================================================================== --- incubator/DocMusings/makevalidxml/directory.rex (rev 0) +++ incubator/DocMusings/makevalidxml/directory.rex 2009-08-10 02:35:52 UTC (rev 5077) @@ -0,0 +1,37 @@ +::routine createDirectory public + -- Creates the specified directory. + -- Returns 0 if the directory already exists. + -- Returns 1 if the directory has been created. + -- Returns -1 if the creation failed because a file (not a directory) with the same name already exists. + -- Returns -2 if the creation failed for any other reason. + use strict arg path + if SysIsFileDirectory(path) then return 0 + if SysIsFile(path) then return -1 + if SysMkDir(path) <> 0 then return -2 + return 1 + + +------------------------------------------------------------------------------- +::routine createDirectoryVerbose public + -- Creates the specified directory. + -- Displays an error message in case of trouble. + -- Returns 0 if the directory already exists. + -- Returns 1 if the directory has been created. + -- Returns -1 if the creation failed because a file (not a directory) with the same name already exists. + -- Returns -2 if the creation failed for any other reason. + use strict arg path, log=.stderr + createDirectory = createDirectory(path) + select + when createDirectory == -1 then + do + log~lineout("[error] Can't create directory, a file with same name already exists :") + log~lineout("[error] "path) + end + when createDirectory < 0 then + do + log~lineout("[error] Unable to create directory :") + log~lineout(path) + end + otherwise nop + end + return createDirectory Added: incubator/DocMusings/makevalidxml/help.rex =================================================================== --- incubator/DocMusings/makevalidxml/help.rex (rev 0) +++ incubator/DocMusings/makevalidxml/help.rex 2009-08-10 02:35:52 UTC (rev 5077) @@ -0,0 +1,16 @@ +::routine Help public + -- The help text is taken from the comment at the begining of the source file. + use strict arg source + sourcename = filespec("name", source) + display = .false + signal on notready + do forever + sourceline = linein(source) + if sourceline~pos("****/") <> 0 then leave + sourceline = sourceline~changeStr("$sourcename", sourcename) + if display then say sourceline + if sourceline~pos("/****") <> 0 then display = .true + end + notready: + return + Deleted: incubator/DocMusings/makevalidxml/makevalidxml.rex =================================================================== --- incubator/DocMusings/makevalidxml/makevalidxml.rex 2009-08-10 00:25:38 UTC (rev 5076) +++ incubator/DocMusings/makevalidxml/makevalidxml.rex 2009-08-10 02:35:52 UTC (rev 5077) @@ -1,315 +0,0 @@ -/*----------------------------------------------------------------------------*/ -/* */ -/* Description: Test the XML parser class. */ -/* */ -/* Copyright (c) 2006 Rexx Language Association. All rights reserved. */ -/* */ -/* This program and the accompanying materials are made available under */ -/* the terms of the Common Public License v1.0 which accompanies this */ -/* distribution. A copy is also available at the following address: */ -/* http://www.ibm.com/developerworks/oss/CPLv1.0.htm */ -/* */ -/* Redistribution and use in source and binary forms, with or */ -/* without modification, are permitted provided that the following */ -/* conditions are met: */ -/* */ -/* Redistributions of source code must retain the above copyright */ -/* notice, this list of conditions and the following disclaimer. */ -/* Redistributions in binary form must reproduce the above copyright */ -/* notice, this list of conditions and the following disclaimer in */ -/* the documentation and/or other materials provided with the distribution. */ -/* */ -/* Neither the name of Rexx Language Association nor the names */ -/* of its contributors may be used to endorse or promote products */ -/* derived from this software without specific prior written permission. */ -/* */ -/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ -/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ -/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ -/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ -/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ -/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ -/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ -/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ -/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ -/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ -/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -/* */ -/* Author: W. David Ashley */ -/* */ -/*----------------------------------------------------------------------------*/ - -/**** -Usage : - makevalidxml [-debug] [-dump] [-fix] [-help] [-xinclude] <filename> -Description : - This script is intended to work on the XML files of the ooRexx doc. - It reads the file <filename>, parses it and sends it to stdout. - By default, the layout of the output file is kept the most similar possible - to the layout of the input. - Options : - -debug : Insert additional informations in the ouptut. - -dump : The elements and attributes are dumped without attempting to - keep the original layout. - -fix : The output is modified where needed, to make it valid XML. - -xinclude : Use <xi:include> instead of XML entities to include files. -****/ - - -parse source . callType . -arguments = .Arguments~new(callType, arg(1,"array")) - -if arguments~error <> "" then do - call Help arguments~error - return 1 -end - -if arguments~helpOption then do - call Help - return 0 -end - -parser = .myparser~new() -parser~debug = arguments~debugOption -parser~dump = arguments~dumpOption -errortxt = parser~parse_file(arguments~filename) -if errortxt <> "" then do - say errortxt - return 1 -end - -return 0 - - -::requires 'myxmlparser.cls' - -::class myparser subclass xmlparser -::attribute dump - -::method start_element - use arg chunk - if self~dump then do - if self~debug then say '[start_element:'chunk~line':'chunk~col'[' - call charout , '<'chunk~tag - if chunk~attr <> .nil then - do f over chunk~attr - call charout , ' 'f'="'self~textxlate(chunk~attr[f])'"' - end - call charout , '>' -- say '>' - if self~debug then say ']start_element]' - end - else do - if self~debug then call charout , '[start_element:'chunk~line':'chunk~col'[' - call charout , '<'chunk~text'>' - if self~debug then call charout , ']start_element]' - end - return - -::method end_element - use arg chunk - if self~dump then do - if self~debug then say '[end_element'chunk~line':'chunk~col'[' - call charout , '</'chunk~tag'>' -- say '</'chunk~tag'>' - if self~debug then say ']end_element]' - end - else do - if self~debug then call charout , '[end_element:'chunk~line':'chunk~col'[' - if chunk~text = '' then call charout , '</'chunk~tag'>' - if self~debug then call charout , ']end_element]' - end - return - -::method passthrough - use arg chunk - if self~dump then do - if self~debug then say '[passthrough:'chunk~line':'chunk~col'[' - call charout , '<'chunk~text'>' -- say '<'chunk~text'>' - if self~debug then say ']passthrough]' - end - else do - if self~debug then call charout , '[passthrough:'chunk~line':'chunk~col'[' - call charout , '<'chunk~text'>' - if self~debug then call charout , ']passthrough]' - end - return - -::method text - use arg chunk - if self~dump then do - if self~debug then call charout , '[text:'chunk~line':'chunk~col'[' - call charout , chunk~text - if self~debug then say ']text]' - end - else do - if self~debug then call charout , '[text:'chunk~line':'chunk~col'[' - call charout , chunk~text - if self~debug then call charout , ']text]' - end - return - -::method error - use arg err - say err~text - return - -::method xlatetext private - use arg text - /* - text = text~changestr('&', '&') -- always do this one first! - text = text~changestr('>', '>') - text = text~changestr('<', '<') - */ - return text - -------------------------------------------------------------------------------- -::class Arguments -::attribute debugOption -::attribute dumpOption -::attribute error -::attribute filename -::attribute fixOption -::attribute helpOption -::attribute xincludeOption - -::method init - self~debugOption = .false - self~dumpOption = .false - self~error = "" - self~filename = "" - self~fixOption = .false - self~helpOption = .false - self~xincludeOption = .false - - -- Tokenize the arguments, if needed - use strict arg callType, arguments -- always an array - select - when callType == "COMMAND" & arguments~items == 1 then args = String2Args(arguments[1]) - when callType == "SUBROUTINE" & arguments~items == 1 & arguments[1]~isA(.array) then args = arguments[1] - otherwise args = arguments - end - - -- Use makeArray to have a non-sparse array, - -- because omitted parameters have no corresponding index, - -- and we ignore omitted parameters here. - args = args~makeArray - - -- Process the options - loop i=1 to args~items - option = args[i] - if option~left(1) <> "-" then leave - select - when "-debug"~caseLessEquals(option) then self~debugOption = .true - when "-dump"~caseLessEquals(option) then self~dumpOption = .true - when "-fix"~caseLessEquals(option) then self~fixOption = .true - when "-help"~caseLessEquals(option) then self~helpOption = .true - when "-xinclude"~caseLessEquals(option) then self~xincludeOption = .true - otherwise do - self~error = "Unknown option" option - return - end - end - -- Return now if help requested - if self~helpOption then return - end - - -- Process the arguments - if i > args~items then do - self~error = "<filename> is missing" - return - end - self~filename = args[i]~strip - i += 1 - if i > args~items then return - self~error = "Unexpected arguments :" args~section(i)~toString("L", " ") - return - - -------------------------------------------------------------------------------- -::routine String2Args public - -- Converts a string to an array of arguments. - -- Arguments are separated by whitespaces (anything < 32) and can be quoted. - -- This routine tries to follow the behavior of cmd.exe, which lets write such things : - -- %1 %2 %3 - -- myscript c:\dir1\my dir\dir 2 c:\dir1\my dir\dir 2 - -- myscript "c:\dir1\my dir\dir 2" "c:\dir1\my dir\dir 2" - -- myscript c:\dir1\"my dir"\dir 2 c:\dir1\"my dir"\dir 2 - -- myscript c:\dir1\my dir\dir" 2" c:\dir1\my dir\dir" 2" - -- myscript he says "I told you "hello"!" he says "I told you "hello"!" - -- myscript he says "I told you ""hello""!" he says "I told you ""hello""!" - -- - -- Unlike cmd, this routine does an additional processing : - -- Quotes are removed from the value, except when they are doubled inside a quoted string. - -- cmd parameter value in args - -- c:\dir1\my 'c:\dir1\my' - -- "c:\dir1\my dir\dir 2" 'c:\dir1\my dir\dir 2' - -- c:\dir1\"my dir"\dir 'c:\dir1\my dir\dir' - -- "I told you "hello"!" 'I told you hello!' - -- "I told you ""hello""!" 'I told you "hello"!' - use strict arg string - - args = .Array~new - i = 1 - - loop label arguments - -- Skip whitespaces - loop - if i > string~length then return args - if string~subchar(i) > " " then leave - i += 1 - end - - -- Process current argument : can be made of several chunks, all chunks are concatenated - -- Example chunk1 chunk2 chunk3 value - -- one one 'one' - -- "one two" "one two" 'one two' - -- one" two "three one " two " three 'one two three' - -- one" ""two"" "three one " ""two"" " three 'one "two" three' - current = .MutableBuffer~new - loop label current_argument - if string~subchar(i) == '"' then do - -- Chunk surrounded by quotes : whitespaces are kept, double occurrence of quotes are replaced by a single embedded quote - loop label quoted_chunk - i += 1 - if i > string~length then return args~~append(current~string) - select - when string~subchar(i) == '"' & string~subchar(i+1) == '"' then do - current~append('"') - i += 1 - end - when string~subchar(i) == '"' then do - i += 1 - leave quoted_chunk - end - otherwise current~append(string~subchar(i)) - end - end quoted_chunk - end - if string~subchar(i) <= " " then do - args~append(current~string) - leave current_argument - end - -- Chunk not surrounded by quotes : ends when a whitespace or quote is reached - loop - if i > string~length then return args~~append(current~string) - if string~subchar(i) <= " " | string~subchar(i) == '"' then leave - current~append(string~subchar(i)) - i += 1 - end - end current_argument - end arguments - return args - -------------------------------------------------------------------------------- -::routine Help - use strict arg errorMessage="" - if errorMessage <> "" then say errorMessage - -- The help text is taken from the comment at the begining of the source file. - display = .false - do line = 1 to sourceline() - sourceline = sourceline(line) - if sourceline~pos("****/") <> 0 then leave - if display then say sourceline - if sourceline~pos("/****") <> 0 then display = .true - end - return - Modified: incubator/DocMusings/makevalidxml/myxmlparser.cls =================================================================== --- incubator/DocMusings/makevalidxml/myxmlparser.cls 2009-08-10 00:25:38 UTC (rev 5076) +++ incubator/DocMusings/makevalidxml/myxmlparser.cls 2009-08-10 02:35:52 UTC (rev 5077) @@ -290,7 +290,7 @@ raw_element = buffer3~string if \iscdata then buffer3~changeStr(self~endofline, " "~copies(self~endofline~length)) -- replace endofline by space(s) element = buffer3~string~strip() -if self~debug then call lineout "stderr", errlineidx":"currentSourceLine()":element=["element"]" +if self~debug then .stderr~lineout("[debug] "errlineidx":"currentSourceLine()":element=["element"]") select when element~substr(1, 1) = '/' then do chunk~tag = element~substr(2) @@ -317,8 +317,8 @@ element = element~strip() if self~debug then do - call lineout "stderr", errlineidx":"currentSourceLine()":tag =["tag"]" - call lineout "stderr", errlineidx":"currentSourceLine()":element=["element"]" + .stderr~lineout("[debug] "errlineidx":"currentSourceLine()":tag =["tag"]") + .stderr~lineout("[debug] "errlineidx":"currentSourceLine()":element=["element"]") end -- the following is needed in case the '/' immediately follows the tag if tag~pos('/') > 0 then do @@ -340,7 +340,7 @@ else if firstApos <> 0 then pos = firstApos else pos = 0 if pos <> 0 then element = element~left(pos - 1)~space(0) || element~substr(pos) - if self~debug then call lineout "stderr", errlineidx":"currentSourceLine()":element=["element"]" + if self~debug then .stderr~lineout("[debug] "errlineidx":"currentSourceLine()":element=["element"]") if pos('="', element~word(1)) > 0 then do parse var element attrname '="' attrvalue '"' element attrname = attrname~strip() @@ -510,6 +510,7 @@ tfile = .stream~new(xmlfile) errortxt = tfile~open('read') if errortxt <> 'READY:' then do + errortxt = tfile~description tfile~close() return errortxt end Added: incubator/DocMusings/makevalidxml/string2args.rex =================================================================== --- incubator/DocMusings/makevalidxml/string2args.rex (rev 0) +++ incubator/DocMusings/makevalidxml/string2args.rex 2009-08-10 02:35:52 UTC (rev 5077) @@ -0,0 +1,74 @@ +::routine String2Args public + -- Converts a string to an array of arguments. + -- Arguments are separated by whitespaces (anything < 32) and can be quoted. + -- This routine tries to follow the behavior of cmd.exe, which lets write such things : + -- %1 %2 %3 + -- myscript c:\dir1\my dir\dir 2 c:\dir1\my dir\dir 2 + -- myscript "c:\dir1\my dir\dir 2" "c:\dir1\my dir\dir 2" + -- myscript c:\dir1\"my dir"\dir 2 c:\dir1\"my dir"\dir 2 + -- myscript c:\dir1\my dir\dir" 2" c:\dir1\my dir\dir" 2" + -- myscript he says "I told you "hello"!" he says "I told you "hello"!" + -- myscript he says "I told you ""hello""!" he says "I told you ""hello""!" + -- + -- Unlike cmd, this routine does an additional processing : + -- Quotes are removed from the value, except when they are doubled inside a quoted string. + -- cmd parameter value in args + -- c:\dir1\my 'c:\dir1\my' + -- "c:\dir1\my dir\dir 2" 'c:\dir1\my dir\dir 2' + -- c:\dir1\"my dir"\dir 'c:\dir1\my dir\dir' + -- "I told you "hello"!" 'I told you hello!' + -- "I told you ""hello""!" 'I told you "hello"!' + use strict arg string + + args = .Array~new + i = 1 + + loop label arguments + -- Skip whitespaces + loop + if i > string~length then return args + if string~subchar(i) > " " then leave + i += 1 + end + + -- Process current argument : can be made of several chunks, all chunks are concatenated + -- Example chunk1 chunk2 chunk3 value + -- one one 'one' + -- "one two" "one two" 'one two' + -- one" two "three one " two " three 'one two three' + -- one" ""two"" "three one " ""two"" " three 'one "two" three' + current = .MutableBuffer~new + loop label current_argument + if string~subchar(i) == '"' then do + -- Chunk surrounded by quotes : whitespaces are kept, double occurrence of quotes are replaced by a single embedded quote + loop label quoted_chunk + i += 1 + if i > string~length then return args~~append(current~string) + select + when string~subchar(i) == '"' & string~subchar(i+1) == '"' then do + current~append('"') + i += 1 + end + when string~subchar(i) == '"' then do + i += 1 + leave quoted_chunk + end + otherwise current~append(string~subchar(i)) + end + end quoted_chunk + end + if string~subchar(i) <= " " then do + args~append(current~string) + leave current_argument + end + -- Chunk not surrounded by quotes : ends when a whitespace or quote is reached + loop + if i > string~length then return args~~append(current~string) + if string~subchar(i) <= " " | string~subchar(i) == '"' then leave + current~append(string~subchar(i)) + i += 1 + end + end current_argument + end arguments + return args + Added: incubator/DocMusings/makevalidxml/transformdir.rex =================================================================== --- incubator/DocMusings/makevalidxml/transformdir.rex (rev 0) +++ incubator/DocMusings/makevalidxml/transformdir.rex 2009-08-10 02:35:52 UTC (rev 5077) @@ -0,0 +1,167 @@ +/**** +Usage : + $sourcename + [-debug] [-dsssl] [-dump] [-help] [-startat <filename>] [-xinclude] [-xslt] + <inputDirectory> [<outputDirectory>] [<logFile>] +Description : + This script is intended to work on the XML files of the ooRexx doc. + It iterates over the files found in <inputDirectory> and applies + makevalidxml on the *.sgml files, using the options passed + as parameters. The sgml files are written to <outputDirectory>. + By default, there is no transformation. + Options : + -debug : Insert additional informations in the ouptut. A part is sent to + stderr, another part is inserted in the XML output (making it + non valid). + -dsssl : Generate DocBook XML compatible with DSSSL. + -dump : The elements and attributes are dumped without attempting to + keep the original layout. + -startat : Lets start the iteration at <filename>. Useful when you have + to bypass errors in the XML files and restart the iteration. + -xinclude : Use <xi:include> instead of XML entities to include files. + Will be ignored if the target format is not XSLT. + -xslt : Generate DocBook XML compatible with XSLT. +****/ + +log = .stderr +parse source . callType me +arguments = .Arguments~new(callType, arg(1,"array")) +if arguments~help then call Help me +do error over arguments~errors + log~lineout(error) +end +if arguments~help | \arguments~errors~isEmpty then return 1 + +if arguments~logFile <> "" then log = .stream~new(arguments~logFile) + +inputDirectory = qualify(arguments~inputDirectory"/") +outputDirectory = qualify(arguments~outputDirectory"/") + +if inputDirectory == outputDirectory then do + log~lineout("[error] <outputDirectory> must be different from <inputDirectory>") + return 1 +end + +if \SysFileExists(inputDirectory) then do + log~lineout("[error] <inputDirectory> not found") + return 1 +end + +call SysFileTree inputDirectory"*.sgml", "files", "FO" +if files.0 <> 0 then do + if createDirectoryVerbose(outputDirectory, log) < 0 then return 1 + skip = arguments~startat + do i=1 to files.0 + fullpath = files.i + if fullpath~pos(inputDirectory) <> 1 then do + log~lineout("[error] Assert failed : fullpath does not start with <inputDirectory>") + return 1 + end + relativepath = fullpath~substr(inputDirectory~length + 1) + + if skip then if relativepath <> arguments~startatValue then iterate + skip = .false + + -- oodialog + if relativepath == "dialogcontrolCommon.sgml" then iterate -- not used + if relativepath == "menus.sgml" then iterate -- not used + if relativepath == "windowBaseCommon.sgml" then iterate -- to fix ! used. + + log~lineout("[info] Processing file "fullpath) + call transformfile arguments~debugOption,, + arguments~dssslOption,, + arguments~dumpOption,, + arguments~xincludeOption,, + arguments~xsltOption,, + fullpath,, + outputDirectory || relativepath,, + arguments~logFile + if result <> 0 then do + log~lineout("[error] Got an error while processing "fullpath) + return 1 + end + end +end + +return 0 + +::requires 'arguments.rex' +::requires 'help.rex' +::requires 'directory.rex' + +------------------------------------------------------------------------------- +::class Arguments subclass CommonArguments + +::method init + use strict arg callType, arguments -- always an array + self~init:super(callType, arguments) + -- Return now if help requested + if self~help then return + + self~inputDirectory = "" + self~logFile = "" + self~outputDirectory = "" + self~startat = .false + + -- Process the options + loop i=1 to self~args~items + option = self~args[i] + if option~left(1) <> "-" then leave + select + when self~parseOption(option) then nop + when "-startat"~caseLessEquals(option) then do + value = self~args[i+1] + if value == "" | value~left(1) == "-" then do + self~errors~append("[error] Value expected for option "option) + end + self~startat = .true + self~startatOption = option + self~startatValue = value + i += 1 + end + otherwise do + self~errors~append("[error] Unknown option" option) + return + end + end + -- Return now if help requested + if self~help then return + end + + self~verifyOptions + if \self~errors~isEmpty then return + + -- Process the arguments + -- inputDirectory is mandatory + if i > self~args~items then do + self~errors~append("[error] <inputDirectory> is missing") + return + end + self~inputDirectory = self~args[i]~strip + i += 1 + + -- outputDirectory is mandatory + if i > self~args~items then do + self~errors~append("[error] <outputDirectory> is missing") + return + end + self~outputDirectory = self~args[i]~strip + if self~outputDirectory~left(1) == "-" then do + self~errors~append("[error] Options are before <inputFilename>") + return + end + i += 1 + + -- logFile is optional + if i > self~args~items then return + self~logFile = self~args[i]~strip + if self~logFile~left(1) == "-" then do + self~errors~append("[error] Options are before <inputFilename>") + return + end + i += 1 + + -- no more argument expected + if i > self~args~items then return + self~errors~append("[error] Unexpected arguments :" self~args~section(i)~toString("L", " ")) + return Copied: incubator/DocMusings/makevalidxml/transformfile.rex (from rev 5062, incubator/DocMusings/makevalidxml/makevalidxml.rex) =================================================================== --- incubator/DocMusings/makevalidxml/transformfile.rex (rev 0) +++ incubator/DocMusings/makevalidxml/transformfile.rex 2009-08-10 02:35:52 UTC (rev 5077) @@ -0,0 +1,294 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Description: Test the XML parser class. */ +/* */ +/* Copyright (c) 2006 Rexx Language Association. All rights reserved. */ +/* */ +/* This program and the accompanying materials are made available under */ +/* the terms of the Common Public License v1.0 which accompanies this */ +/* distribution. A copy is also available at the following address: */ +/* http://www.ibm.com/developerworks/oss/CPLv1.0.htm */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/* Author: W. David Ashley */ +/* */ +/*----------------------------------------------------------------------------*/ + +/**** +Usage : + $sourcename + [-debug] [-dsssl] [-dump] [-help] [-xinclude] [-xslt] + <inputFile> [<outputFile> [<logFile>]] +Description : + This script is intended to work on the XML files of the ooRexx doc. + It reads the file <inputFile>, parses it and writes the transformed XML in + the file <outputFile>. + By default, there is no transformation and the layout of the output file + is kept the most similar possible to the layout of the input. + Options : + -debug : Insert additional informations in the ouptut. A part is sent to + stderr, another part is inserted in the XML output (making it + non valid). + -dsssl : Generate DocBook XML compatible with DSSSL. + -dump : The elements and attributes are dumped without attempting to + keep the original layout. + -xinclude : Use <xi:include> instead of XML entities to include files. + Will be ignored if the target format is not XSLT. + -xslt : Generate DocBook XML compatible with XSLT. +****/ + + +log = .stderr +parse source . callType me +arguments = .Arguments~new(callType, arg(1,"array")) +if arguments~help then call Help me +do error over arguments~errors + log~lineout(error) +end +if arguments~help | \arguments~errors~isEmpty then return 1 + +if arguments~logFile <> "" then log = .stream~new(arguments~logFile) + +parser = .myparser~new() +parser~debug = arguments~debug +parser~dump = arguments~dump +parser~log = log + +if arguments~dsssl then parser~target = "dsssl" +if arguments~xslt then parser~target = "xslt" + +if arguments~outputFile <> "" then do + parser~output = .stream~new(arguments~outputFile) + if parser~output~command("open write replace") <> "READY:" then do + log~lineout("[error] Error opening "arguments~outputFile) + log~lineout("[error] "parser~output~description) + return 1 + end +end + +signal on syntax -- The parser can abort by raising a syntax 4 (??? why only a "syntax" can be propagated automatically ???) +errortxt = parser~parse_file(arguments~inputFile) +if errortxt <> "" then do + log~lineout("[error] The XML parser returned "errortxt) + return 1 +end + +parser~check_stack_empty + +return 0 + +syntax: -- In fact, it's an abort, not a syntax error... + return 1 + +::requires 'arguments.rex' +::requires 'help.rex' +::requires 'myxmlparser.cls' + +------------------------------------------------------------------------------- +::class myparser subclass xmlparser +::attribute dump +::attribute elementsStack +::attribute log +::attribute output +::attribute target + +::method init + self~init:super + self~dump = .false + self~elementsStack = .Queue~new + self~log = .stderr + self~output = .stdout + self~target = "" + +::method start_element + use arg chunk + self~elementsStack~push(chunk) + if self~debug then self~output~charout('[start_element:'chunk~line':'chunk~col'[') + if self~dump then do + self~output~charout('<'chunk~tag) + if chunk~attr <> .nil then + do f over chunk~attr + self~output~charout(' 'f'="'self~xlatetext(chunk~attr[f])'"') + end + self~output~charout('>') + end + else do + self~output~charout('<'chunk~text'>') + end + if self~debug then self~output~charout(']start_element]') + return + +::method end_element + use arg chunk + self~check_endtag_validity(chunk) + if self~debug then self~output~charout('[end_element:'chunk~line':'chunk~col'[') + if self~dump then do + self~output~charout('</'chunk~tag'>') + end + else do + if chunk~text = '' then self~output~charout('</'chunk~tag'>') + end + if self~debug then self~output~charout(']end_element]') + self~elementsStack~pull + return + +::method passthrough + use arg chunk + if self~debug then self~output~charout('[passthrough:'chunk~line':'chunk~col'[') + if self~dump then do + self~output~charout('<'chunk~text'>') + end + else do + self~output~charout('<'chunk~text'>') + end + if self~debug then self~output~charout(']passthrough]') + return + +::method text + use arg chunk + if self~debug then self~output~charout('[text:'chunk~line':'chunk~col'[') + if self~dump then do + self~output~charout(chunk~text) + end + else do + self~output~charout(chunk~text) + end + if self~debug then self~output~charout(']text]') + return + +::method error + use arg err + self~log~lineout("[error] "err~text) + return + +::method xlatetext private + use arg text + /* + text = text~changestr('&', '&') -- always do this one first! + text = text~changestr('>', '>') + text = text~changestr('<', '<') + */ + return text + +::method check_endtag_validity + use arg chunk + loop + topChunk = self~elementsStack~peek + if topChunk == nil then do + self~log~lineout("[error] The elements stack is empty. Can't close "chunk~tag":"chunk~line':'chunk~col) + self~abort + end + if topChunk~tag == chunk~tag then return 1 + if topChunk~tag == "imagedata" then do + self~elementsStack~pull -- Known problem, imagedata not closed, remove it + iterate + end + if topChunk~tag == "colspec" then do + self~elementsStack~pull -- Known problem, colspec not closed, remove it + iterate + end + if topChunk~tag == chunk~tag then return 1 + self~log~lineout("[error] The closing tag does not match the last opened tag :") + self~log~lineout("[error] opened tag = "topChunk~tag":"topChunk~line':'topChunk~col) + self~log~lineout("[error] closing tag = "chunk~tag":"chunk~line':'chunk~col) + self~abort + end + +::method check_stack_empty + if self~elementsStack~isEmpty then return 1 + self~log~lineout("The elements stack is not empty.") + self~abort + +::method abort + self~log~lineout("[error] Aborting !") + raise syntax 4 -- Don't know what's the best here... I want to abort the program, but exit 1 does not work, raise user abort does not work, it seems that only raise syntax works... + + +------------------------------------------------------------------------------- +::class Arguments subclass CommonArguments + +::method init + use strict arg callType, arguments -- always an array + self~init:super(callType, arguments) + -- Return now if help requested + if self~help then return + + self~inputFile = "" + self~logFile = "" + self~outputFile = "" + + -- Process the options + loop i=1 to self~args~items + option = self~args[i] + if option~left(1) <> "-" then leave + select + when self~parseOption(option) then nop + otherwise do + self~errors~append("[error] Unknown option" option) + return + end + end + -- Return now if help requested + if self~help then return + end + + self~verifyOptions + if \self~errors~isEmpty then return + + -- Process the arguments + -- inputFile is mandatory + if i > self~args~items then do + self~errors~append("[error] <inputFile> is missing") + return + end + self~inputFile = self~args[i]~strip + i += 1 + + -- outputFile is optional + if i > self~args~items then return + self~outputFile = self~args[i]~strip + if self~outputFile~left(1) == "-" then do + self~errors~append("[error] Options are before <inputFilename>") + return + end + i += 1 + + -- logFile is optional + if i > self~args~items then return + self~logFile = self~args[i]~strip + if self~outputFile~left(1) == "-" then do + self~errors~append("[error] Options are before <inputFilename>") + return + end + i += 1 + + -- no more argument expected + if i > self~args~items then return + self~errors~append("[error] Unexpected arguments :" self~args~section(i)~toString("L", " ")) + return + Property changes on: incubator/DocMusings/makevalidxml/transformfile.rex ___________________________________________________________________ Added: svn:mergeinfo + This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jfa...@us...> - 2009-11-28 23:53:57
|
Revision: 5346 http://oorexx.svn.sourceforge.net/oorexx/?rev=5346&view=rev Author: jfaucher Date: 2009-11-28 23:53:41 +0000 (Sat, 28 Nov 2009) Log Message: ----------- The repetition separator (ex : comma in USE ARG) was not included. Fixed. Modified Paths: -------------- incubator/DocMusings/makevalidxml/_diary.txt incubator/DocMusings/makevalidxml/sdbnfizer.cls incubator/DocMusings/makevalidxml/sdparser.cls Modified: incubator/DocMusings/makevalidxml/_diary.txt =================================================================== --- incubator/DocMusings/makevalidxml/_diary.txt 2009-11-28 22:29:59 UTC (rev 5345) +++ incubator/DocMusings/makevalidxml/_diary.txt 2009-11-28 23:53:41 UTC (rev 5346) @@ -1,4 +1,11 @@ =============================================================================== +2009 november 29 + +Fixed a bug in the parser : The repetition separator (ex : comma in USE ARG) +was not included. + + +=============================================================================== 2009 november 8 Starting to work on a bridge with BNF4OOo Modified: incubator/DocMusings/makevalidxml/sdbnfizer.cls =================================================================== --- incubator/DocMusings/makevalidxml/sdbnfizer.cls 2009-11-28 22:29:59 UTC (rev 5345) +++ incubator/DocMusings/makevalidxml/sdbnfizer.cls 2009-11-28 23:53:41 UTC (rev 5346) @@ -254,7 +254,7 @@ Note : we loose the distinction between groupcomp and groupseq, so will need to rebuild it when parsing the bnf, based on the presence of spaces between elements (tricky). - Note : expression in repspep are not supported (not needed for ooRexx doc - currently) + Note : expression in repspep are not supported (needed for ooRexx doc - see USE ARG) */ if group~childs~firstItem~isA(.sdparser~RepSep) then do bnfizer~xmlstream~lineout("<loop>") Modified: incubator/DocMusings/makevalidxml/sdparser.cls =================================================================== --- incubator/DocMusings/makevalidxml/sdparser.cls 2009-11-28 22:29:59 UTC (rev 5345) +++ incubator/DocMusings/makevalidxml/sdparser.cls 2009-11-28 23:53:41 UTC (rev 5346) @@ -775,22 +775,25 @@ self~text = "" -::method parse +::method parseDelimitedPath forward class (super) continue + endtoken = result + self~simplify -- next loop will iterate on childs, better to simplify first buffer = .MutableBuffer~new -- For the time being, the repsep must be a simple text : -- iterate over the grammar elements that can be converted to text, and concatenate do child over self~childs select - when child.isA(.Kwd) then buffer~append(child~text) - when child.isA(.Var) then buffer~append(child~text) - when child.isA(.Characters) then buffer~append(child~text) + when child~isA(.Kwd) then buffer~append(child~text) + when child~isA(.Var) then buffer~append(child~text) + when child~isA(.Characters) then buffer~append(child~text) otherwise do self~parser~addError("[error] "child" is not supported in repsep") end end end self~text = buffer~string + return endtoken ------------------------------------------------------------------------------- This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jfa...@us...> - 2009-12-20 00:49:10
|
Revision: 5447 http://oorexx.svn.sourceforge.net/oorexx/?rev=5447&view=rev Author: jfaucher Date: 2009-12-20 00:49:03 +0000 (Sun, 20 Dec 2009) Log Message: ----------- bug fixes Modified Paths: -------------- incubator/DocMusings/makevalidxml/_diary.txt incubator/DocMusings/makevalidxml/transformdir.rex incubator/DocMusings/makevalidxml/transformfile.rex Modified: incubator/DocMusings/makevalidxml/_diary.txt =================================================================== --- incubator/DocMusings/makevalidxml/_diary.txt 2009-12-20 00:46:46 UTC (rev 5446) +++ incubator/DocMusings/makevalidxml/_diary.txt 2009-12-20 00:49:03 UTC (rev 5447) @@ -1,4 +1,13 @@ =============================================================================== +2009 december 19 +The log file was not correctly opened : must be APPEND SHARED NOBUFFER to ensure +that each new line is added at the end of the file. + +Fixed the transformation of a hierarchy of directories : must create each +intermediate directory (not only the outputDirectory given on command line). + + +=============================================================================== 2009 november 29 Fixed a bug in the parser : The repetition separator (ex : comma in USE ARG) Modified: incubator/DocMusings/makevalidxml/transformdir.rex =================================================================== --- incubator/DocMusings/makevalidxml/transformdir.rex 2009-12-20 00:46:46 UTC (rev 5446) +++ incubator/DocMusings/makevalidxml/transformdir.rex 2009-12-20 00:49:03 UTC (rev 5447) @@ -3,7 +3,7 @@ $sourcename [-debug] [-dsssl] [-dump] [-help] [-syntdiag] [-xslt] [-startat <filename>] - <inputDirectory> [<outputDirectory>] [<logFile>] + <inputDirectory> <outputDirectory> [<logFile>] Description : This script is intended to work on the XML files of the ooRexx doc. It iterates over the directories and files found in <inputDirectory> and @@ -36,7 +36,11 @@ end if arguments~help | \arguments~errors~isEmpty then return 1 -if arguments~logFile <> "" then log = .stream~new(arguments~logFile) +if arguments~logFile <> "" then do + log = .stream~new(arguments~logFile) + log~open("write replace") + log~open("write append shared nobuffer") +end -- Beware ! qualify has not the same behaviour under Windows and under Linux : -- Under Windows, the final slash is not removed @@ -57,7 +61,6 @@ call SysFileTree inputDirectory"*.sgml", "files", "FOS" if files.0 <> 0 then do - if createDirectoryVerbose(outputDirectory, log) < 0 then return 1 skip = arguments~startat do i=1 to files.0 fullpath = files.i @@ -66,12 +69,14 @@ return 1 end relativepath = fullpath~substr(inputDirectory~length + 1) + filepath = filespec("path", relativepath) filename = filespec("name", relativepath) if skip then if filename <> arguments~startatValue then iterate skip = .false log~lineout("[info] Processing file "fullpath) + if createDirectoryVerbose(outputDirectory || filepath, log) < 0 then return 1 call transformfile arguments~debugOption,, arguments~dssslOption,, arguments~dumpOption,, Modified: incubator/DocMusings/makevalidxml/transformfile.rex =================================================================== --- incubator/DocMusings/makevalidxml/transformfile.rex 2009-12-20 00:46:46 UTC (rev 5446) +++ incubator/DocMusings/makevalidxml/transformfile.rex 2009-12-20 00:49:03 UTC (rev 5447) @@ -76,7 +76,10 @@ end if arguments~help | \arguments~errors~isEmpty then return 1 -if arguments~logFile <> "" then log = .stream~new(arguments~logFile) +if arguments~logFile <> "" then do + log = .stream~new(arguments~logFile) + log~open("write append shared nobuffer") +end parser = .myparser~new() parser~debug = arguments~debug @@ -111,7 +114,7 @@ -- The file will be created later, when the first syntax diagram is created end --- signal on syntax -- The parser can abort by raising a syntax 4 (??? why only a "syntax" can be propagated automatically ???) +signal on syntax -- The parser can abort by raising a syntax 4 (??? why only a "syntax" can be propagated automatically ???) errortxt = parser~parse_file(arguments~inputFile) if errortxt <> "" then do log~lineout("[error] The XML parser returned "errortxt) @@ -293,7 +296,7 @@ xmlizer = self~xmlize_syntax_diagram(tokenizer, parser) if xmlizer~errorCount <> 0 then return .false - bnfizer = self~bnfize_syntax_diagram(tokenizer, parser) + -- bnfizer = self~bnfize_syntax_diagram(tokenizer, parser) -- if bnfizer <> .nil, bnfizer~errorCount <> 0 then return .false -- good, from here, we know that the syntax diagram has been converted to XML. This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jfa...@us...> - 2009-12-20 23:44:30
|
Revision: 5451 http://oorexx.svn.sourceforge.net/oorexx/?rev=5451&view=rev Author: jfaucher Date: 2009-12-20 23:44:21 +0000 (Sun, 20 Dec 2009) Log Message: ----------- More work on transformdir Modified Paths: -------------- incubator/DocMusings/makevalidxml/_diary.txt incubator/DocMusings/makevalidxml/transformdir.rex Modified: incubator/DocMusings/makevalidxml/_diary.txt =================================================================== --- incubator/DocMusings/makevalidxml/_diary.txt 2009-12-20 05:45:33 UTC (rev 5450) +++ incubator/DocMusings/makevalidxml/_diary.txt 2009-12-20 23:44:21 UTC (rev 5451) @@ -1,4 +1,14 @@ =============================================================================== +2009 december 20 + +transformdir iterates over all the files, not just *.sgml +The files other than *.sgml are copied if needed (date comparison), +except the .svn files. +The file *.sgml are transformed if needed (date comparison). +Added the option -doit + + +=============================================================================== 2009 december 19 The log file was not correctly opened : must be APPEND SHARED NOBUFFER to ensure that each new line is added at the end of the file. Modified: incubator/DocMusings/makevalidxml/transformdir.rex =================================================================== --- incubator/DocMusings/makevalidxml/transformdir.rex 2009-12-20 05:45:33 UTC (rev 5450) +++ incubator/DocMusings/makevalidxml/transformdir.rex 2009-12-20 23:44:21 UTC (rev 5451) @@ -1,20 +1,29 @@ /**** Usage : $sourcename - [-debug] [-dsssl] [-dump] [-help] [-syntdiag] [-xslt] + [-debug] [-dsssl] [-doit] [-dump] [-help] [-syntdiag] [-xslt] [-startat <filename>] <inputDirectory> <outputDirectory> [<logFile>] + Description : - This script is intended to work on the XML files of the ooRexx doc. + This script is intended to work on the files of the ooRexx doc. + It iterates over the directories and files found in <inputDirectory> and applies transformfile on the *.sgml files, using the options passed as parameters. The sgml files are written to <outputDirectory>, with the - same relative path. - By default, there is no transformation. + same relative path. + transformfile is called only when needed (date comparison). + + The files other than *.sgml are copied if needed (date comparison). + + By default, no action is performed, except listing the actions that would + be done if the option -doit was specified. + Options : -debug : Insert additional informations in the ouptut. A part is sent to stderr, another part is inserted in the XML output (making it non valid). + -doit : Perform the actions. -dsssl : Generate DocBook XML compatible with DSSSL. -dump : The elements and attributes are dumped without attempting to keep the original layout. @@ -59,39 +68,78 @@ return 1 end -call SysFileTree inputDirectory"*.sgml", "files", "FOS" -if files.0 <> 0 then do +say "Working..." +actionCount = 0 +call SysFileTree inputDirectory"*", "inputFiles", "FOS" +if inputFiles.0 <> 0 then do skip = arguments~startat - do i=1 to files.0 - fullpath = files.i - if fullpath~pos(inputDirectory) <> 1 then do - log~lineout("[error] Assert failed : fullpath does not start with <inputDirectory>") + do i=1 to inputFiles.0 + inputFile = inputFiles.i + + -- Files having ".svn" in their path are skipped + if inputFile~pos(".svn") <> 0 then iterate + + if inputFile~pos(inputDirectory) <> 1 then do + log~lineout("[error] Assert failed : inputFile does not start with <inputDirectory>") return 1 end - relativepath = fullpath~substr(inputDirectory~length + 1) - filepath = filespec("path", relativepath) - filename = filespec("name", relativepath) + relativeFile = inputFile~substr(inputDirectory~length + 1) + relativePath = filespec("path", relativeFile) + filename = filespec("name", relativeFile) if skip then if filename <> arguments~startatValue then iterate skip = .false - log~lineout("[info] Processing file "fullpath) - if createDirectoryVerbose(outputDirectory || filepath, log) < 0 then return 1 - call transformfile arguments~debugOption,, - arguments~dssslOption,, - arguments~dumpOption,, - arguments~syntdiagOption,, - arguments~xsltOption,, - fullpath,, - outputDirectory || relativepath,, - arguments~logFile - if result <> 0 then do - log~lineout("[error] Got an error while processing "fullpath) + -- if outputFile more recent than inputFile then nothing to do + inputFileLastUpdate = SysGetFileDateTime(inputFile, "W") + if inputFileLastUpdate == -1 then do + log~lineout("[error] Can't get last update time of "inputFile) return 1 end + outputFile = outputDirectory || relativeFile + outputFileLastUpdate = SysGetFileDateTime(outputFile, "W") + if outputFileLastUpdate <> -1, outputFileLastUpdate >>= inputFileLastUpdate then iterate + + actionCount += 1 + + if \ filespec("extension", inputFile)~caseLessEquals("sgml") then do + if arguments~doit then do + log~lineout("[info] Copying file "inputFile) + if createDirectoryVerbose(outputDirectory || relativePath, log) < 0 then return 1 + if SysFileCopy(inputFile, outputFile) <> 0 then do + log~lineout("[error] Can't make a copy of "inputFile) + return 1 + end + end + else log~lineout("[info] Would make a copy of "inputFile) + end + else do + if arguments~doit then do + log~lineout("[info] Processing file "inputFile) + if createDirectoryVerbose(outputDirectory || relativePath, log) < 0 then return 1 + call transformfile arguments~debugOption,, + arguments~dssslOption,, + arguments~dumpOption,, + arguments~syntdiagOption,, + arguments~xsltOption,, + inputFile,, + outputFile,, + arguments~logFile + if result <> 0 then do + log~lineout("[error] Got an error while processing "inputFile) + return 1 + end + end + else log~lineout("[info] Would process file "inputFile) + end end end +if \arguments~doit & actionCount <> 0 then do + say + say "Use the option -doit to really execute the actions" +end + return 0 ::requires 'arguments.cls' @@ -110,6 +158,7 @@ self~inputDirectory = "" self~logFile = "" self~outputDirectory = "" + self~doit = .false self~startat = .false -- Process the options @@ -118,6 +167,10 @@ if option~left(1) <> "-" then leave select when self~parseOption(option) then nop + when "-doit"~caseLessEquals(option) then do + self~doit = .true + self~startatOption = option + end when "-startat"~caseLessEquals(option) then do value = self~args[i+1] if value == "" | value~left(1) == "-" then do This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jfa...@us...> - 2010-01-04 00:42:05
|
Revision: 5473 http://oorexx.svn.sourceforge.net/oorexx/?rev=5473&view=rev Author: jfaucher Date: 2010-01-04 00:14:33 +0000 (Mon, 04 Jan 2010) Log Message: ----------- Improved kwd/var distinction : an identifier surrounded by quotes is a kwd. Added support for rexxgtk documentation : - files are with suffix .xml, not .sgml - support empty group with only repsep (ex : GTKTreeStore~set_value) - support repsep made of several elements (ex : GTKTreeStore~set_value) Modified Paths: -------------- incubator/DocMusings/makevalidxml/sdparser.cls incubator/DocMusings/makevalidxml/sdxmlizer.cls incubator/DocMusings/makevalidxml/transformdir.rex Modified: incubator/DocMusings/makevalidxml/sdparser.cls =================================================================== --- incubator/DocMusings/makevalidxml/sdparser.cls 2010-01-03 16:36:00 UTC (rev 5472) +++ incubator/DocMusings/makevalidxml/sdparser.cls 2010-01-04 00:14:33 UTC (rev 5473) @@ -294,7 +294,7 @@ do forever group = .Group~new(.nil, self~parser) token = group~parse(token) - if group~childs~isEmpty then leave + if group~childs~isEmpty & group~repsep == .nil then leave self~childs~append(group) end if token~isA(.sdtokenizer~EndOfStatement) then do @@ -344,7 +344,7 @@ do forever group = .Group~new(.nil, self~parser) token = group~parse(token) - if group~childs~isEmpty then leave + if group~childs~isEmpty & group~repsep == .nil then leave self~childs~append(group) end if token~isA(.sdtokenizer~EndOfFragment) then do @@ -445,6 +445,12 @@ else if token~leftToken <> .nil, token~leftToken~value == "~" then token = .Kwd~new(self, self~parser)~parse(token) -- Before a "(", we have a kwd (most of the time) else if token~rightToken <> .nil, token~rightToken~value == "(" then token = .Kwd~new(self, self~parser)~parse(token) + -- An identifier surrounded by quotes is a kwd + else if token~leftToken <> .nil, token~rightToken <> .nil,, + (token~leftToken~value == '"' & token~rightToken~value == '"'), + |, + (token~leftToken~value == "'" & token~rightToken~value == "'"), + then token = .Kwd~new(self, self~parser)~parse(token) -- The doc says "Variables appear in all lowercase letters" but this is not true... -- We have a lot of variables whose name is a mix of upper- and lowercase letters, so... else token = .Var~new(self, self~parser)~parse(token) @@ -675,7 +681,7 @@ do forever group = .Group~new(.nil, self~parser) token = group~parse(token) - if group~childs~isEmpty then leave + if group~childs~isEmpty & group~repsep == .nil then leave self~childs~append(group) if token~isA(endTokenClass) then do if \ token~isA(.sdtokenizer~l2rCrossroads) then leave @@ -726,6 +732,7 @@ ::method simplify if .t~istraced("simplify") then call trace .t~traceoption("simplify") use strict arg -- none + if self~repsep <> .nil then self~repsep = self~repsep~simplify group = self~simplify:super -- simplify each child separately select when group~repsep <> .nil then return group -- a group with repeat can't be simplified @@ -769,31 +776,19 @@ ------------------------------------------------------------------------------- ::class "RepSep" subclass "Group" - -::method init - forward class (super) continue - self~text = "" - - -::method parseDelimitedPath - forward class (super) continue - endtoken = result - self~simplify -- next loop will iterate on childs, better to simplify first - buffer = .MutableBuffer~new - -- For the time being, the repsep must be a simple text : - -- iterate over the grammar elements that can be converted to text, and concatenate - do child over self~childs - select - when child~isA(.Kwd) then buffer~append(child~text) - when child~isA(.Var) then buffer~append(child~text) - when child~isA(.Characters) then buffer~append(child~text) - otherwise do - self~parser~addError("[error] "child" is not supported in repsep") - end +::method simplify + if .t~istraced("simplify") then call trace .t~traceoption("simplify") + use strict arg -- none + self~simplify:super -- simplify the childs + if self~childs~items == 1 then do + child = self~childs~firstItem + if child~isA(.Kwd) | child~isA(.Characters) then do + -- not displayed in italic, so can be stored in text + self~text = child~text + self~childs~empty end end - self~text = buffer~string - return endtoken + return self ------------------------------------------------------------------------------- @@ -923,6 +918,16 @@ when self~text == "~" then self~kind = .Characters~oper when self~text == "~~" then self~kind = .Characters~oper when self~text == "->" then self~kind = .Characters~oper + when self~text == "+=" then self~kind = .Characters~oper + when self~text == "-=" then self~kind = .Characters~oper + when self~text == "*=" then self~kind = .Characters~oper + when self~text == "/=" then self~kind = .Characters~oper + when self~text == "%=" then self~kind = .Characters~oper + when self~text == "//=" then self~kind = .Characters~oper + when self~text == "||=" then self~kind = .Characters~oper + when self~text == "&=" then self~kind = .Characters~oper + when self~text == "|=" then self~kind = .Characters~oper + when self~text == "&&=" then self~kind = .Characters~oper when self~text == "," then self~kind = .Characters~sep when self~text == ";" then self~kind = .Characters~sep @@ -932,6 +937,7 @@ when self~text == ")" then self~kind = .Characters~delim when self~text == "[" then self~kind = .Characters~delim when self~text == "]" then self~kind = .Characters~delim + when self~text == '"' then self~kind = .Characters~delim otherwise self~kind = .Characters~sep end Modified: incubator/DocMusings/makevalidxml/sdxmlizer.cls =================================================================== --- incubator/DocMusings/makevalidxml/sdxmlizer.cls 2010-01-03 16:36:00 UTC (rev 5472) +++ incubator/DocMusings/makevalidxml/sdxmlizer.cls 2010-01-04 00:14:33 UTC (rev 5473) @@ -143,10 +143,24 @@ ::method serialize class use strict arg repsep, xmlizer - xmlizer~stream~lineout("<repsep" || self~attributes(repsep) || ">" || repsep~text || "</repsep>") - return .true + if repsep~childs~isEmpty then do + -- Concise representation + xmlizer~stream~lineout("<repsep" || self~attributes(repsep) || ">" || repsep~text || "</repsep>") + return .true + end + else return self~serialize:super(repsep, xmlizer) +::method opentag class + use strict arg group, xmlizer + xmlizer~stream~lineout("<repsep" || self~attributes(group) || ">") + + +::method closetag class + use strict arg group, xmlizer + xmlizer~stream~lineout("</repsep>") + + ------------------------------------------------------------------------------- ::class "FragRef" subclass "XMLSerializer" Modified: incubator/DocMusings/makevalidxml/transformdir.rex =================================================================== --- incubator/DocMusings/makevalidxml/transformdir.rex 2010-01-03 16:36:00 UTC (rev 5472) +++ incubator/DocMusings/makevalidxml/transformdir.rex 2010-01-04 00:14:33 UTC (rev 5473) @@ -9,12 +9,12 @@ This script is intended to work on the files of the ooRexx doc. It iterates over the directories and files found in <inputDirectory> and - applies transformfile on the *.sgml files, using the options passed - as parameters. The sgml files are written to <outputDirectory>, with the + applies transformfile on the *(.sgml|.xml) files, using the options passed + as parameters. The sgml|xml files are written to <outputDirectory>, with the same relative path. transformfile is called only when needed (date comparison). - The files other than *.sgml are copied if needed (date comparison). + The files other than *(.sgml|.xml) are copied if needed (date comparison). By default, no action is performed, except listing the actions that would be done if the option -doit was specified. @@ -102,7 +102,11 @@ actionCount += 1 - if \ filespec("extension", inputFile)~caseLessEquals("sgml") then do + isDocbookFile = , + filespec("extension", inputFile)~caseLessEquals("sgml") , + | , + filespec("extension", inputFile)~caseLessEquals("xml") & \ filespec("name", inputFile)~caseLessMatch(1, "sd_") + if \ isDocBookFile then do if arguments~doit then do log~lineout("[info] Copying file "inputFile) if createDirectoryVerbose(outputDirectory || relativePath, log) < 0 then return 1 This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jfa...@us...> - 2010-04-28 16:20:57
|
Revision: 5851 http://oorexx.svn.sourceforge.net/oorexx/?rev=5851&view=rev Author: jfaucher Date: 2010-04-28 16:20:50 +0000 (Wed, 28 Apr 2010) Log Message: ----------- Commit pending changes. Modified Paths: -------------- incubator/DocMusings/makevalidxml/_diary.txt incubator/DocMusings/makevalidxml/arguments.cls incubator/DocMusings/makevalidxml/sdtokenizer.cls incubator/DocMusings/makevalidxml/transformdir.rex incubator/DocMusings/makevalidxml/transformfile.rex Modified: incubator/DocMusings/makevalidxml/_diary.txt =================================================================== --- incubator/DocMusings/makevalidxml/_diary.txt 2010-04-28 16:19:12 UTC (rev 5850) +++ incubator/DocMusings/makevalidxml/_diary.txt 2010-04-28 16:20:50 UTC (rev 5851) @@ -1,4 +1,27 @@ =============================================================================== +2010 april 28 + +Fix a bug in the tokenizer, which improves the performances : some attributes +can be calculated on demand, and keep the same value once calculated. They +are implemented with a get method which tests if the attribute has been already +calculated or not. The bug was a wrong expression passed to the var() BIF : + var(my_attribute) +instead of + var ('my_attribute') +Because of that, the attribute value was always re-calculated. +The performance gain is about 30s on oodialog/dialogObject (3'55 instead of 4'30). + + +=============================================================================== +2010 march 4 + +Added option -reportlinks <linksFile> + +In case of error, touch the transformed file with a low date & time, to force +selection at next run. + + +=============================================================================== 2009 december 20 transformdir iterates over all the files, not just *.sgml Modified: incubator/DocMusings/makevalidxml/arguments.cls =================================================================== --- incubator/DocMusings/makevalidxml/arguments.cls 2010-04-28 16:19:12 UTC (rev 5850) +++ incubator/DocMusings/makevalidxml/arguments.cls 2010-04-28 16:20:50 UTC (rev 5851) @@ -1,17 +1,14 @@ ::requires 'string2args.rex' ::class CommonArguments public subclass Directory -::attribute args +::attribute argIndex -- current arg index during parsing +::attribute args -- array of arguments +::attribute errors + ::method init - self~setMethod("UNKNOWN", "return ''") -- I want '' instead of .nil when accessing an unset entry - self~debug = .false - self~dsssl = .false - self~dump = .false self~errors = .List~new - self~help = .false - self~syntdiag = .false - self~xslt = .false + self~initEntries -- Tokenize the arguments, if needed use strict arg callType, arguments -- always an array @@ -34,38 +31,96 @@ return end + -- Process the options + self~argIndex = 1 + do while self~argIndex <= self~args~items + option = self~args[self~argIndex] + if option~left(1) <> "-" then leave -- not an option, assume we have reached the end of the options + if self~parseOption(option) == .false then return + -- Return now if help requested + if self~help then return + end + self~verifyOptions + if \self~errors~isEmpty then return + + -- Process the arguments + self~parseArguments + + +::method initEntries + -- Entries in the directory, no need to declare them as attributes + self~setMethod("UNKNOWN", "return ''") -- I want '' instead of .nil when accessing an unset entry + self~debug = .false + self~dsssl = .false + self~dump = .false + self~help = .false + self~reportlinks = .false + self~syntdiag = .false + self~xslt = .false + + ::method parseOption use strict arg option - select - when "-debug"~caseLessEquals(option) then do - self~debug = .true - self~debugOption = option + if "-debug"~caseLessEquals(option) then do + self~argIndex += 1 + self~debug = .true + self~debugOption = option + return .true + end + if "-dsssl"~caseLessEquals(option) then do + self~argIndex += 1 + self~dsssl = .true + self~dssslOption = option + return .true + end + if "-dump"~caseLessEquals(option) then do + self~argIndex += 1 + self~dump = .true + self~dumpOption = option + return .true + end + if "-help"~caseLessEquals(option) then do + self~argIndex += 1 + self~help = .true + self~helpOption = option + return .true + end + if "-reportlinks"~caseLessEquals(option) then do + self~argIndex += 1 + self~reportlinks = .true + self~reportlinksOption = option + value = self~args[self~argIndex] + if value == .nil then value = "" + if value == "" | value~left(1) == "-" then do + self~errors~append("[error] Value expected for option "option) + return .false end - when "-dsssl"~caseLessEquals(option) then do - self~dsssl = .true - self~dssslOption = option + else do + self~argIndex += 1 + self~reportlinksValue = value + return .true end - when "-dump"~caseLessEquals(option) then do - self~dump = .true - self~dumpOption = option - end - when "-help"~caseLessEquals(option) then do - self~help = .true - self~helpOption = option - end - when "-syntdiag"~caseLessEquals(option) then do - self~syntdiag = .true - self~syntdiagOption = option - end - when "-xslt"~caseLessEquals(option) then do - self~xslt = .true - self~xsltOption = option - end - otherwise return 0 end - return 1 + if "-syntdiag"~caseLessEquals(option) then do + self~argIndex += 1 + self~syntdiag = .true + self~syntdiagOption = option + return .true + end + if "-xslt"~caseLessEquals(option) then do + self~argIndex += 1 + self~xslt = .true + self~xsltOption = option + return .true + end + self~errors~append("[error] Unknown option" option) + return .false + ::method verifyOptions - self~errors~empty if self~dsssl & self~xslt then self~errors~append("[error] You can't specify both "self~dssslOption" and "self~xsltOption) - return self~errors~isEmpty + + +::method parseArguments + -- Nothing to do here, will be specialized by subclasses + Modified: incubator/DocMusings/makevalidxml/sdtokenizer.cls =================================================================== --- incubator/DocMusings/makevalidxml/sdtokenizer.cls 2010-04-28 16:19:12 UTC (rev 5850) +++ incubator/DocMusings/makevalidxml/sdtokenizer.cls 2010-04-28 16:20:50 UTC (rev 5851) @@ -605,7 +605,7 @@ ::attribute l2rText get -- left to right expose l2rText - if var(l2rText) then return l2rText + if var('l2rText') then return l2rText l2rText = .MutableBuffer~new symbol = self do while symbol <> .nil @@ -618,7 +618,7 @@ ::attribute r2lText get -- right to left expose r2lText - if var(r2lText) then return r2lText + if var('r2lText') then return r2lText r2lText = .MutableBuffer~new symbol = self do while symbol <> .nil @@ -631,7 +631,7 @@ ::attribute b2tText get -- bottom to top expose b2tText - if var(b2tText) then return b2tText + if var('b2tText') then return b2tText b2tText = .MutableBuffer~new symbol = self do while symbol <> .nil @@ -644,7 +644,7 @@ ::attribute t2bText get -- top to bottom expose t2bText - if var(t2bText) then return t2bText + if var('t2bText') then return t2bText t2bText = .MutableBuffer~new symbol = self do while symbol <> .nil @@ -1261,7 +1261,7 @@ -- true if at least one L2R and no R2L paths are leaving from this token (except the main path) expose isl2rDispatcher if .t~istraced("isl2rDispatcher") then call trace .t~traceoption("isl2rDispatcher") - if var(isl2rDispatcher) then return isl2rDispatcher + if var('isl2rDispatcher') then return isl2rDispatcher parse value self~countHorizontalPathsAbove with r2lCountAbove l2rCountAbove parse value self~countHorizontalPathsBelow with r2lCountBelow l2rCountBelow l2rCount = l2rCountAbove + l2rCountBelow @@ -1274,7 +1274,7 @@ -- true if at least one R2L and no L2R paths are leaving from this token (except the main path) expose isr2lDispatcher if .t~istraced("isr2lDispatcher") then call trace .t~traceoption("isr2lDispatcher") - if var(isr2lDispatcher) then return isr2lDispatcher + if var('isr2lDispatcher') then return isr2lDispatcher parse value self~countHorizontalPathsAbove with r2lCountAbove l2rCountAbove parse value self~countHorizontalPathsBelow with r2lCountBelow l2rCountBelow l2rCount = l2rCountAbove + l2rCountBelow Modified: incubator/DocMusings/makevalidxml/transformdir.rex =================================================================== --- incubator/DocMusings/makevalidxml/transformdir.rex 2010-04-28 16:19:12 UTC (rev 5850) +++ incubator/DocMusings/makevalidxml/transformdir.rex 2010-04-28 16:20:50 UTC (rev 5851) @@ -3,6 +3,7 @@ $sourcename [-debug] [-dsssl] [-doit] [-dump] [-help] [-syntdiag] [-xslt] [-startat <filename>] + [-reportlinks <linksFile>] <inputDirectory> <outputDirectory> [<logFile>] Description : @@ -24,9 +25,15 @@ stderr, another part is inserted in the XML output (making it non valid). -doit : Perform the actions. - -dsssl : Generate DocBook XML compatible with DSSSL. + -dsssl : Generate DocBook XML compatible with DSSSL (default). -dump : The elements and attributes are dumped without attempting to keep the original layout. + -reportlinks <linksFile> : + Create/reset the file <linksFile>, then write in it the links that + have several words in their child text. Such links are known to + bring troubles when they are at the boundary of two pages. + Note : it's recommended to use a non-existent <outputDirectory> + to ensure that all the files are processed. -startat : Lets start the iteration at <filename>. Useful when you have to bypass errors in the XML files and restart the iteration. -syntdiag : Replace textual syntax diagrams by a reference to an image (the @@ -124,13 +131,15 @@ call transformfile arguments~debugOption,, arguments~dssslOption,, arguments~dumpOption,, + arguments~reportlinksOption, arguments~reportlinksValue,, arguments~syntdiagOption,, arguments~xsltOption,, inputFile,, outputFile,, arguments~logFile if result <> 0 then do - log~lineout("[error] Got an error while processing "inputFile) + log~lineout("[info] Got an error while processing "inputFile) + call SysSetFileDateTime outputFile, "2000-01-01", "00:00:00" -- touch with a low date & time, to force selection at next run return 1 end end @@ -155,81 +164,74 @@ ------------------------------------------------------------------------------- ::class Arguments subclass CommonArguments -::method init - use strict arg callType, arguments -- always an array - self~init:super(callType, arguments) - -- Return now if help requested - if self~help then return - +::method initEntries + self~initEntries:super self~inputDirectory = "" self~logFile = "" self~outputDirectory = "" self~doit = .false self~startat = .false + - -- Process the options - loop i=1 to self~args~items - option = self~args[i] - if option~left(1) <> "-" then leave - select - when self~parseOption(option) then nop - when "-doit"~caseLessEquals(option) then do - self~doit = .true - self~startatOption = option - end - when "-startat"~caseLessEquals(option) then do - value = self~args[i+1] - if value == "" | value~left(1) == "-" then do - self~errors~append("[error] Value expected for option "option) - end - self~startat = .true - self~startatOption = option - self~startatValue = value - i += 1 - end - otherwise do - self~errors~append("[error] Unknown option" option) - return - end +::method parseOption + use strict arg option + if "-doit"~caseLessEquals(option) then do + self~argIndex += 1 + self~doit = .true + self~startatOption = option + return .true + end + if "-startat"~caseLessEquals(option) then do + self~argIndex += 1 + self~startat = .true + self~startatOption = option + value = self~args[self~argIndex] + if value == .nil then value = "" + if value == "" | value~left(1) == "-" then do + self~errors~append("[error] Value expected for option "option) + return .false end - -- Return now if help requested - if self~help then return + else do + self~argIndex += 1 + self~startatValue = value + return .true + end end + return self~parseOption:super(option) + - self~verifyOptions - if \self~errors~isEmpty then return - - -- Process the arguments +::method parseArguments -- inputDirectory is mandatory - if i > self~args~items then do + if self~argIndex > self~args~items then do self~errors~append("[error] <inputDirectory> is missing") return end - self~inputDirectory = self~args[i]~strip - i += 1 + self~inputDirectory = self~args[self~argIndex]~strip + self~argIndex += 1 -- outputDirectory is mandatory - if i > self~args~items then do + if self~argIndex > self~args~items then do self~errors~append("[error] <outputDirectory> is missing") return end - self~outputDirectory = self~args[i]~strip + self~outputDirectory = self~args[self~argIndex]~strip if self~outputDirectory~left(1) == "-" then do - self~errors~append("[error] Options are before <inputFilename>") + self~errors~append("[error] Options are before <inputDirectory>") return end - i += 1 + self~argIndex += 1 -- logFile is optional - if i > self~args~items then return - self~logFile = self~args[i]~strip + if self~argIndex > self~args~items then return + self~logFile = self~args[self~argIndex]~strip if self~logFile~left(1) == "-" then do - self~errors~append("[error] Options are before <inputFilename>") + self~errors~append("[error] Options are before <inputDirectory>") return end - i += 1 + self~argIndex += 1 -- no more argument expected - if i > self~args~items then return - self~errors~append("[error] Unexpected arguments :" self~args~section(i)~toString("L", " ")) + if self~argIndex > self~args~items then return + self~errors~append("[error] Unexpected arguments :" self~args~section(self~argIndex)~toString("L", " ")) return + Modified: incubator/DocMusings/makevalidxml/transformfile.rex =================================================================== --- incubator/DocMusings/makevalidxml/transformfile.rex 2010-04-28 16:19:12 UTC (rev 5850) +++ incubator/DocMusings/makevalidxml/transformfile.rex 2010-04-28 16:20:50 UTC (rev 5851) @@ -42,14 +42,16 @@ /**** Usage : $sourcename - [-debug] [-dsssl] [-dump] [-help] [-syntdiag] [-xslt] + [-debug] [-dsssl] [-dump] [-help] [-syntdiag] [-xslt] + [-reportlinks <linksFile>] <inputFile> [<outputFile> [<logFile>]] Description : This script is intended to work on the XML files of the ooRexx doc. It reads the file <inputFile>, parses it and writes the transformed XML in - the file <outputFile>. + the file <outputFile> (or stdout if no outputFile). By default, there is no transformation and the layout of the output file is kept the most similar possible to the layout of the input. + Options : -debug : Insert additional informations in the ouptut. A part is sent to stderr, another part is inserted in the XML output (making it @@ -59,6 +61,10 @@ keep the original layout. When used with -syntdiag, the internal structures of the parser are dumped in the sd_<file>.xml. + -reportlinks <linksFile> : + Appends in the file <linksFile> the links having several words in + their child text. Such links are known to bring troubles when they + are at the boundary of two pages. -syntdiag : Replace textual syntax diagrams by a reference to an image (the name of the image is derived from the enclosing DocBook section). And generate an XML syntax diagram file that will be processed @@ -91,9 +97,9 @@ if arguments~outputFile <> "" then do parser~output = .stream~new(arguments~outputFile) - if parser~output~command("open write replace") <> "READY:" then do - log~lineout("[error] Error opening "arguments~outputFile) - log~lineout("[error] "parser~output~description) + if parser~output~command("open write replace shared") <> "READY:" then do + parser~logErr("[error] Error opening "arguments~outputFile) + parser~logTxt("[error] "parser~output~description) return 1 end parser~outputFile = arguments~outputFile @@ -103,10 +109,10 @@ parser~syntdiag = .true -- The name of the syntax diagram file is derived from the output file, if any -- Otherwise use the default name - if arguments~outputFile <> "" then do -- Don't use parser~outputFile here ! Its default value is "stdout", not "" - location = filespec("location", arguments~outputFile) - nameSuffix = filespec("name", arguments~outputFile) - suffix = filespec("extension", arguments~outputFile) + if parser~outputFile~caselessEquals("stdout") == .false then do + location = filespec("location", parser~outputFile) + nameSuffix = filespec("name", parser~outputFile) + suffix = filespec("extension", parser~outputFile) name = nameSuffix~left(nameSuffix~length - suffix~length - 1) parser~syntdiagBasename = "sd_" || name parser~syntdiagOutputFile = location || parser~syntdiagBasename || ".xml" @@ -114,10 +120,21 @@ -- The file will be created later, when the first syntax diagram is created end +if arguments~reportlinks then do + parser~links = .stream~new(arguments~reportlinksValue) + if parser~links~command("open write append shared nobuffer") <> "READY:" then do + parser~logErr("[error] Error opening "arguments~reportlinksValue) + parser~logTxt("[error] "parser~links~description) + return 1 + end +end + +parser~inputFile = arguments~inputFile signal on syntax -- The parser can abort by raising a syntax 4 (??? why only a "syntax" can be propagated automatically ???) errortxt = parser~parse_file(arguments~inputFile) +if parser~output <> .stdout then parser~output~close -- must close explicitely, otherwise the touch in case of error will fail if errortxt <> "" then do - log~lineout("[error] The XML parser returned "errortxt) + parser~logErr("[error] The XML parser returned "errortxt) return 1 end @@ -126,14 +143,16 @@ parser~syntdiagOutput~close end -parser~check_stack_empty +if parser~check_stack_empty == .false then return 1 -- Convert the syntax diagrams to images if parser~syntdiagOutput <> .nil then call sd2image parser~syntdiagOutputFile +if parser~errorCount <> 0 then return 1 return 0 syntax: -- In fact, it's an abort, not a syntax error... + if parser~output <> .stdout then parser~output~close -- must close explicitely, otherwise the touch in case of error will fail return 1 ::requires 'arguments.cls' @@ -152,6 +171,8 @@ ::attribute documentNode ::attribute dump ::attribute elementsStack +::attribute errorCount +::attribute inputFile ::attribute log ::attribute output ::attribute outputFile @@ -161,6 +182,7 @@ ::attribute syntdiagOutput ::attribute syntdiagOutputFile ::attribute target +::attribute links ::method init @@ -168,6 +190,8 @@ self~documentNode = .Node~new(.nil) -- Toplevel title is "" self~dump = .false self~elementsStack = .Queue~new + self~errorCount = 0 + self~links = .nil self~log = .stderr self~output = .stdout self~outputFile = "stdout" @@ -232,15 +256,43 @@ if self~debug then self~output~charout('[text:'chunk~line':'chunk~col'[') self~output~charout(chunk~text) if self~debug then self~output~charout(']text]') + + if self~links <> .nil then do + if self~parent == .nil then return + parentChunk = self~parent~chunk + if parentChunk == .nil then return + if parentChunk~tag == "link" then do + chunkText = chunk~text~changeStr(d2c(10), " ")~changeStr(d2c(13), " ") + if chunkText~words <= 1 then return + self~links~charout(self~inputFile" ; "parentChunk~line" ; "parentChunk~col" ;") + do w = 1 to chunkText~words + self~links~charout(" "chunkText~word(w)) + end + self~links~lineout("") + end + end return + +::method logTxt + use strict arg text + self~log~lineout(text) + return + +::method logErr + use strict arg text + self~logTxt(text) + self~errorCount += 1 + return + + ::method error use strict arg err - self~log~lineout("[error] "err~text) + self~logErr("[error] "err~text) return - + ::method xlatetext private use strict arg text /* @@ -256,7 +308,7 @@ loop topNode = self~elementsStack~peek if topNode == .nil then do - self~log~lineout("[error] The elements stack is empty. Can't close "chunk~tag":"chunk~line':'chunk~col) + self~logErr("[error] The elements stack is empty. Can't close "chunk~tag":"chunk~line':'chunk~col) self~abort end if topNode~chunk~tag == chunk~tag then return 1 @@ -268,17 +320,17 @@ self~elementsStack~pull -- Known problem, colspec not closed, remove it iterate end - self~log~lineout("[error] The closing tag does not match the last opened tag :") - self~log~lineout("[error] opened tag = "topNode~chunk~tag":"topNode~chunk~line':'topNode~chunk~col) - self~log~lineout("[error] closing tag = "chunk~tag":"chunk~line':'chunk~col) + self~logErr("[error] The closing tag does not match the last opened tag :") + self~logTxt("[error] opened tag = "topNode~chunk~tag":"topNode~chunk~line':'topNode~chunk~col) + self~logTxt("[error] closing tag = "chunk~tag":"chunk~line':'chunk~col) self~abort end ::method check_stack_empty - if self~elementsStack~isEmpty then return 1 - self~log~lineout("[error] The elements stack is not empty.") - self~abort + if self~elementsStack~isEmpty then return .true + self~logErr("[error] The elements stack is not empty.") + return .false ::method transform_syntax_diagram @@ -314,9 +366,9 @@ -- From here, we know that this cdata contains a textual syntax diagram if self~syntdiagOutput == .nil then do self~syntdiagOutput = .stream~new(self~syntdiagOutputFile) - if self~syntdiagOutput~command("open write replace") <> "READY:" then do - self~log~lineout("[error] Error opening "self~syntdiagOutputFile) - self~log~lineout("[error] "self~syntdiagOutput~description) + if self~syntdiagOutput~command("open write replace shared") <> "READY:" then do + self~logErr("[error] Error opening "self~syntdiagOutputFile) + self~logTxt("[error] "self~syntdiagOutput~description) self~abort end self~syntdiagOutput = .IndentedStream~new(self~syntdiagOutput) @@ -346,7 +398,7 @@ self~syntdiagOutput~lineout("]]>") self~syntdiagOutput~lineout("") - self~log~lineout("[error] Syntax diagram tokenization failed for "tokenizer~name) + self~logErr("[error] Syntax diagram tokenization failed for "tokenizer~name) -- not abort because we can continue by inserting the textual sd end return tokenizer @@ -366,7 +418,7 @@ self~syntdiagOutput~lineout("]]>") self~syntdiagOutput~lineout("") - self~log~lineout("[error] Syntax diagram parsing failed for "tokenizer~name) + self~logErr("[error] Syntax diagram parsing failed for "tokenizer~name) -- not abort because we can continue by inserting the textual sd end return parser @@ -391,7 +443,7 @@ end if xmlizer~errorCount <> 0 then do - self~log~lineout("[error] Syntax diagram XML generation failed for "tokenizer~name) + self~logErr("[error] Syntax diagram XML generation failed for "tokenizer~name) -- not abort because we can continue by inserting the textual sd end return xmlizer @@ -408,7 +460,7 @@ self~syntdiagOutput~lineout("") if bnfizer~errorCount <> 0 then do - self~log~lineout("[error] Syntax diagram BNF generation failed for "tokenizer~name) + self~logErr("[error] Syntax diagram BNF generation failed for "tokenizer~name) -- not abort because we can continue by inserting the textual sd end return bnfizer @@ -516,6 +568,13 @@ if self~elementsStack~hasIndex(2) then self~elementsStack~at(2)~title = chunk~text +::method parent + use strict arg -- none + index = self~elementsStack~first + if index == .nil then return self~documentNode + return self~elementsStack~at(index) + + ::method parent_with_title use strict arg number index = self~elementsStack~first @@ -531,7 +590,7 @@ ::method abort - self~log~lineout("[error] Aborting !") + self~logErr("[error] Aborting !") -- Don't know what's the best here... I want to abort the program, but exit 1 does not work, raise user abort does not work, it seems that only raise syntax works... raise syntax 4 -- ABORT @@ -551,64 +610,43 @@ ------------------------------------------------------------------------------- ::class Arguments subclass CommonArguments -::method init - use strict arg callType, arguments -- always an array - self~init:super(callType, arguments) - -- Return now if help requested - if self~help then return - +::method initEntries + self~initEntries:super self~inputFile = "" self~logFile = "" self~outputFile = "" - - -- Process the options - loop i=1 to self~args~items - option = self~args[i] - if option~left(1) <> "-" then leave - select - when self~parseOption(option) then nop - otherwise do - self~errors~append("[error] Unknown option" option) - return - end - end - -- Return now if help requested - if self~help then return - end - - self~verifyOptions - if \self~errors~isEmpty then return - - -- Process the arguments + + +::method parseArguments -- inputFile is mandatory - if i > self~args~items then do + if self~argIndex > self~args~items then do self~errors~append("[error] <inputFile> is missing") return end - self~inputFile = self~args[i]~strip - i += 1 + self~inputFile = self~args[self~argIndex]~strip + self~argIndex += 1 -- outputFile is optional - if i > self~args~items then return - self~outputFile = self~args[i]~strip + if self~argIndex > self~args~items then return + self~outputFile = self~args[self~argIndex]~strip if self~outputFile~left(1) == "-" then do self~errors~append("[error] Options are before <inputFilename>") return end - i += 1 + self~argIndex += 1 -- logFile is optional - if i > self~args~items then return - self~logFile = self~args[i]~strip + if self~argIndex > self~args~items then return + self~logFile = self~args[self~argIndex]~strip if self~outputFile~left(1) == "-" then do self~errors~append("[error] Options are before <inputFilename>") return end - i += 1 + self~argIndex += 1 -- no more argument expected - if i > self~args~items then return - self~errors~append("[error] Unexpected arguments :" self~args~section(i)~toString("L", " ")) + if self~argIndex > self~args~items then return + self~errors~append("[error] Unexpected arguments :" self~args~section(self~argIndex)~toString("L", " ")) return This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |