背景

背景

背景

希望将语法高亮应用于嵌入在 XHTMLcode元素中的源代码片段,并用class属性划分以指示语言。

使用:

mtx-context     | current version: 2021.11.30 19:49

笔记:XHTML 是由 Markdown 文档生成的,例如:

Here is an XML snippet:

``` xml
<import src="constants.xml" />
<device type="web" uri="HOST">
  <form ... />
</device>
```

Here is a Java snippet:

``` java
import java.net.*;

public class JavaClass {
  // ...
}
```

问题

有几个问题:

  • 调用\xmlflushspacewise{#1}似乎无法提供将语法高亮应用于嵌套源代码片段的能力。
  • 根据code元素的动态应用语法高亮class,其形式为“language-X”,其中 X 可以是任何知名的编程语言(xmlpythonjavarubyjavascript等)。

代码

以下示例按预期排版源代码片段:

\startbuffer[html]
<html>
<body>
<pre>
      <code class="language-xml">&lt;import src="constants.xml" /&gt;
&lt;import src="tests/login.xml" /&gt;

&lt;device type="web" uri="HOST"&gt;
  &lt;click id="device" /&gt;

  &lt;form id="upload-file"&gt;
    &lt;assign id="firmware" value="FILENAME.fw" /&gt;
    &lt;click id="upload-file-button" /&gt;
  &lt;/form&gt;
&lt;/device&gt;
</code>
    </pre>
</body>
</html>
\stopbuffer

\startxmlsetups xml:initialize
  \xmlsetsetup{#1}{*}{-}
  \xmlsetsetup{#1}{html|body|pre|code}{xml:*}
\stopxmlsetups

\xmlregistersetup{xml:initialize}

\startxmlsetups xml:html
  \startdocument
    \xmlflush{#1}
  \stopdocument
\stopxmlsetups

\startxmlsetups xml:body
  \xmlflush{#1}
\stopxmlsetups

\startxmlsetups xml:pre
  \xmlflush{#1}
\stopxmlsetups

\startxmlsetups xml:code
  \xmlflushspacewise{#1}
\stopxmlsetups

\xmlprocessbuffer{main}{html}{}

得出的结果为:

XML 文档输出

问题

如何以与被着色的代码片段语言无关的方式将语法突出显示应用于输出?

作为奖励,是否可以以跨平台的方式进行(即不依赖于 vim)?

有关的

答案1

大部分内容来自维基页面“逐字 XML”

\startbuffer[html]
<html>
<body>
<pre>
      <code class="language-xml">&lt;import src="constants.xml" /&gt;
&lt;import src="tests/login.xml" /&gt;

&lt;device type="web" uri="HOST"&gt;
  &lt;click id="device" /&gt;

  &lt;form id="upload-file"&gt;
    &lt;assign id="firmware" value="FILENAME.fw" /&gt;
    &lt;click id="upload-file-button" /&gt;
  &lt;/form&gt;
&lt;/device&gt;
</code>
    </pre>

    <pre>
Hello!
    </pre>

    <pre>
    <code class="language-lua">
for k, v in ipairs(table) do
    print(k, v)
end
    </code>
    </pre>
</body>
</html>
\stopbuffer

\startxmlsetups xml:initialize
  \xmlsetsetup{#1}{*}{-}
  \xmlsetsetup{#1}{html|body|pre|code}{xml:*}
\stopxmlsetups

\xmlregistersetup{xml:initialize}

\startxmlsetups xml:html
  \startdocument
    \xmlflush{#1}
  \stopdocument
\stopxmlsetups

\startxmlsetups xml:body
  \xmlflush{#1}
\stopxmlsetups

\usemodule[scite] % Optional

\startluacode
  function xml.functions.highlight( t )
    local lang = (xml.attribute( t, "/", "class" ) or "")
      :match("language%-(.*)")
    local options = "before=\\startlinenumbering,after=\\stoplinenumbering"

    if lang then
      options = options .. ",option=" .. lang
    end

    buffers.assign(
      "highlight",
      "\\starttyping[" ..
      options ..
      "]\n" ..
      xml.textonly( t ) ..
      "\n\\stoptyping"
    )
    context.getbuffer { "highlight" }
  end
\stopluacode

\startxmlsetups xml:pre
  \xmlflush{#1}
\stopxmlsetups

\startxmlsetups xml:code
  \pushcatcodetable
  \setcatcodetable\ctxcatcodes
  \startnarrower[left]
      \xmlfunction{#1}{highlight}
  \stopnarrower
  \popcatcodetable
\stopxmlsetups

\xmlprocessbuffer{main}{html}{}

作为奖励,是否可以以跨平台的方式进行(即不依赖于 vim)?

您可以使用内置荧光笔可突出显示 XML、MetaPost、TeX、Lua 和 C。您还可以使用内置scite模块支持 XML、MetaPost、TeX、Lua、C、C++、SQL 和 JSON

如果你需要更多的语言,你可以编写自己的荧光笔(不是困难)或使用vim模块

相关内容