[x3d-public] Possible issue with X3dToPython.xslt, newly tested file from X3D4WA: need x3d.py python support for Script CDATA

Brutzman, Donald (Don) (CIV) brutzman at nps.edu
Sat Jan 15 11:12:14 PST 2022


I've got X3DUOM and Java working on my machine.  Python, X3D Ontology and Tooltips next.

John, can we please change the JSON encoding to use "sourceCode" instead of sourceText for consistency?  I don't think there is any need for synonyms or backwards compatibility, the encoding hasn't been formalized yet and (someday) JSON Schema will help people confirm correctness.


  *   X3D to JSON Stylesheet Converter: Data Types
  *   https://www.web3d.org/x3d/stylesheets/X3dToJson.html#DataTypes

Embedded source code for
Script<https://www.web3d.org/x3d/content/X3dTooltips.html#Script>, ShaderPart<https://www.web3d.org/x3d/content/X3dTooltips.html#ShaderPart> and ShaderProgram<https://www.web3d.org/x3d/content/X3dTooltips.html#ShaderProgram> nodes
CDATA (Character DATA) section
<[CDATA[ "world wild Web!" ]]>
"#sourceText" string array containing original code, possibly escaped


all the best, Don
--
Don Brutzman  Naval Postgraduate School, Code USW/Br        brutzman at nps.edu
Watkins 270,  MOVES Institute, Monterey CA 93943-5000 USA    +1.831.656.2149
X3D graphics, virtual worlds, Navy robotics https:// faculty.nps.edu/brutzman

From: John Carlson <yottzumm at gmail.com>
Sent: Friday, January 14, 2022 5:25 AM
To: Brutzman, Donald (Don) (CIV) <brutzman at nps.edu>
Cc: X3D Graphics public mailing list <x3d-public at web3d.org>
Subject: Re: Possible issue with X3dToPython.xslt, newly tested file from X3D4WA: need x3d.py python support for Script CDATA

I finally got a chance to think about this, and I think it will be good to support legacy files by providing a synonym for "#sourceText"-"sourceCode" as you say.   If a particular binding can't provide for #sourceText, then sourceCode can be used as a fallback.

We can discuss changes to the JSON WD Draft at some point.

We will have to update X3D JSON schema as previously discussed implicitly.

John

On Tue, Jan 11, 2022 at 1:03 AM Brutzman, Donald (Don) (CIV) <brutzman at nps.edu<mailto:brutzman at nps.edu>> wrote:
1. Following some initial testing, am happy to report that this approach to embed source code in Script nodes seems consistently feasible for X3DUOM, Python, Java and X3D Ontology all at once.

It will take a little work to fully implement, but it should improve the expressive power (meaning "fix a hole") in each of our programming-language bindings.

------

2. In some sense embedding script code is already possible - you can put such a program in first string contained in a Script url list - but in practice that tends to be quite difficult because then all sorts of obfuscating escaping of special characters has to take place.

So having a separate place for source-code blocks is very helpful.  The X3D Architecture recognizes this possibility and defines corresponding behaviors.  Further details can be found in X3D XML Encoding.

* X3D4 Architecture, clause 19 Scripting component, 29.4.1 Script
* https://www.web3d.org/specifications/X3Dv4Draft/ISO-IEC19775-1v4-CD1/Part01/components/scripting.html#Script

* X3D4 Architecture, 9.2.3 Scripting language protocols
   https://www.web3d.org/specifications/X3Dv4Draft/ISO-IEC19775-1v4-CD1/Part01/components/networking.html#ScriptingLanguageProtocols

* X3D XML Encoding, Clause 4 Concepts, 4.3.13 Encapsulating Script node code
   https://www.web3d.org/documents/specifications/19776-1/V3.3/Part01/concepts.html#EncapsulatingScriptNodeCode

   "If both a url field and a CDATA clause are encountered, the url field is processed first. Thus, the CDATA construct can also be considered equivalent to one additional value appended to the url MFString array. This ordering allows an online script code url to take priority over fallback default script code in the CDATA construct. This ordering also allows run-time updates if a viewer is connected to the network, if so desired by the originating author."

------

3. Next - naming.  "CDATA" is pretty obscure as a field name, especially since that is an XML datatype (for Character Data).  Thus am thinking "sourceCode" might be a better name...  what do you think?

