51

是否可以在重组文本中删除文本?

<strike>例如,在转换为 HTML 时 呈现为标签的内容,例如: ReSTructuredText

4

8 回答 8

46

按照 Ville Säävuori 的建议,我更好地检查了文档,我决定像这样添加删除线:

.. role:: strike
    :class: strike

在文档中,这可以应用如下:

:strike:`This text is crossed out`

然后在我的css文件中我有一个条目:

.strike {
  text-decoration: line-through;
}
于 2011-07-11T15:16:03.157 回答
16

至少有三种方法可以做到:

.. role:: strike

An example of :strike:`strike through text`.

.. container:: strike

   Here the full block of test is striked through.

An undecorated paragraph.

.. class:: strike

This paragraph too is is striked through.

.. admonition:: cancelled
   :class: strike

I strike through cancelled text.

申请后rst2html获得:

<p>An example of <span class="strike">strike through text</span>.</p>
<div class="strike container">
Here the full block of test is striked through.</div>
<p>An undecorated paragraph.</p>
<p class="strike">This paragraph too is is striked through.</p>
<div class="strike admonition">
<p class="first admonition-title">cancelled</p>
<p class="last">I strike through cancelled text.</p>

您将它们与样式一起使用

.strike {
  text-decoration: line-through;
}

在这里,我以admonition指令为例,但任何允许该:class:选项的指令都可以。

当它生成一个指令时,spanrole指令是唯一允许将您的样式应用于段落的一部分的指令。

正如 Gozzilli 所建议的那样,将一个类添加strike到也名为 的指令 中是多余的strike,因为指令名称是 html 输出的默认类。

rest2html我已经用和Sphinx检查了这些语法。但是,虽然 指令rest2html的一切都按预期工作,但Sphinxclass 失败。您必须将其替换为

.. rst-class:: strike

This paragraph too is is striked through.

仅在Sphinx reSt Primer的一个小 脚注中说明。

于 2013-01-12T16:03:11.487 回答
14

According to the official spec there is no directive for strikethrough markup in ReST.

However, if the environment allows for :raw: role or you are able to write your own roles, then you can write a custom plugin for it.

于 2011-07-08T18:51:52.243 回答
5

这是一个角色的 Python 定义,del如果您想在 Pelican 博客或 Sphinx 文档项目的多个页面中使用该角色,它比公认的答案更好:

from docutils import nodes
from docutils.parsers.rst import roles

def deleted_role(_role, rawtext, text, _lineno, _inliner, options={}, _content=[]):
    roles.set_classes(options)
    options.setdefault('classes', []).append("del")
    return [nodes.inline(rawtext, text, **options)], []

roles.register_canonical_role('del', deleted_role)

更好的是扩展 HTML 编写器以生成适当的<del>标签,如下所示:

from docutils import nodes
from docutils.parsers.rst import roles
from docutils.writers._html_base import HTMLTranslator

class delnode(nodes.inline):
    pass

def visit_delnode(self, node):
    self.body.append(self.starttag(node, 'del', ''))
def depart_delnode(self, node):
    self.body.append('</del>')

HTMLTranslator.visit_delnode = visit_delnode
HTMLTranslator.depart_delnode = depart_delnode

def deleted_role(_role, rawtext, text, _lineno, _inliner, options={}, _content=[]):
    roles.set_classes(options)
    return [delnode(rawtext, text, **options)], []

roles.register_canonical_role('del', deleted_role)

当然,您可以对其进行微调以生成<s>.

于 2020-06-21T00:49:06.247 回答
4

我发现其他答案非常有帮助。我对 Sphinx 不是很熟悉,但我正在将它用于一个项目。我也想要删除能力,并根据之前的答案让它工作。为了清楚起见,我添加了 gozzilli 提到的删除线角色,但我使用 rst_prolog 变量将其保存在我的 conf.py 中,如堆栈溢出线程中所述。这意味着该角色可用于您的所有 REST 文件。

layout.html然后,我通过在_templates我的源目录中创建来扩展基本 html 模板,如上所述。这个文件的内容是:

