ReST зачеркнутый
Можно ли зачеркнуть текст в тексте "Реструктурированный"?
То, что, например, отображается как <strike>
тег при преобразовании в HTML, например: ReSTructuredText
8 ответов
Я лучше проверил документы, как это было предложено Вилле Сявуори, и решил добавить зачеркнутый текст следующим образом:
.. role:: strike
:class: strike
В документе это может быть применено следующим образом:
:strike:`This text is crossed out`
Тогда по моему css
файл у меня есть запись:
.strike {
text-decoration: line-through;
}
Есть как минимум три способа сделать это:
.. 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:
вариант подойдет.
Как это генерирует span
role
директива является единственной, которая позволяет применить ваш стиль к части абзаца.
Излишне добавлять класс strike
к директиве также по имениstrike
, как предполагает Гоззилли, потому что имя директивы является классом по умолчанию для вывода html.
Я проверил этот синтаксис как с rest2html
и сфинкс. Но пока все работает как положено с rest2html
class
директива терпит неудачу со сфинксом. Вы должны заменить его
.. rst-class:: strike
This paragraph too is is striked through.
Об этом говорится только в небольшой сноске Sphinx reSt Primer.
Согласно официальной спецификации, в ReST нет директивы для зачеркивания.
Однако, если среда позволяет:raw: role или вы можете написать свои собственные роли, тогда вы можете написать собственный плагин для него.
Я нашел другие ответы очень полезными. Я не очень знаком со Сфинксом, но использую его для проекта. Я тоже хотел зачеркнуть умение и заставить его работать на основе предыдущих ответов. Чтобы было ясно, я добавил свою зачеркнутую роль, о которой упоминал гоззилли, но сохранил ее в своем файле conf.py, используя переменную rst_prolog, как обсуждалось здесь в потоке переполнения стека. Это означает, что эта роль доступна для всех ваших файлов отдыха.
Затем я расширил базовый HTML-шаблон, как описано выше, создав layout.html
в _templates
внутри моего исходного каталога. Содержимое этого файла:
{% extends "!layout.html" %}
{% set css_files = css_files + ["_static/myStyle.css"] %}
Это в основном включает в себя пользовательский файл CSS для всех ваших встроенных HTML-документов по умолчанию.
Наконец, в моем каталоге _static внутри моего исходного каталога я включил файл myStyle.css
который содержит:
.strike {
text-decoration: line-through;
}
Какие другие ответы уже предоставили.
Я просто пишу этот ответ, так как для меня не было очевидным, с моим ограниченным опытом работы с Сфинксом, какие файлы редактировать.
Вот определение 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>
, конечно.
Учтите, что у пользователя может быть разный опыт, поэтому здесь нет единого решения, подходящего для всех.
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.
ниже пишет для пользователей Sphinx
2. новичок сфинкса
Если вы новичок в сфинксе. (Я имею в виду, что, возможно, вы хотите использовать 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.
user.define.rst
.. role:: strike
user.define.css
.strike {text-decoration: line-through;}
С rst_prolog
, Он может автоматически добавлять роль к каждому первому файлу, но если вы измените содержимое (этот файл содержит формат, который вы определяете), вы должны будете перестроить, чтобы сделать рендеринг правильным.
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 ...`
Полная архитектура:
- conf.py
- _ext/
- rst_roles.py
- _static /
- css /
- user.define.css
- css /
о правилах вы можете сослаться на эту ссылку rst-roles
И я рекомендую вам посмотреть docutils.parsers.rst.roles.py
.
Я написал для этого расширение.
Просто
pip install sphinxnotes-strike
и используйте:
:strike:`text`
чтобы показать текст предупреждения.
Для получения дополнительной информации: https://sphinx-notes.github.io/strike/
Репозиторий версии 0.17dev модуля HTML5-writer использует, если соответствующее значение класса найдено в inline
, literal
, или container
элементы:
.. role:: del
:del:`This text has been deleted`, here is the rest of the paragraph.
.. container:: del
This paragraph has been deleted.