The ability to embed safe scripting code within any X3D Script is a powerful capability that also improves security possibilities for advanced X3D... it is easier to secure and safely transport an embedded script than it is to have multiple files handled safely.

John, it looks like we already did something just like this in the JSON encoding, we called it "sourceText", excerpt follows.  (Excessive string quoting was necessary to pass JSON parsing rules for multiline text.)

----------------------------------------------------------------------------------------------------------------------------------------------
* https://X3dGraphics.com/examples/X3dForWebAuthors/Chapter14Prototypes/MaterialModulator.json<https://nam10.safelinks.protection.outlook.com/?url=https%3A%2F%2Fx3dgraphics.com%2Fexamples%2FX3dForWebAuthors%2FChapter14Prototypes%2FMaterialModulator.json&data=04%7C01%7Cbrutzman%40nps.edu%7C015d3b7123844f4c7d7508d9d761502e%7C6d936231a51740ea9199f7578963378e%7C0%7C0%7C637777635530499448%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C3000&sdata=nBWBGWktMkBVA9XkqojDDqLZFbYrEIb3%2FGYH0za3FG0%3D&reserved=0>

                    { "Script":
                      {
[....]
                        "#sourceText":[
"",
"",
"ecmascript:",
"function initialize ()",
"{",
"    newColor = diffuseColor; // start with original color",
"}",
"function clockTrigger (timeValue)",
"{",
"    if (!enabled) return;",
"    red   = newColor.r;",
"    green = newColor.g;",
"    blue  = newColor.b;",
"",
"    // note different modulation rates for each color component, % is modulus operator",
"    newColor = new SFColor ((red + 0.02) % 1, (green + 0.03) % 1, (blue + 0.04) % 1);",
"\tif (enabled)",
"\t{",
"\t\tBrowser.print ('diffuseColor=(' + red +',' + green + ',' + blue + ') newColor=' + newColor.toString() + '\n');",
"\t}",
"}",
"function set_enabled (newValue)",
"{",
"\tenabled = newValue;",
"}",
"",
""
]
----------------------------------------------------------------------------------------------------------------------------------------------
Which in the .x3d XML CDATA simply looks like

        <Script DEF='MaterialModulatorScript'>
          <field accessType='inputOutput' name='enabled' type='SFBool'/>
          <field accessType='inputOutput' name='diffuseColor' type='SFColor'/>
          <field accessType='outputOnly' name='newColor' type='SFColor'/>
          <field accessType='inputOnly' name='clockTrigger' type='SFTime'/>
          <IS>
            <connect nodeField='enabled' protoField='enabled'/>
            <connect nodeField='diffuseColor' protoField='diffuseColor'/>
          </IS>
          <![CDATA[
ecmascript:
function initialize ()
{
    newColor = diffuseColor; // start with original color
}
function clockTrigger (timeValue)
{
    if (!enabled) return;
    red   = newColor.r;
    green = newColor.g;
    blue  = newColor.b;

    // note different modulation rates for each color component, % is modulus operator
    newColor = new SFColor ((red + 0.02) % 1, (green + 0.03) % 1, (blue + 0.04) % 1);
        if (enabled)
        {
                Browser.print ('diffuseColor=(' + red +',' + green + ',' + blue + ') newColor=' + newColor.toString() + '\n');
        }
}
function set_enabled (newValue)
{
        enabled = newValue;
}
]]>
        </Script>

----------------------------------------------------------------------------------------------------------------------------------------------

So this possibility is a cool prospect, again thanks for flagging it.  I'll work further on X3DUOM and Python, Java, OWL compatibility next.

Have fun with X3D!  8)

all the best, Don
--
Don Brutzman  Naval Postgraduate School, Code USW/Br        brutzman at nps.edu<mailto:brutzman at nps.edu>
Watkins 270,  MOVES Institute, Monterey CA 93943-5000 USA    +1.831.656.2149
X3D graphics, virtual worlds, navy robotics https:// faculty.nps.edu/brutzman<http://faculty.nps.edu/brutzman>

-----Original Message-----
From: Brutzman, Donald (Don) (CIV) <brutzman at nps.edu<mailto:brutzman at nps.edu>>
Sent: Monday, January 10, 2022 6:37 PM
To: John Carlson <yottzumm at gmail.com<mailto:yottzumm at gmail.com>>
Cc: X3D Graphics public mailing list <x3d-public at web3d.org<mailto:x3d-public at web3d.org>>; Brutzman, Donald (Don) (CIV) <brutzman at nps.edu<mailto:brutzman at nps.edu>>
Subject: RE: Possible issue with X3dToPython.xslt, newly tested file from X3D4WA: need x3d.py python support for Script CDATA

Thanks for the interesting trouble report John.

No changes needed to original X3D model, it passes all X3D Validator tests (though X3D Schematron provides a few warnings).

* https://X3dGraphics.com/examples/X3dForWebAuthors/Chapter14Prototypes/MaterialModulator.x3d<https://nam10.safelinks.protection.outlook.com/?url=https%3A%2F%2Fx3dgraphics.com%2Fexamples%2FX3dForWebAuthors%2FChapter14Prototypes%2FMaterialModulator.x3d&data=04%7C01%7Cbrutzman%40nps.edu%7C015d3b7123844f4c7d7508d9d761502e%7C6d936231a51740ea9199f7578963378e%7C0%7C0%7C637777635530499448%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C3000&sdata=A57o96EWq%2B5YUt%2FtG81jPRexgtCi4BvN%2BnhpTrgV4OQ%3D&reserved=0>
* https://savage.nps.edu/X3dValidator

XMLSpy was stricter about type handling than our Java-based Saxon10 conversions for this example.  XMLSpy diagnosed some problems that I fixed.

After also fixing the stylesheet name provided by a diagnostic, all X3dToPython.xslt changes were checked into subversion.

I now get the following conversion error:

=====================
create python:
C:\x3d-code\www.web3d.org<http://www.web3d.org>\x3d\content\examples\X3dForWebAuthors/Chapter14Prototypes//MaterialModulator.x3d processing with X3dToPython stylesheet...
*** TODO x3d.py and X3dToPython.xslt need to handle embedded CDATA source code for Script C:\x3d-code\www.web3d.org<http://www.web3d.org>\x3d\content\examples\X3dForWebAuthors/Chapter14Prototypes//MaterialModulator.py self-validation tests...
validate python:
  File "C:\x3d-code\www.web3d.org<http://www.web3d.org>\x3d\content\examples\X3dForWebAuthors\Chapter14Prototypes\MaterialModulator.py", line 74
    *** TODO x3d.py and X3dToPython.xslt need to handle embedded CDATA source code for Script
      ^
SyntaxError: invalid syntax
Result: 1
===================================

So, embedded CDATA scripting code inside a Script node (and similar Shader nodes) remains an omission in our Python support.

To remedy this, we need to create a special field in the X3DPSAIL class Script.  *What shall we call it?*  Creating a Script member named CDATA seems unambiguous and eponymous with the XML encoding...

* X3D Tooltips, Script and Script url
   https://www.web3d.org/x3d/tooltips/X3dTooltips.html#Script
   https://www.web3d.org/x3d/tooltips/X3dTooltips.html#Script.url

* X3D Tooltips, XML Data Types
   https://www.web3d.org/x3d/tooltips/X3dTooltips.html#XML

" CDATA is an XML term for Character Data. The base type for all XML attributes consists of string-based CDATA characters. CDATA is used throughout the X3D DOCTYPE definitions, which can only check for the presence of legal strings and thus are not able to validate numeric type information. XML Schema provides stricter validation based on data types."

* XML, 2.4 Character Data and Markup
   https://www.w3.org/TR/REC-xml/#syntax<https://nam10.safelinks.protection.outlook.com/?url=https%3A%2F%2Fwww.w3.org%2FTR%2FREC-xml%2F%23syntax&data=04%7C01%7Cbrutzman%40nps.edu%7C015d3b7123844f4c7d7508d9d761502e%7C6d936231a51740ea9199f7578963378e%7C0%7C0%7C637777635530499448%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C3000&sdata=biLfaypaJLVx%2BbLUJycGeGJcGNvsOlc%2FV0NtjL7vNHA%3D&reserved=0>

all the best, Don
--
Don Brutzman  Naval Postgraduate School, Code USW/Br        brutzman at nps.edu<mailto:brutzman at nps.edu>
Watkins 270,  MOVES Institute, Monterey CA 93943-5000 USA    +1.831.656.2149
X3D graphics, virtual worlds, navy robotics https:// faculty.nps.edu/brutzman<http://faculty.nps.edu/brutzman>

-----Original Message-----
From: John Carlson <yottzumm at gmail.com<mailto:yottzumm at gmail.com>>
Sent: Monday, January 10, 2022 4:06 PM
To: Brutzman, Donald (Don) (CIV) <brutzman at nps.edu<mailto:brutzman at nps.edu>>; X3D Graphics public mailing list <x3d-public at web3d.org<mailto:x3d-public at web3d.org>>
Subject: Possible issue with X3dToPython.xslt, newly tested file from X3D4WA

X3D XML file attached.  From X3DJSONLD's maven build log:

[INFO] --- xml-maven-plugin:1.0.2:transform (default) @ X3DJSONLD --- [INFO] Transforming file:
/home/coderextreme/X3DJSONLD/src/main/data/MaterialModulatorExamples.x3d
[INFO] Transforming file:
/home/coderextreme/X3DJSONLD/src/main/data/MaterialModulator.x3d
Type error at char 37 in xsl:value-of/@select on line 610 column 120 of
X3dToPython.xslt:
   XPTY0004: A sequence of more than one item is not allowed as the first argument of
   normalize-space() ("", "", ...)
   at xsl:apply-templates
(file:/home/coderextreme/X3DJSONLD/src/main/lib/stylesheets/X3dToPython.xslt#606)
      processing /X3D/Scene[1]/ProtoDeclare[1]/ProtoBody[1]/Script[1]
   at xsl:apply-templates
(file:/home/coderextreme/X3DJSONLD/src/main/lib/stylesheets/X3dToPython.xslt#606)
      processing /X3D/Scene[1]/ProtoDeclare[1]/ProtoBody[1]
   at xsl:apply-templates
(file:/home/coderextreme/X3DJSONLD/src/main/lib/stylesheets/X3dToPython.xslt#606)
      processing /X3D/Scene[1]/ProtoDeclare[1]
   at xsl:apply-templates
(file:/home/coderextreme/X3DJSONLD/src/main/lib/stylesheets/X3dToPython.xslt#606)
      processing /X3D/Scene[1]
   at xsl:apply-templates
(file:/home/coderextreme/X3DJSONLD/src/main/lib/stylesheets/X3dToPython.xslt#123)
      processing /X3D
[INFO]
------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO]
------------------------------------------------------------------------
[INFO] Total time:  2.840 s
[INFO] Finished at: 2022-01-10T17:59:22-06:00 [INFO]
------------------------------------------------------------------------
[ERROR] Failed to execute goal
org.codehaus.mojo:xml-maven-plugin:1.0.2:transform (default) on project
X3DJSONLD: Failed to transform input file
/home/coderextreme/X3DJSONLD/src/main/data/MaterialModulator.x3d: A sequence of more than one item is not allowed as the first argument of
normalize-space() ("", "", ...)  -> [Help 1] [ERROR] [ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR]
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1]
https://nam10.safelinks.protection.outlook.com/?url=http%3A%2F%2Fcwiki.apache.org%2Fconfluence%2Fdisplay%2FMAVEN%2FMojoExecutionException&data=04%7C01%7Cbrutzman%40nps.edu%7C79b6d0212127425f31b408d9d4ab3773%7C6d936231a51740ea9199f7578963378e%7C0%7C0%7C637774654099751000%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C3000&sdata=VYVojdsW4QsyjrkZGnqfPOPmUp7x5ftTGE3H0TzrTts%3D&reserved=0<https://nam10.safelinks.protection.outlook.com/?url=http%3A%2F%2Fcwiki.apache.org%2Fconfluence%2Fdisplay%2FMAVEN%2FMojoExecutionException&data=04%7C01%7Cbrutzman%40nps.edu%7C015d3b7123844f4c7d7508d9d761502e%7C6d936231a51740ea9199f7578963378e%7C0%7C0%7C637777635530499448%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C3000&sdata=EVAYH1SE%2FC6vXPYV9v0Zi5rmvMiki8JEsb2CwoyP6XQ%3D&reserved=0>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://web3d.org/pipermail/x3d-public_web3d.org/attachments/20220115/6d093607/attachment-0001.html>


More information about the x3d-public mailing list