JS Interactives - Source and Runestone Linking

62 views
Skip to first unread message

Andrew Scholer

unread,
Mar 5, 2024, 5:44:33 PM3/5/24
to prete...@googlegroups.com
Two questions about JS-based interactives.

1) Would it be reasonable to add a "body" to canvas slates within javascript interactives

Say I have an interactive based on mylib.js. mylib.js has many different functions I might want to use, each taking arbitrary initialization data. I am going to use this in many places in my text and want to easily express "use that library to make a linked list with 10, 20" or "use that library to make a linked list with 10, 20, 30". I don't want to have to make a separate js file for each instance.

Currently, this looks like what I would do:

<interactive platform="javascript" source="code/mylib.js">
   <slate surface="canvas" xml:id="canvas1"/>
   <slate surface="html">
      <script xmlns="http://www.w3.org/1999/xhtml">
          new LinkedList(canvas1, [10,20]);
       </script>
    </slate>
</interactive>

That feels both pointlessly verbose and a bit obtuse (add an html surface so you can add a script element to what we have already identified as a javascript interactive).

I would prefer to either be able to specify a "script" element to the interactive:
<interactive platform="javascript" source="code/mylib.js">
   <slate surface="canvas" xml:id="canvas1">
          new LinkedList(canvas1, [10,20]);
    </slate>
    <script>new LinkedList(canvas1, [10,20]);</script>
</interactive>

I would imagine this <script> would be available in any interactive of type "javascript", not just ones with canvas slates, hence making the js be its own xml element instead of embedded in the slate as is done with JessieCode.

Does that sound reasonable?


2) I would love for this component to be Runestone aware (or vice-versa) and at least be able to track "did the student interact with it". That means there needs to be:

a) A way to identify it as a "mystery Runestone interactive" that gets added to the RS manifest.

b) A way for the interactive, which is running in an iframe, to let the outer page (which knows about Runsetone) know that something happened. CORS means this basically has to happen with a postMessage relay.