{% extends "!layout.html" %}
{% set css_files = css_files + ["_static/myStyle.css"] %}

这基本上包括一个自定义 css 文件到您构建的所有默认 html 文档。

最后,在我的源目录中的 _static 目录中,我包含了myStyle.css包含以下内容的文件:

.strike {
  text-decoration: line-through;
}

其他答案已经提供了。

我只是在写这个答案,因为我有限的 Sphinx 经验对我来说并不明显要编辑哪些文件。

于 2013-02-22T11:33:24.480 回答
3

考虑到用户可能有不同的背景,所以这里没有一个适合所有人的解决方案。

1.只有一个文件

如果您只在一个文件上使用它。例如,您向 PyPI 发布了一个简单的项目,您可能只有一个 README.rst 文件。以下可能你想要的。

.. |ss| raw:: html

    <strike>

.. |se| raw:: html

    </strike>

single line
=============

|ss| abc\ |se|\defg

multiple line
=============

|ss|  
line 1

line 2
|se|

789

你可以复制粘贴到这个网站上:https ://livesphinx.herokuapp.com/

并会看到如下图片:

在此处输入图像描述

很简单,你可以在某些IDE上直接看到预览,例如PyCharm。


bellow 是为 Sphinx 的用户写的

2.狮身人面像初学者

如果你是 Sphinx 的初学者。(我的意思是也许你想使用 Sphinx 来创建一个文档,但是 Python 对你来说并不熟悉)然后尝试如下:

# conf.py

from pathlib import Path
html_static_path = ['_static', ]
html_css_files = ['css/user.define.css']  # If you want to control which HTML should contain it, you can put it on the HTML, which is very like the answer by @Gregory Kuhn.

with open(Path(__file__).parent / Path('_static/css/user.define.rst'), 'r') as f:
    user_define_role = f.read()

rst_prolog = '\n'.join([ user_define_role + '\n',])  # will be included at the beginning of every source file that is read.
# rst_epilog = '\n'.join([ user_define_role + '\n',])  # it's ok if you put it on the end.

用户定义.rst

.. role:: strike

用户定义.css

.strike {text-decoration: line-through;}

使用rst_prolog,它可以在每个 rst 文件上自动添加角色,但是如果您更改内容(该文件,它包含您定义的格式),那么您必须重新构建以使渲染正确。

3.创建角色

您可以创建一个扩展来实现它。

# conf.py

extensions = ['_ext.rst_roles', ]
html_static_path = ['_static', ]
html_css_files = ['css/user.define.css']
# rst_roles.py
from sphinx.application import Sphinx
from docutils.parsers.rst import roles
from docutils import nodes
from docutils.parsers.rst.states import Inliner


def strike_role(role, rawtext, text, lineno, inliner: Inliner, options={}, content=[]):
    your_css_strike_name = 'strike'
    return nodes.inline(rawtext, text, **dict(classes=[your_css_strike_name])), []

def setup(app: Sphinx):
    roles.register_canonical_role('my-strike', strike_role)  # usage:  :my-strike:`content ...`

完整的架构:

  • 配置文件
  • _ext/
    • rst_roles.py
  • _静止的/
    • css/
      • 用户定义.css

关于规则,你可以参考这个链接rst-roles

而且我建议你去看看docutils.parsers.rst.roles.py

于 2020-05-25T10:12:31.517 回答
2

我为此写了一个扩展。
只需pip install sphinxnotes-strike使用:

:strike:`text` 

或者

:del:`text` 

显示罢工文本。

欲了解更多信息:https ://sphinx-notes.github.io/strike/

于 2021-02-13T06:51:00.093 回答
0

从 Docutils 0.17 开始,如果在 、 或 元素中找到匹配的类值,HTML5 编写器会使用<del>inlineliteralcontainer

.. role:: del

:del:`This text has been deleted`, here is the rest of the paragraph.

.. container:: del

  This paragraph has been deleted.
于 2020-07-14T18:27:50.753 回答