The attached MWE shows how to: - embed tex code in <script type="text/vnd.context"> or <script type="text/vnd.lmtx"> HTML elements to be run by ConTeXt - embed lua code in <script type="text/x-lua"> elements to be run by ConTeXt - redefine xmlsetups from the HTML document itself Massi Il 22/03/22 17:07, mf via ntg-context ha scritto:
I've added a <script type="text/x-lua"> in the <head> element (BTW, "text/x-lua" is the mimetype proposed by freedesktop.org for lua scripts.
That element is managed by this code:
------------------------------ if mimetype and mimetype == "text/x-lua" then local code = xml.text(s) context( "\\startluacode " .. code .. " \\stopluacode" ) end ------------------------------
s is the table representing the script element. That works, but it has a problem with one-line comments:
------------------------------ <script type="text/x-lua"> -- comment context.setuppapersize{ "A7" } </script> ------------------------------
The code above is considered a long comment as if it were written as ------------------------------ <script type="text/x-lua"> -- comment context.setuppapersize{ "A7" } </script> ------------------------------
so the context.setuppapersize function call is ignored.
The workaround is: ------------------------------ <script type="text/x-lua"> --[[ comment --]] context.setuppapersize{ "A7" } </script> ------------------------------
A lua analogous of \xmlcontext (line-wise) would be great.
Hans prompted me to use xml.content() instead of xml.text(). The first one preserves newlines, so short comments don't extend to the next line.
* * *
Here's another problem related to space in <script> elements. This code:
------------------------------ <script type="text/vnd.context"> % default setup for paragraphs \startxmlsetups myHtml:p \dontleavehmode\red\xmlflush{#1}\par \stopxmlsetups
% default setup for italic inlines \startxmlsetups myHtml:i {\it\blue\xmlflush{#1}}% <-- problem here \stopxmlsetups </script> ------------------------------
adds a space after an <i> element. A solution could be this:
------------------------------ \startxmlsetups myHtml:i {\it\blue\xmlflush{#1}}\stopxmlsetups ------------------------------
I prefer this one:
------------------------------ \startxmlsetups myHtml:i {\it\blue\xmlflush{#1}}\relax \stopxmlsetups ------------------------------
You need to end the line with a macro eating up all the trailing spaces (newlines included).
Massi
Il 22/03/22 15:23, mf via ntg-context ha scritto:
I found the solution I was looking for. The command to run is still
context --environment=nested-xmlsetup.tex --forcexml nested-xmlsetup.xhtml
In the <script> element there's some tex code, which redefines the xmlsetups for <p> and <i> elements, coloring the first ones in red and the second ones in blue.
The key command is
\xmlsetsetup{\xmldocument}{p|i}{myHtml:*}
where \xmldocument instead of #1 applies the myHtml:* setups to the whole XHTML document and not only to the <script> element identified by #1.
I tried also this, to prevent redefining the setups of <html>, <head>, <script> elements:
\xmlsetsetup{\xmlfirst{\xmldocument}{body}}{p|i}{myHtml:*}
but it doesn't work, since \xmldocument seems to be the actual document instead of an id pointing to its root element.
Massi
Il 10/03/22 17:52, Hans Hagen ha scritto:
On 3/10/2022 4:59 PM, mf via ntg-context wrote:
Hello, I'm trying to add new templates (xmlsetups) from the XML document itself.
See the attached MWE.
- the XML document is a simple XHTML file
- in the "head" element there's a "script" element with the "type" attribute set to "text/vnd.context", whose contents are then passed to \xmlcontext
- the "body" element has a "data-xmlsetups" attribute whose value should tell which xmlsetups is to be applied on the body contents (it's defined in the "script" element above)
If it worked, the resulting PDF should show the body element, followed by a "Hello world!" paragraph written in red. But it does not work, because there's something I'm missing in the redefinition and application of xmlsetups.
To try the MWE, type:
context --environment=nested-xmlsetup.tex --forcexml nested-xmlsetup.xhtml <script type="text/vnd.context"> \startxmlsetups myHtml \xmlsetsetup{#1}{p}{myHtml:p} % you're missing this \xmlsetup{#1}{xml:process} % which is % \xmlregistereddocumentsetups{#1}{#1} % \xmlmain{#1} \stopxmlsetups
\startxmlsetups myHtml:p \dontleavehmode\red\xmlflush{#1}\par \stopxmlsetups </script>
___________________________________________________________________________________
If your question is of interest to others as well, please add an entry to the Wiki!
maillist : ntg-context@ntg.nl / http://www.ntg.nl/mailman/listinfo/ntg-context webpage : http://www.pragma-ade.nl / http://context.aanhet.net archive : https://bitbucket.org/phg/context-mirror/commits/ wiki : http://contextgarden.net ___________________________________________________________________________________
___________________________________________________________________________________ If your question is of interest to others as well, please add an entry to the Wiki!
maillist : ntg-context@ntg.nl / http://www.ntg.nl/mailman/listinfo/ntg-context webpage : http://www.pragma-ade.nl / http://context.aanhet.net archive : https://bitbucket.org/phg/context-mirror/commits/ wiki : http://contextgarden.net ___________________________________________________________________________________