[NTG-context] How to do code listings & sections from XML (AsciiDoc)

Mojca Miklavec mojca.miklavec.lists at gmail.com
Sat Aug 13 08:15:50 CEST 2022


On Fri, 12 Aug 2022 at 23:20, Aditya Mahajan wrote:
> On Fri, 12 Aug 2022, Mojca Miklavec via ntg-context wrote:
>
> > (a) I don't know how to turn program listing (verbatim code) from xml
> > to (perhaps, vim-based) syntax highlighting (but most importantly, to
> > make sure that line breaks work properly)
>
> Does something like this work:
>
> https://wiki.contextgarden.net/Verbatim_XML

Yes, awesome, this does exactly what I want, thank you very much.

I used the following code:

    \usemodule[vim]
    % this breaks if directory doesn't exist before
    \setupvimtyping[directory=output/]
    % it would be potentially useful to have some predefined vimtyping
already present in the module
    \definevimtyping
        [programlisting]
        [syntax=]

    \startluacode
        function xml.functions.processprogramlisting(t)
            buffers.assign("listing","\\startprogramlisting[syntax=cpp]\n"
.. tostring(xml.text(t)) .. "\n\\stopprogramlisting")
            context.getbuffer { "listing" }
        end
    \stopluacode

    \startxmlsetups xml:programlisting
        \pushcatcodetable
        \setcatcodetable\ctxcatcodes
        \xmlfunction{#1}{processprogramlisting}
        \popcatcodetable
    \stopxmlsetups


Now I need to get the "cpp" and "unnumbered" part processed
automatically, so that it will work for any language:

    <programlisting language="cpp" linenumbering="unnumbered">// test.cpp:
    int main()
    {
        return 0;
    }</programlisting>

which would then be transformed into

    \startprogramlisting[syntax=cpp,numbering=no]
    int main()
    {
        return 0;
    }
    \stopprogramlisting

For some reason the syntax highlighting doesn't work on the full
document, but it works inside the minimal example, so I still need to
investigate what's going on with the full document.



On an unrelated note:

I cannot make \startnarrow[middle=1cm] (or left=... for that matter)
produce any offset on the left. I was playing with the following
code, but the frame refuses to be shifted to the right

\setupvimtyping
    [before={
        \startnarrow[left=1cm,before={\blank[10pt]}]
        \switchtobodyfont[8pt]
        \startframed
            [align=flushleft,
             background=color,
             backgroundcolor=gray,
             frame=off,
             leftframe=on,
             rulethickness=2pt,
             framecolor=darkgray,
             width=local,
             offset=1ex]},
      after={\stopframed\stopnarrow}]

Hello
\startprogramlisting[syntax=cpp,numbering=yes]
int main()
{
    return 0;
}
\stopprogramlisting


Mojca


More information about the ntg-context mailing list