在 org-mode 中使用 export 时自定义如何为源代码博客生成 html

Pet*_*ete 5 emacs org-mode

我一直在使用 org-mode 来撰写有关编程的博客文章。为此,我在 .org 文件中包含了内联代码段,如下所示:

#+BEGIN_SRC csharp
public class UserBuilder
{
    private string _firstName;
    private string _lastName;
...
#+END_SRC
Run Code Online (Sandbox Code Playgroud)

当我使用导出 html 函数时,它的格式如下:

<pre class="src src-csharp"><span style="color: #7f007f;">public</span> <span style="color: #7f007f;">class</span> <span style="color: #228b22;">UserBuilder</span>
{
    <span style="color: #7f007f;">private</span> <span style="color: #228b22;">string</span> <span style="color: #a0522d;">_firstName</span>;
    <span style="color: #7f007f;">private</span> <span style="color: #228b22;">string</span> <span style="color: #a0522d;">_lastName</span>;
...
</pre>
Run Code Online (Sandbox Code Playgroud)

当我在我的博客上使用 JavaScript 来格式化代码片段时,我只是希望输出是这样的:

<pre name="code" class="csharp">
public class UserBuilder
{
    private string _firstName;
    private string _lastName;
...
</pre>
Run Code Online (Sandbox Code Playgroud)

可以做到吗,怎么做?

Tru*_*ert 2

可以在,的文档中找到更改源代码导出器的文档org-export-format-source-code-or-exampleC-h f org-export-format-source-code-or-example

...
检查名称为“org--format-source-code-or-example”的函数是否已绑定。如果是,请将其用作自定义格式化程序。否则,使用默认格式化程序。为 docbook、html、latex 和 ascii 后端提供默认格式化程序。例如,使用“org-html-format-source-code-or-example”提供导出到“html”的自定义格式化程序。
...

可以在此处找到导出函数的示例(l. 2635)。修改以满足您的要求:

(defun org-html-format-source-code-or-example
  (lines lang caption textareap cols rows num cont rpllbl fmt)
  (setq lines
    (concat
     "<pre name=\"code\" class=\"" lang "\">\n"
     (cond
      (textareap
       (concat
        (format "<p>\n<textarea cols=\"%d\" rows=\"%d\">"
            cols rows)
        lines "</textarea>\n</p>\n"))
      (t
       (with-temp-buffer
         (insert lines)
         (goto-char (point-min))
         (while (re-search-forward "[<>&]" nil t)
           (replace-match (cdr (assq (char-before)
                     '((?&."&amp;")(?<."&lt;")(?>."&gt;"))))
                  t t))
         (buffer-string))))
     "</pre>\n"))
  (unless textareap
    (setq lines (org-export-number-lines lines 1 1 num cont rpllbl fmt)))  
  lines)
Run Code Online (Sandbox Code Playgroud)

评估后(复制到 *scratch* 并运行M-x eval-buffer,或放入 .emacs 并重新启动)html 导出 导出

#+BEGIN_SRC java
public class UserBuilder
{
    private string _firstName;
    private string _lastName;
}
#+END_SRC
Run Code Online (Sandbox Code Playgroud)

作为

<pre name="code" class="java">
public class UserBuilder
{
    private string _firstName;
    private string _lastName;
}
</pre>
Run Code Online (Sandbox Code Playgroud)

(必须在示例中切换语言,因为我的 emacs 不了解 c#,但它适用于所有语言)。