Brad mentioned someone might have already hacked up something like this using SPLICE (https://docs.google.com/document/d/1X6Vx6Em67t8Vp4Vecnmc-7OblVewJJKDFIJUrvRAvdc/edit#heading=h.r0syp685x130) Does anyone know more about that? 



Background:
There is a nice library of JS-based animations of fundamental data structures and algorithms (https://www.cs.usfca.edu/~galles/visualization/Algorithms.html) that I would like to turn into a JS library I can use to drop in demos and playgrounds into a CS book. So my immediate motivation is figuring that out. But it seems likely other potential tools will run into the same wants/needs.



Andrew Scholer (he/him/his)
Computer Science Instructor/Program Chair
Chemeketa Community College

Rob Beezer

unread,
Mar 5, 2024, 6:24:09 PM3/5/24
to prete...@googlegroups.com
Naive question at first blush. In your very first example, could the "script"
be a child of the "slate" that is a canvas? (I'm not asking if it behaves,
currently, just would the markup be more to your liking.)

On 3/5/24 14:43, Andrew Scholer wrote:
> Two questions about JS-based interactives.
>
> 1) Would it be reasonable to add a "body" to canvas slates within javascript
> interactives
>
> Say I have an interactive based on mylib.js. mylib.js has many different
> functions I might want to use, each taking arbitrary initialization data. I am
> going to use this in many places in my text and want to easily express "use that
> library to make a linked list with 10, 20" or "use that library to make a linked
> list with 10, 20, 30". I don't want to have to make a separate js file for each
> instance.
>
> Currently, this looks like what I would do:
>
> <interactive platform="javascript" source="code/mylib.js">
>    <slate surface="canvas" xml:id="canvas1"/>
>    <slate surface="html">
>       <script xmlns="http://www.w3.org/1999/xhtml <http://www.w3.org/1999/xhtml>">
> (https://docs.google.com/document/d/1X6Vx6Em67t8Vp4Vecnmc-7OblVewJJKDFIJUrvRAvdc/edit#heading=h.r0syp685x130 <https://docs.google.com/document/d/1X6Vx6Em67t8Vp4Vecnmc-7OblVewJJKDFIJUrvRAvdc/edit#heading=h.r0syp685x130>) Does anyone know more about that?
>
>
>
> Background:
> There is a nice library of JS-based animations of fundamental data structures
> and algorithms (https://www.cs.usfca.edu/~galles/visualization/Algorithms.html
> <https://www.cs.usfca.edu/~galles/visualization/Algorithms.html>) that I would
> like to turn into a JS library I can use to drop in demos and playgrounds into a
> CS book. So my immediate motivation is figuring that out. But it seems likely
> other potential tools will run into the same wants/needs.
>
>
>
> Andrew Scholer (he/him/his)
> Computer Science Instructor/Program Chair
> Chemeketa Community College
> 503.589.7649
> computerscience.chemeketa.edu/people/andrew-scholer/
> <http://computerscience.chemeketa.edu/people/andrew-scholer/>
>
> --
> You received this message because you are subscribed to the Google Groups
> "PreTeXt development" group.
> To unsubscribe from this group and stop receiving emails from it, send an email
> to pretext-dev...@googlegroups.com
> <mailto:pretext-dev...@googlegroups.com>.
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/pretext-dev/CACm44N_aiW_cWn7t-Tw3kDQUzsOgO_o5_8TxjqLLK0Jc%2BegfeQ%40mail.gmail.com <https://groups.google.com/d/msgid/pretext-dev/CACm44N_aiW_cWn7t-Tw3kDQUzsOgO_o5_8TxjqLLK0Jc%2BegfeQ%40mail.gmail.com?utm_medium=email&utm_source=footer>.

Andrew Scholer

unread,
Mar 5, 2024, 6:38:52 PM3/5/24
to prete...@googlegroups.com
I was thinking it makes sense to have the <script> element be independent of the <slate>.

For this use case the location does not matter much.  But there might be some JS interactive that wanted a small scriptlet, but did not need a <slate>.

Andrew Scholer (he/him/his)
Computer Science Instructor/Program Chair
Chemeketa Community College

To unsubscribe from this group and stop receiving emails from it, send an email to pretext-dev...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/pretext-dev/MTAwMDAxMC5iZWV6ZXI.1709681046%40quikprotect.

Rob Beezer

unread,
Mar 6, 2024, 2:33:49 PM3/6/24
to prete...@googlegroups.com
Dear Andrew,

I understand what you are after here, though it took me a bit to remember
everything going on with "interactive".

What you propose is what I call "mixed content". Right now, a (JS)
"interactive" has a small predictable list of children, of our design (such as
"slate"). Your proposal introduces new children, perhaps more than just a
"script", to be duplicated (in the "head" I guess). In your example, I would
have put the "script" first. Could an author put it in-between two "slate"?

This is analogous to a "p" with a bunch of text nodes interspersed with a bunch
elements like "em" and "m".

And the punch-line: mixed-content is difficult to deal with. So any add-ins
like "script" need to go into some kind of container so that all the
"interactive" code does not need a reworking due to radically different
assumptions about its content.

<interactive ....>
<literal-html-for-head>
<script...>
new LinkedList(canvas1, [10,20]);
</script>
</literal-html-for-head>
<slate ..../>
<slate .../>
</interactive>

Perhaps more flexible, as yuou widsh, but perhaps more verbose that you wish.
"interactive" tries to be easy for those without JS skills, while giving power
authors flexibility to do the sort of things you are after here. And if we
heeded every objection to verbosity there would be no PreTeXt. ;-)

Bonus: maybe only need a single namespace declaration on the container?

I'll let Brad address the reporting to Runestone. We can, of course, support
that on the PreTeXt side.

Rob

On 3/5/24 15:38, Andrew Scholer wrote:
> I was thinking it makes sense to have the <script> element be independent of the
> <slate>.
>
> For this use case the location does not matter much.  But there might be some JS
> interactive that wanted a small scriptlet, but did not need a <slate>.
>
> Andrew Scholer (he/him/his)
> Computer Science Instructor/Program Chair
> Chemeketa Community College
> 503.589.7649
> computerscience.chemeketa.edu/people/andrew-scholer/
> <http://computerscience.chemeketa.edu/people/andrew-scholer/>
>
>
> On Tue, Mar 5, 2024 at 3:24 PM 'Rob Beezer' via PreTeXt development
> <prete...@googlegroups.com <mailto:prete...@googlegroups.com>> wrote:
>
> Naive question at first blush.  In your very first example, could the "script"
> be a child of the "slate" that is a canvas?  (I'm not asking if it behaves,
> currently, just would the markup be more to your liking.)
>
> On 3/5/24 14:43, Andrew Scholer wrote:
> > Two questions about JS-based interactives.
> >
> > 1) Would it be reasonable to add a "body" to canvas slates within javascript
> > interactives
> >
> > Say I have an interactive based on mylib.js. mylib.js has many different
> > functions I might want to use, each taking arbitrary initialization data.
> I am
> > going to use this in many places in my text and want to easily express
> "use that
> > library to make a linked list with 10, 20" or "use that library to make a
> linked
> > list with 10, 20, 30". I don't want to have to make a separate js file
> for each
> > instance.
> >
> > Currently, this looks like what I would do:
> >
> > <interactive platform="javascript" source="code/mylib.js">
> >     <slate surface="canvas" xml:id="canvas1"/>
> >     <slate surface="html">
> >        <script xmlns="http://www.w3.org/1999/xhtml
> <http://www.w3.org/1999/xhtml> <http://www.w3.org/1999/xhtml
> (https://docs.google.com/document/d/1X6Vx6Em67t8Vp4Vecnmc-7OblVewJJKDFIJUrvRAvdc/edit#heading=h.r0syp685x130 <https://docs.google.com/document/d/1X6Vx6Em67t8Vp4Vecnmc-7OblVewJJKDFIJUrvRAvdc/edit#heading=h.r0syp685x130> <https://docs.google.com/document/d/1X6Vx6Em67t8Vp4Vecnmc-7OblVewJJKDFIJUrvRAvdc/edit#heading=h.r0syp685x130 <https://docs.google.com/document/d/1X6Vx6Em67t8Vp4Vecnmc-7OblVewJJKDFIJUrvRAvdc/edit#heading=h.r0syp685x130>>) Does anyone know more about that?
> >
> >
> >
> > Background:
> > There is a nice library of JS-based animations of fundamental data
> structures
> > and algorithms
> (https://www.cs.usfca.edu/~galles/visualization/Algorithms.html
> <https://www.cs.usfca.edu/~galles/visualization/Algorithms.html>
> > <https://www.cs.usfca.edu/~galles/visualization/Algorithms.html
> <https://www.cs.usfca.edu/~galles/visualization/Algorithms.html>>) that I would
> > like to turn into a JS library I can use to drop in demos and playgrounds
> into a
> > CS book. So my immediate motivation is figuring that out. But it seems
> likely
> > other potential tools will run into the same wants/needs.
> >
> >
> >
> > Andrew Scholer (he/him/his)
> > Computer Science Instructor/Program Chair
> > Chemeketa Community College
> > 503.589.7649
> > computerscience.chemeketa.edu/people/andrew-scholer/
> <http://computerscience.chemeketa.edu/people/andrew-scholer/>
> > <http://computerscience.chemeketa.edu/people/andrew-scholer/
> <http://computerscience.chemeketa.edu/people/andrew-scholer/>>
> >
> > --
> > You received this message because you are subscribed to the Google Groups
> > "PreTeXt development" group.
> > To unsubscribe from this group and stop receiving emails from it, send an
> email
> > to pretext-dev...@googlegroups.com
> <mailto:pretext-dev%2Bunsu...@googlegroups.com>
> > <mailto:pretext-dev...@googlegroups.com
> <mailto:pretext-dev%2Bunsu...@googlegroups.com>>.
> > To view this discussion on the web visit
> >
> https://groups.google.com/d/msgid/pretext-dev/CACm44N_aiW_cWn7t-Tw3kDQUzsOgO_o5_8TxjqLLK0Jc%2BegfeQ%40mail.gmail.com <https://groups.google.com/d/msgid/pretext-dev/CACm44N_aiW_cWn7t-Tw3kDQUzsOgO_o5_8TxjqLLK0Jc%2BegfeQ%40mail.gmail.com> <https://groups.google.com/d/msgid/pretext-dev/CACm44N_aiW_cWn7t-Tw3kDQUzsOgO_o5_8TxjqLLK0Jc%2BegfeQ%40mail.gmail.com?utm_medium=email&utm_source=footer <https://groups.google.com/d/msgid/pretext-dev/CACm44N_aiW_cWn7t-Tw3kDQUzsOgO_o5_8TxjqLLK0Jc%2BegfeQ%40mail.gmail.com?utm_medium=email&utm_source=footer>>.
>
> --
> You received this message because you are subscribed to the Google Groups
> "PreTeXt development" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to pretext-dev...@googlegroups.com
> <mailto:pretext-dev%2Bunsu...@googlegroups.com>.
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/pretext-dev/MTAwMDAxMC5iZWV6ZXI.1709681046%40quikprotect <https://groups.google.com/d/msgid/pretext-dev/MTAwMDAxMC5iZWV6ZXI.1709681046%40quikprotect>.
>
> --
> You received this message because you are subscribed to the Google Groups
> "PreTeXt development" group.
> To unsubscribe from this group and stop receiving emails from it, send an email
> to pretext-dev...@googlegroups.com
> <mailto:pretext-dev...@googlegroups.com>.
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/pretext-dev/CACm44N-Hn5wgkXFB12m0YD8xLUmiqF-qvRjYnhYNHsXPJYqjfQ%40mail.gmail.com <https://groups.google.com/d/msgid/pretext-dev/CACm44N-Hn5wgkXFB12m0YD8xLUmiqF-qvRjYnhYNHsXPJYqjfQ%40mail.gmail.com?utm_medium=email&utm_source=footer>.

Andrew Scholer

unread,
Mar 6, 2024, 3:46:19 PM3/6/24
to prete...@googlegroups.com
There is no reason a scriptlet like that needs to get hoisted to <head>. It is perfectly legal to dump it into an arbitrary part of the body of the document being constructed.

I would say that a script can go anywhere (before/between/after) slates. If there was a constraint, it should probably be that script must come last (as best practice when using scripts that aren't using defer/async is to put scripts at the bottom of the body).

Does that change your impressions of the complexity?

Could it be done by just adding something like this at line ~9717 in the create-iframe-page template?
                    ...existing apply templates...
                    <!-- accumulate script elements *after* @source scripts -->
                    <xsl:apply-templates select="script" />


Andrew Scholer (he/him/his)
Computer Science Instructor/Program Chair
Chemeketa Community College

To unsubscribe from this group and stop receiving emails from it, send an email to pretext-dev...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/pretext-dev/MTAwMDAyMi5iZWV6ZXI.1709753626%40quikprotect.

Andrew Scholer

unread,
Mar 6, 2024, 6:23:00 PM3/6/24
to prete...@googlegroups.com
Here is that idea implemented:

It is marked as a draft. I'm happy to modify it or even throw it out, but I think it will be easier to talk about concrete code.

Andrew Scholer (he/him/his)
Computer Science Instructor/Program Chair
Chemeketa Community College

Rob Beezer

unread,
Mar 7, 2024, 9:40:28 AM3/7/24
to prete...@googlegroups.com
Thanks for the demo pull request (and previous message). I was confusing my PTX
"script" and HTML "script". I think.

So:

(a) only about adding HTML "script" elements into the interactive.

(b) a new PTX element "script". Child of "interactive", sibling of "slate",
contents is text (JS code more precisely).

(c) I like the idea that they accumulate at the bottom, that would have been my
suggestion. The schema might say they come last inside "interactive" and could
have the code (as your demo code) make that happen even if authors are sloppy.

If I understand right (do I?) that might be a workable addition.

Rob

On 3/6/24 15:22, Andrew Scholer wrote:
> Here is that idea implemented:
> https://github.com/PreTeXtBook/pretext/pull/2137
> <https://github.com/PreTeXtBook/pretext/pull/2137>
>
> It is marked as a draft. I'm happy to modify it or even throw it out, but I
> think it will be easier to talk about concrete code.
>
> Andrew Scholer (he/him/his)
> Computer Science Instructor/Program Chair
> Chemeketa Community College
> 503.589.7649
> computerscience.chemeketa.edu/people/andrew-scholer/
> <http://computerscience.chemeketa.edu/people/andrew-scholer/>
>
>
> On Wed, Mar 6, 2024 at 12:45 PM Andrew Scholer <andrew....@chemeketa.edu
> <mailto:andrew....@chemeketa.edu>> wrote:
>
> There is no reason a scriptlet like that needs to get hoisted to <head>. It
> is perfectly legal to dump it into an arbitrary part of the body of the
> document being constructed.
>
> I would say that a script can go anywhere (before/between/after) slates. If
> there was a constraint, it should probably be that script must come last (as
> best practice when using scripts that aren't using defer/async is to put
> scripts at the bottom of the body).
>
> Does that change your impressions of the complexity?
>
> Could it be done by just adding something like this at line ~9717 in
> the create-iframe-page template?
>                     ...existing apply templates...
>                     <!-- accumulate script elements *after* @source scripts -->
>                     <xsl:apply-templates select="script" />
>
>
> Andrew Scholer (he/him/his)
> Computer Science Instructor/Program Chair
> Chemeketa Community College
> 503.589.7649
> computerscience.chemeketa.edu/people/andrew-scholer/
> <http://computerscience.chemeketa.edu/people/andrew-scholer/>
> > <http://computerscience.chemeketa.edu/people/andrew-scholer/
> <http://computerscience.chemeketa.edu/people/andrew-scholer/>>
> >
> >
> > On Tue, Mar 5, 2024 at 3:24 PM 'Rob Beezer' via PreTeXt development
> > <prete...@googlegroups.com <mailto:prete...@googlegroups.com>
> <mailto:prete...@googlegroups.com
>  (https://docs.google.com/document/d/1X6Vx6Em67t8Vp4Vecnmc-7OblVewJJKDFIJUrvRAvdc/edit#heading=h.r0syp685x130 <https://docs.google.com/document/d/1X6Vx6Em67t8Vp4Vecnmc-7OblVewJJKDFIJUrvRAvdc/edit#heading=h.r0syp685x130> <https://docs.google.com/document/d/1X6Vx6Em67t8Vp4Vecnmc-7OblVewJJKDFIJUrvRAvdc/edit#heading=h.r0syp685x130 <https://docs.google.com/document/d/1X6Vx6Em67t8Vp4Vecnmc-7OblVewJJKDFIJUrvRAvdc/edit#heading=h.r0syp685x130>> <https://docs.google.com/document/d/1X6Vx6Em67t8Vp4Vecnmc-7OblVewJJKDFIJUrvRAvdc/edit#heading=h.r0syp685x130 <https://docs.google.com/document/d/1X6Vx6Em67t8Vp4Vecnmc-7OblVewJJKDFIJUrvRAvdc/edit#heading=h.r0syp685x130> <https://docs.google.com/document/d/1X6Vx6Em67t8Vp4Vecnmc-7OblVewJJKDFIJUrvRAvdc/edit#heading=h.r0syp685x130 <https://docs.google.com/document/d/1X6Vx6Em67t8Vp4Vecnmc-7OblVewJJKDFIJUrvRAvdc/edit#heading=h.r0syp685x130>>>) Does anyone know more about that?
> >     <mailto:pretext-dev%2Bunsu...@googlegroups.com
> <mailto:pretext-dev%252Buns...@googlegroups.com>>
> >      > <mailto:pretext-dev...@googlegroups.com
> <mailto:pretext-dev%2Bunsu...@googlegroups.com>
> >     <mailto:pretext-dev%2Bunsu...@googlegroups.com
> <mailto:pretext-dev%252Buns...@googlegroups.com>>>.
> >      > To view this discussion on the web visit
> >      >
> >
> https://groups.google.com/d/msgid/pretext-dev/CACm44N_aiW_cWn7t-Tw3kDQUzsOgO_o5_8TxjqLLK0Jc%2BegfeQ%40mail.gmail.com <https://groups.google.com/d/msgid/pretext-dev/CACm44N_aiW_cWn7t-Tw3kDQUzsOgO_o5_8TxjqLLK0Jc%2BegfeQ%40mail.gmail.com> <https://groups.google.com/d/msgid/pretext-dev/CACm44N_aiW_cWn7t-Tw3kDQUzsOgO_o5_8TxjqLLK0Jc%2BegfeQ%40mail.gmail.com <https://groups.google.com/d/msgid/pretext-dev/CACm44N_aiW_cWn7t-Tw3kDQUzsOgO_o5_8TxjqLLK0Jc%2BegfeQ%40mail.gmail.com>> <https://groups.google.com/d/msgid/pretext-dev/CACm44N_aiW_cWn7t-Tw3kDQUzsOgO_o5_8TxjqLLK0Jc%2BegfeQ%40mail.gmail.com?utm_medium=email&utm_source=footer <https://groups.google.com/d/msgid/pretext-dev/CACm44N_aiW_cWn7t-Tw3kDQUzsOgO_o5_8TxjqLLK0Jc%2BegfeQ%40mail.gmail.com?utm_medium=email&utm_source=footer> <https://groups.google.com/d/msgid/pretext-dev/CACm44N_aiW_cWn7t-Tw3kDQUzsOgO_o5_8TxjqLLK0Jc%2BegfeQ%40mail.gmail.com?utm_medium=email&utm_source=footer <https://groups.google.com/d/msgid/pretext-dev/CACm44N_aiW_cWn7t-Tw3kDQUzsOgO_o5_8TxjqLLK0Jc%2BegfeQ%40mail.gmail.com?utm_medium=email&utm_source=footer>>>.
> >
> >     --
> >     You received this message because you are subscribed to the
> Google Groups
> >     "PreTeXt development" group.
> >     To unsubscribe from this group and stop receiving emails from it,
> send an
> >     email to pretext-dev...@googlegroups.com
> <mailto:pretext-dev%2Bunsu...@googlegroups.com>
> >     <mailto:pretext-dev%2Bunsu...@googlegroups.com
> <mailto:pretext-dev%252Buns...@googlegroups.com>>.
> >     To view this discussion on the web visit
> >
> https://groups.google.com/d/msgid/pretext-dev/MTAwMDAxMC5iZWV6ZXI.1709681046%40quikprotect <https://groups.google.com/d/msgid/pretext-dev/MTAwMDAxMC5iZWV6ZXI.1709681046%40quikprotect> <https://groups.google.com/d/msgid/pretext-dev/MTAwMDAxMC5iZWV6ZXI.1709681046%40quikprotect <https://groups.google.com/d/msgid/pretext-dev/MTAwMDAxMC5iZWV6ZXI.1709681046%40quikprotect>>.
> >
> > --
> > You received this message because you are subscribed to the Google
> Groups
> > "PreTeXt development" group.
> > To unsubscribe from this group and stop receiving emails from it,
> send an email
> > to pretext-dev...@googlegroups.com
> <mailto:pretext-dev%2Bunsu...@googlegroups.com>
> > <mailto:pretext-dev...@googlegroups.com
> <mailto:pretext-dev%2Bunsu...@googlegroups.com>>.
> > To view this discussion on the web visit
> >
> https://groups.google.com/d/msgid/pretext-dev/CACm44N-Hn5wgkXFB12m0YD8xLUmiqF-qvRjYnhYNHsXPJYqjfQ%40mail.gmail.com <https://groups.google.com/d/msgid/pretext-dev/CACm44N-Hn5wgkXFB12m0YD8xLUmiqF-qvRjYnhYNHsXPJYqjfQ%40mail.gmail.com> <https://groups.google.com/d/msgid/pretext-dev/CACm44N-Hn5wgkXFB12m0YD8xLUmiqF-qvRjYnhYNHsXPJYqjfQ%40mail.gmail.com?utm_medium=email&utm_source=footer <https://groups.google.com/d/msgid/pretext-dev/CACm44N-Hn5wgkXFB12m0YD8xLUmiqF-qvRjYnhYNHsXPJYqjfQ%40mail.gmail.com?utm_medium=email&utm_source=footer>>.
>
> --
> You received this message because you are subscribed to the Google
> Groups "PreTeXt development" group.
> To unsubscribe from this group and stop receiving emails from it, send
> an email to pretext-dev...@googlegroups.com
> <mailto:pretext-dev%2Bunsu...@googlegroups.com>.
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/pretext-dev/MTAwMDAyMi5iZWV6ZXI.1709753626%40quikprotect <https://groups.google.com/d/msgid/pretext-dev/MTAwMDAyMi5iZWV6ZXI.1709753626%40quikprotect>.
>
> --
> You received this message because you are subscribed to the Google Groups
> "PreTeXt development" group.
> To unsubscribe from this group and stop receiving emails from it, send an email
> to pretext-dev...@googlegroups.com
> <mailto:pretext-dev...@googlegroups.com>.
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/pretext-dev/CACm44N-GPN9idq8U_R3FT1rio3eMdFOXy8H-jFKt8kB58efwVg%40mail.gmail.com <https://groups.google.com/d/msgid/pretext-dev/CACm44N-GPN9idq8U_R3FT1rio3eMdFOXy8H-jFKt8kB58efwVg%40mail.gmail.com?utm_medium=email&utm_source=footer>.

Andrew Scholer

unread,
Mar 7, 2024, 11:04:38 AM3/7/24
to prete...@googlegroups.com
Yes, that is a perfect restatement of what I propose.

I was thinking that "scripts in interactive" and "allow interactives to tell Runestone that they report scores/interaction" might all be one task. But now I don't see a need to connect the two. Do you want me to finalize this PR with the limited scope? Or wait to finalize the score reporting part with Brad and do them together?

Andrew Scholer (he/him/his)
Computer Science Instructor/Program Chair
Chemeketa Community College

To unsubscribe from this group and stop receiving emails from it, send an email to pretext-dev...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/pretext-dev/MTAwMDAyNC5iZWV6ZXI.1709822423%40quikprotect.

Rob Beezer

unread,
Mar 7, 2024, 11:17:29 AM3/7/24
to prete...@googlegroups.com
> Yes, that is a perfect restatement of what I propose.

Very good!

> Do you want me to finalize this PR with the limited scope?

Yes, let's split into two. I will go comment on the PR right now, so wait for that.

Thanks,
Rob


On 3/7/24 08:03, Andrew Scholer wrote:
> Yes, that is a perfect restatement of what I propose.
>
> I was thinking that "scripts in interactive" and "allow interactives to tell
> Runestone that they report scores/interaction" might all be one task. But now I
> don't see a need to connect the two. Do you want me to finalize this PR with the
> limited scope? Or wait to finalize the score reporting part with Brad and do
> them together?
>
> Andrew Scholer (he/him/his)
> Computer Science Instructor/Program Chair
> Chemeketa Community College
> 503.589.7649
> computerscience.chemeketa.edu/people/andrew-scholer/
> <http://computerscience.chemeketa.edu/people/andrew-scholer/>
> > <http://computerscience.chemeketa.edu/people/andrew-scholer/
> <http://computerscience.chemeketa.edu/people/andrew-scholer/>>
> >
> >
> > On Wed, Mar 6, 2024 at 12:45 PM Andrew Scholer
> <andrew....@chemeketa.edu <mailto:andrew....@chemeketa.edu>
> > <mailto:andrew....@chemeketa.edu
> <mailto:andrew....@chemeketa.edu>>> wrote:
> >
> >     There is no reason a scriptlet like that needs to get hoisted to
> <head>. It
> >     is perfectly legal to dump it into an arbitrary part of the body of the
> >     document being constructed.
> >
> >     I would say that a script can go anywhere (before/between/after)
> slates. If
> >     there was a constraint, it should probably be that script must come
> last (as
> >     best practice when using scripts that aren't using defer/async is to put
> >     scripts at the bottom of the body).
> >
> >     Does that change your impressions of the complexity?
> >
> >     Could it be done by just adding something like this at line ~9717 in
> >     the create-iframe-page template?
> >                          ...existing apply templates...
> >                          <!-- accumulate script elements *after* @source
> scripts -->
> >                          <xsl:apply-templates select="script" />
> >
> >
> >     Andrew Scholer (he/him/his)
> >     Computer Science Instructor/Program Chair
> >     Chemeketa Community College
> >     503.589.7649
> > computerscience.chemeketa.edu/people/andrew-scholer/
> <http://computerscience.chemeketa.edu/people/andrew-scholer/>
> >     <http://computerscience.chemeketa.edu/people/andrew-scholer/
> <http://computerscience.chemeketa.edu/people/andrew-scholer/>>
> >
> >
> >     On Wed, Mar 6, 2024 at 11:33 AM 'Rob Beezer' via PreTeXt development
> >     <prete...@googlegroups.com <mailto:prete...@googlegroups.com>
>  (https://docs.google.com/document/d/1X6Vx6Em67t8Vp4Vecnmc-7OblVewJJKDFIJUrvRAvdc/edit#heading=h.r0syp685x130 <https://docs.google.com/document/d/1X6Vx6Em67t8Vp4Vecnmc-7OblVewJJKDFIJUrvRAvdc/edit#heading=h.r0syp685x130> <https://docs.google.com/document/d/1X6Vx6Em67t8Vp4Vecnmc-7OblVewJJKDFIJUrvRAvdc/edit#heading=h.r0syp685x130 <https://docs.google.com/document/d/1X6Vx6Em67t8Vp4Vecnmc-7OblVewJJKDFIJUrvRAvdc/edit#heading=h.r0syp685x130>> <https://docs.google.com/document/d/1X6Vx6Em67t8Vp4Vecnmc-7OblVewJJKDFIJUrvRAvdc/edit#heading=h.r0syp685x130 <https://docs.google.com/document/d/1X6Vx6Em67t8Vp4Vecnmc-7OblVewJJKDFIJUrvRAvdc/edit#heading=h.r0syp685x130> <https://docs.google.com/document/d/1X6Vx6Em67t8Vp4Vecnmc-7OblVewJJKDFIJUrvRAvdc/edit#heading=h.r0syp685x130 <https://docs.google.com/document/d/1X6Vx6Em67t8Vp4Vecnmc-7OblVewJJKDFIJUrvRAvdc/edit#heading=h.r0syp685x130>>> <https://docs.google.com/document/d/1X6Vx6Em67t8Vp4Vecnmc-7OblVewJJKDFIJUrvRAvdc/edit#heading=h.r0syp685x130 <https://docs.google.com/document/d/1X6Vx6Em67t8Vp4Vecnmc-7OblVewJJKDFIJUrvRAvdc/edit#heading=h.r0syp685x130> <https://docs.google.com/document/d/1X6Vx6Em67t8Vp4Vecnmc-7OblVewJJKDFIJUrvRAvdc/edit#heading=h.r0syp685x130 <https://docs.google.com/document/d/1X6Vx6Em67t8Vp4Vecnmc-7OblVewJJKDFIJUrvRAvdc/edit#heading=h.r0syp685x130>> <https://docs.google.com/document/d/1X6Vx6Em67t8Vp4Vecnmc-7OblVewJJKDFIJUrvRAvdc/edit#heading=h.r0syp685x130 <https://docs.google.com/document/d/1X6Vx6Em67t8Vp4Vecnmc-7OblVewJJKDFIJUrvRAvdc/edit#heading=h.r0syp685x130> <https://docs.google.com/document/d/1X6Vx6Em67t8Vp4Vecnmc-7OblVewJJKDFIJUrvRAvdc/edit#heading=h.r0syp685x130 <https://docs.google.com/document/d/1X6Vx6Em67t8Vp4Vecnmc-7OblVewJJKDFIJUrvRAvdc/edit#heading=h.r0syp685x130>>>>) Does anyone know more about that?
> >          >     <mailto:pretext-dev%2Bunsu...@googlegroups.com
> <mailto:pretext-dev%252Buns...@googlegroups.com>
> >         <mailto:pretext-dev%252Buns...@googlegroups.com
> <mailto:pretext-dev%25252Bun...@googlegroups.com>>>
> >         <mailto:pretext-dev%252Buns...@googlegroups.com
> <mailto:pretext-dev%25252Bun...@googlegroups.com>>>>.
> >          >      > To view this discussion on the web visit
> >          >      >
> >          >
> >
> https://groups.google.com/d/msgid/pretext-dev/CACm44N_aiW_cWn7t-Tw3kDQUzsOgO_o5_8TxjqLLK0Jc%2BegfeQ%40mail.gmail.com <https://groups.google.com/d/msgid/pretext-dev/CACm44N_aiW_cWn7t-Tw3kDQUzsOgO_o5_8TxjqLLK0Jc%2BegfeQ%40mail.gmail.com> <https://groups.google.com/d/msgid/pretext-dev/CACm44N_aiW_cWn7t-Tw3kDQUzsOgO_o5_8TxjqLLK0Jc%2BegfeQ%40mail.gmail.com <https://groups.google.com/d/msgid/pretext-dev/CACm44N_aiW_cWn7t-Tw3kDQUzsOgO_o5_8TxjqLLK0Jc%2BegfeQ%40mail.gmail.com>> <https://groups.google.com/d/msgid/pretext-dev/CACm44N_aiW_cWn7t-Tw3kDQUzsOgO_o5_8TxjqLLK0Jc%2BegfeQ%40mail.gmail.com <https://groups.google.com/d/msgid/pretext-dev/CACm44N_aiW_cWn7t-Tw3kDQUzsOgO_o5_8TxjqLLK0Jc%2BegfeQ%40mail.gmail.com> <https://groups.google.com/d/msgid/pretext-dev/CACm44N_aiW_cWn7t-Tw3kDQUzsOgO_o5_8TxjqLLK0Jc%2BegfeQ%40mail.gmail.com <https://groups.google.com/d/msgid/pretext-dev/CACm44N_aiW_cWn7t-Tw3kDQUzsOgO_o5_8TxjqLLK0Jc%2BegfeQ%40mail.gmail.com>>> <https://groups.google.com/d/msgid/pretext-dev/CACm44N_aiW_cWn7t-Tw3kDQUzsOgO_o5_8TxjqLLK0Jc%2BegfeQ%40mail.gmail.com?utm_medium=email&utm_source=footer <https://groups.google.com/d/msgid/pretext-dev/CACm44N_aiW_cWn7t-Tw3kDQUzsOgO_o5_8TxjqLLK0Jc%2BegfeQ%40mail.gmail.com?utm_medium=email&utm_source=footer> <https://groups.google.com/d/msgid/pretext-dev/CACm44N_aiW_cWn7t-Tw3kDQUzsOgO_o5_8TxjqLLK0Jc%2BegfeQ%40mail.gmail.com?utm_medium=email&utm_source=footer <https://groups.google.com/d/msgid/pretext-dev/CACm44N_aiW_cWn7t-Tw3kDQUzsOgO_o5_8TxjqLLK0Jc%2BegfeQ%40mail.gmail.com?utm_medium=email&utm_source=footer>> <https://groups.google.com/d/msgid/pretext-dev/CACm44N_aiW_cWn7t-Tw3kDQUzsOgO_o5_8TxjqLLK0Jc%2BegfeQ%40mail.gmail.com?utm_medium=email&utm_source=footer <https://groups.google.com/d/msgid/pretext-dev/CACm44N_aiW_cWn7t-Tw3kDQUzsOgO_o5_8TxjqLLK0Jc%2BegfeQ%40mail.gmail.com?utm_medium=email&utm_source=footer> <https://groups.google.com/d/msgid/pretext-dev/CACm44N_aiW_cWn7t-Tw3kDQUzsOgO_o5_8TxjqLLK0Jc%2BegfeQ%40mail.gmail.com?utm_medium=email&utm_source=footer <https://groups.google.com/d/msgid/pretext-dev/CACm44N_aiW_cWn7t-Tw3kDQUzsOgO_o5_8TxjqLLK0Jc%2BegfeQ%40mail.gmail.com?utm_medium=email&utm_source=footer>>>>.
> >          >
> >          >     --
> >          >     You received this message because you are subscribed to the
> >         Google Groups
> >          >     "PreTeXt development" group.
> >          >     To unsubscribe from this group and stop receiving emails
> from it,
> >         send an
> >          >     email to pretext-dev...@googlegroups.com
> <mailto:pretext-dev%2Bunsu...@googlegroups.com>
> >         <mailto:pretext-dev%2Bunsu...@googlegroups.com
> <mailto:pretext-dev%252Buns...@googlegroups.com>>
> >          >     <mailto:pretext-dev%2Bunsu...@googlegroups.com
> <mailto:pretext-dev%252Buns...@googlegroups.com>
> >         <mailto:pretext-dev%252Buns...@googlegroups.com
> <mailto:pretext-dev%25252Bun...@googlegroups.com>>>.
> >          >     To view this discussion on the web visit
> >          >
> >
> https://groups.google.com/d/msgid/pretext-dev/MTAwMDAxMC5iZWV6ZXI.1709681046%40quikprotect <https://groups.google.com/d/msgid/pretext-dev/MTAwMDAxMC5iZWV6ZXI.1709681046%40quikprotect> <https://groups.google.com/d/msgid/pretext-dev/MTAwMDAxMC5iZWV6ZXI.1709681046%40quikprotect <https://groups.google.com/d/msgid/pretext-dev/MTAwMDAxMC5iZWV6ZXI.1709681046%40quikprotect>> <https://groups.google.com/d/msgid/pretext-dev/MTAwMDAxMC5iZWV6ZXI.1709681046%40quikprotect <https://groups.google.com/d/msgid/pretext-dev/MTAwMDAxMC5iZWV6ZXI.1709681046%40quikprotect> <https://groups.google.com/d/msgid/pretext-dev/MTAwMDAxMC5iZWV6ZXI.1709681046%40quikprotect <https://groups.google.com/d/msgid/pretext-dev/MTAwMDAxMC5iZWV6ZXI.1709681046%40quikprotect>>>.
> >          >
> >          > --
> >          > You received this message because you are subscribed to the Google
> >         Groups
> >          > "PreTeXt development" group.
> >          > To unsubscribe from this group and stop receiving emails from it,
> >         send an email
> >          > to pretext-dev...@googlegroups.com
> <mailto:pretext-dev%2Bunsu...@googlegroups.com>
> >         <mailto:pretext-dev%2Bunsu...@googlegroups.com
> <mailto:pretext-dev%252Buns...@googlegroups.com>>
> >          > <mailto:pretext-dev...@googlegroups.com
> <mailto:pretext-dev%2Bunsu...@googlegroups.com>
> >         <mailto:pretext-dev%2Bunsu...@googlegroups.com
> <mailto:pretext-dev%252Buns...@googlegroups.com>>>.
> >          > To view this discussion on the web visit
> >          >
> >
> https://groups.google.com/d/msgid/pretext-dev/CACm44N-Hn5wgkXFB12m0YD8xLUmiqF-qvRjYnhYNHsXPJYqjfQ%40mail.gmail.com <https://groups.google.com/d/msgid/pretext-dev/CACm44N-Hn5wgkXFB12m0YD8xLUmiqF-qvRjYnhYNHsXPJYqjfQ%40mail.gmail.com> <https://groups.google.com/d/msgid/pretext-dev/CACm44N-Hn5wgkXFB12m0YD8xLUmiqF-qvRjYnhYNHsXPJYqjfQ%40mail.gmail.com <https://groups.google.com/d/msgid/pretext-dev/CACm44N-Hn5wgkXFB12m0YD8xLUmiqF-qvRjYnhYNHsXPJYqjfQ%40mail.gmail.com>> <https://groups.google.com/d/msgid/pretext-dev/CACm44N-Hn5wgkXFB12m0YD8xLUmiqF-qvRjYnhYNHsXPJYqjfQ%40mail.gmail.com?utm_medium=email&utm_source=footer <https://groups.google.com/d/msgid/pretext-dev/CACm44N-Hn5wgkXFB12m0YD8xLUmiqF-qvRjYnhYNHsXPJYqjfQ%40mail.gmail.com?utm_medium=email&utm_source=footer> <https://groups.google.com/d/msgid/pretext-dev/CACm44N-Hn5wgkXFB12m0YD8xLUmiqF-qvRjYnhYNHsXPJYqjfQ%40mail.gmail.com?utm_medium=email&utm_source=footer <https://groups.google.com/d/msgid/pretext-dev/CACm44N-Hn5wgkXFB12m0YD8xLUmiqF-qvRjYnhYNHsXPJYqjfQ%40mail.gmail.com?utm_medium=email&utm_source=footer>>>.
> >
> >         --
> >         You received this message because you are subscribed to the Google
> >         Groups "PreTeXt development" group.
> >         To unsubscribe from this group and stop receiving emails from it,
> send
> >         an email to pretext-dev...@googlegroups.com
> <mailto:pretext-dev%2Bunsu...@googlegroups.com>
> >         <mailto:pretext-dev%2Bunsu...@googlegroups.com
> <mailto:pretext-dev%252Buns...@googlegroups.com>>.
> >         To view this discussion on the web visit
> >
> https://groups.google.com/d/msgid/pretext-dev/MTAwMDAyMi5iZWV6ZXI.1709753626%40quikprotect <https://groups.google.com/d/msgid/pretext-dev/MTAwMDAyMi5iZWV6ZXI.1709753626%40quikprotect> <https://groups.google.com/d/msgid/pretext-dev/MTAwMDAyMi5iZWV6ZXI.1709753626%40quikprotect <https://groups.google.com/d/msgid/pretext-dev/MTAwMDAyMi5iZWV6ZXI.1709753626%40quikprotect>>.
> >
> > --
> > You received this message because you are subscribed to the Google Groups
> > "PreTeXt development" group.
> > To unsubscribe from this group and stop receiving emails from it, send an
> email
> > to pretext-dev...@googlegroups.com
> <mailto:pretext-dev%2Bunsu...@googlegroups.com>
> > <mailto:pretext-dev...@googlegroups.com
> <mailto:pretext-dev%2Bunsu...@googlegroups.com>>.
> > To view this discussion on the web visit
> >
> https://groups.google.com/d/msgid/pretext-dev/CACm44N-GPN9idq8U_R3FT1rio3eMdFOXy8H-jFKt8kB58efwVg%40mail.gmail.com <https://groups.google.com/d/msgid/pretext-dev/CACm44N-GPN9idq8U_R3FT1rio3eMdFOXy8H-jFKt8kB58efwVg%40mail.gmail.com> <https://groups.google.com/d/msgid/pretext-dev/CACm44N-GPN9idq8U_R3FT1rio3eMdFOXy8H-jFKt8kB58efwVg%40mail.gmail.com?utm_medium=email&utm_source=footer <https://groups.google.com/d/msgid/pretext-dev/CACm44N-GPN9idq8U_R3FT1rio3eMdFOXy8H-jFKt8kB58efwVg%40mail.gmail.com?utm_medium=email&utm_source=footer>>.
>
> --
> You received this message because you are subscribed to the Google Groups
> "PreTeXt development" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to pretext-dev...@googlegroups.com
> <mailto:pretext-dev%2Bunsu...@googlegroups.com>.
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/pretext-dev/MTAwMDAyNC5iZWV6ZXI.1709822423%40quikprotect <https://groups.google.com/d/msgid/pretext-dev/MTAwMDAyNC5iZWV6ZXI.1709822423%40quikprotect>.
>
> --
> You received this message because you are subscribed to the Google Groups
> "PreTeXt development" group.
> To unsubscribe from this group and stop receiving emails from it, send an email
> to pretext-dev...@googlegroups.com
> <mailto:pretext-dev...@googlegroups.com>.
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/pretext-dev/CACm44N9gw7J-ahq9VbH8xwuz%2Ba9UL-2eY8HV4eDmM69HiLRTNw%40mail.gmail.com <https://groups.google.com/d/msgid/pretext-dev/CACm44N9gw7J-ahq9VbH8xwuz%2Ba9UL-2eY8HV4eDmM69HiLRTNw%40mail.gmail.com?utm_medium=email&utm_source=footer>.

Brad Miller

unread,
Mar 11, 2024, 6:49:41 PM3/11/24
to prete...@googlegroups.com
Just to weigh in on a few things:
  1. Yes an entry in the manifest file, with at minimum some kind of unique id. -- maybe an @label on the interactive?
  2. Where will the code come from to support the visualization in the interactive?  Served as a static asset, bundled with the book.
  3. We should absolutely use the splice protocol.  We have a larger proof of concept in a PR from the DOENET group.  But this would be an opportunity to discuss how to make something pretty generic that we would not have to change for anyone that wanted to use it.


Bradley Miller, PhD
Professor Emeritus Computer Science
Luther College
Founder, Runestone Academy LTD
Blog: A Reputable Journal
Schedule a Meeting
--

You received this message because you are subscribed to the Google Groups "PreTeXt development" group.
To unsubscribe from this group and stop receiving emails from it, send an email to pretext-dev...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/pretext-dev/CACm44N_aiW_cWn7t-Tw3kDQUzsOgO_o5_8TxjqLLK0Jc%2BegfeQ%40mail.gmail.com.

Andrew Scholer

unread,
Mar 12, 2024, 5:55:31 PM3/12/24
to prete...@googlegroups.com
In the manifest file, in addition to a unique id via @label, we might need a way to indicate "emits grade information via SPLICE protocol". Something that tells Runestone that this item is gradable and should show up in the list of questions available to make assignments from and report activity on.

That could be a simple flag - something like @splicegrading="yes". 

Or it could encompass the SPLICE state mechanism. Some components might want to report state information to Runestone for storage and then on page load request the last known state and load that. If we want to handle that it could either 1)  be a separate @splicestate="yes"; or 2) there could be a @splicemessages that is set to "grade" or "state" which would also imply grade is emitted. (It looks like in SPLICE you can send a grade with an empty state but there is no way to send state without a grade).

Reference on SPLICE:


Andrew Scholer (he/him/his)
Computer Science Instructor/Program Chair
Chemeketa Community College

Rob Beezer

unread,
Mar 13, 2024, 10:50:35 AM3/13/24
to prete...@googlegroups.com
Following this with interest. Perhaps the attribute could be protocol-agnostic and/or more flexible and future-proof?

grading="splice"

On March 12, 2024 2:54:52 PM PDT, Andrew Scholer <andrew....@chemeketa.edu> wrote:
>In the manifest file, in addition to a unique id via @label, we might need
>a way to indicate "emits grade information via SPLICE protocol". Something
>that tells Runestone that this item is gradable and should show up in the
>list of questions available to make assignments from and report activity on.
>
>That could be a simple flag - something like @splicegrading="yes".
>
>Or it could encompass the SPLICE state mechanism. Some components might
>want to report state information to Runestone for storage and then on page
>load request the last known state and load that. If we want to handle that
>it could either 1) be a separate @splicestate="yes"; or 2) there could be
>a @splicemessages that is set to "grade" or "state" which would also imply
>grade is emitted. (It looks like in SPLICE you can send a grade with an
>empty state but there is no way to send state without a grade).
>
>Reference on SPLICE:
>https://cssplice.github.io/slcp/index.html
>
>
>Andrew Scholer (he/him/his)
>Computer Science Instructor/Program Chair
>Chemeketa Community College
>503.589.7649
>computerscience.chemeketa.edu/people/andrew-scholer/
>
>
>On Mon, Mar 11, 2024 at 3:49 PM Brad Miller <br...@runestone.academy> wrote:
>
>> Just to weigh in on a few things:
>>
>> 1. Yes an entry in the manifest file, with at minimum some kind of
>> unique id. -- maybe an @label on the interactive?
>> 2. Where will the code come from to support the visualization in the
>> interactive? Served as a static asset, bundled with the book.
>> 3. We should absolutely use the splice protocol. We have a larger
>> proof of concept in a PR from the DOENET group. But this would be an
>> opportunity to discuss how to make something pretty generic that we would
>> not have to change for anyone that wanted to use it.
>>
>>
>>
>> *Bradley Miller, PhD*
>> Professor Emeritus Computer Science
>> Luther College
>> Founder, Runestone Academy LTD <https://runestone.academy>
>> Blog: A Reputable Journal <https://www.reputablejournal.com>
>> Schedule a Meeting <https://fantastical.app/bonelake-Gj2i/meet-with-brad>
>> <https://groups.google.com/d/msgid/pretext-dev/CACm44N_aiW_cWn7t-Tw3kDQUzsOgO_o5_8TxjqLLK0Jc%2BegfeQ%40mail.gmail.com?utm_medium=email&utm_source=footer>
>> .
>>
>> --
>> You received this message because you are subscribed to the Google Groups
>> "PreTeXt development" group.
>> To unsubscribe from this group and stop receiving emails from it, send an
>> email to pretext-dev...@googlegroups.com.
>> To view this discussion on the web visit
>> https://groups.google.com/d/msgid/pretext-dev/c617b02e-aec0-46bb-ab20-98943c0f3ec6%40Spark
>> <https://groups.google.com/d/msgid/pretext-dev/c617b02e-aec0-46bb-ab20-98943c0f3ec6%40Spark?utm_medium=email&utm_source=footer>
>> .
>>
>
Reply all
Reply to author
Forward
0 new messages