54 votes

ReST barré

Est-il possible de barrer du texte en Restructured Text ?

Quelque chose qui, par exemple, est rendu par une balise lorsqu'il est converti en HTML, comme : ~~ReSTructuredText~~

0 votes

Quand vous utilisez Sphinx, cela pourrait vous aider : stackoverflow.com/a/24932178/2923406

48voto

gozzilli Points 1474

J'ai vérifié les documents plus attentivement, comme suggéré par Ville Säävuori, et j'ai décidé d'ajouter la barre de soulignement de la même manière :

.. rôle:: strike
    :class: strike

Dans le document, ceci peut être appliqué de la manière suivante :

:strike:`Ce texte est barré`

Ensuite, dans mon fichier css, j'ai une entrée :

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

1 votes

Le problème avec cette approche est que vous devez répéter cette définition dans chaque fichier reST que vous souhaitez utiliser des barrages, et cela ne produit pas de balisage significatif du côté HTML (il serait beaucoup mieux de produire une balise ou ). J'ai posté le code pour cela ci-dessous (stackoverflow.com/a/62493316/695591)

18voto

marcz Points 414

Il existe au moins trois façons de le faire :

.. role:: strike

Un exemple de :strike:`texte barré`.

.. container:: strike

   Ici, le bloc complet de texte est barré.

Un paragraphe non décoré.

.. class:: strike

Ce paragraphe aussi est barré.

.. admonition:: annulé
   :class: strike

Je barre le texte annulé.

Après l'application de rst2html vous obtenez :

Un exemple de texte barré.

Ici, le bloc complet de texte est barré.
Un paragraphe non décoré.
Ce paragraphe aussi est barré.

Vous les utilisez avec un style

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

Ici, j'ai pris la directive admonition comme exemple mais n'importe quelle directive qui permet l'option :class: ferait l'affaire.

Comme il génère un span, la directive role est la seule qui permet d'appliquer votre style à une partie d'un paragraphe.

Il est redondant d'ajouter une classe strike à une directive également nommée strike, comme le suggère Gozzilli, car le nom de la directive est la classe par défaut pour la sortie html.

J'ai vérifié cette syntaxe à la fois avec rest2html ``et **Sphinx**. Mais alors que tout fonctionne comme prévu avec `rest2html`, la directive `class` échoue avec **Sphinx**. Vous devez la remplacer par``

`

.. rst-class:: strike

Ce paragraphe aussi est barré.

Cela est uniquement indiqué dans une petite note de bas de page du Sphinx reSt Primer.

` ``

0 votes

Vous êtes sûr de ce lien. Il ne semble pas aller où vous l'avez prévu.

2 votes

@Tshepang, j'ai vérifié, le lien aboutit à une note de bas de page qui indique : Lorsque le domaine par défaut contient une directive de classe, cette directive sera cachée. Par conséquent, Sphinx la ré-exporte en tant que classe rst.

16voto

Selon la spécification officielle, il n'y a aucune directive pour le barré dans ReST.

Cependant, si l'environnement permet le rôle :raw: ou si vous êtes capable d'écrire vos propres rôles, vous pouvez écrire un plugin personnalisé pour cela.

0 votes

J'ai posté le code du plugin ci-dessous (stackoverflow.com/a/62493316/695591)

5voto

Carson Arucard Points 334

Considérez que l'utilisateur peut avoir un contexte différent, donc il n'existe pas de solution unique qui conviendrait à tous.

1. Seulement un fichier

Si vous l'utilisez uniquement sur un fichier. Par exemple, vous avez publié un projet simple sur PyPI, et vous avez probablement seulement un fichier README.rst. Voici ce que vous voulez peut-être.

.. |ss| raw:: html

.. |se| raw:: html

ligne unique
=============

|ss| abc\ |se|\defg

plusieurs lignes
=============

|ss|  
ligne 1

ligne 2

|se|

789

vous pouvez le copier et le coller sur ce site web : https://livesphinx.herokuapp.com/

et vous verrez l'image suivante :

entrez la description de l'image ici

C'est simple, et vous pouvez directement voir l'aperçu dans certains IDE, par exemple, PyCharm.


ci-dessous est écrit pour les utilisateurs de Sphinx

2. Débutant de Sphinx

Si vous êtes débutant de Sphinx. ( Je veux dire peut-être vous voulez utiliser Sphinx pour créer un document, mais Python ne vous est pas familier ) essayez comme suit :

# conf.py

from pathlib import Path
html_static_path = ['_static', ]
html_css_files = ['css/user.define.css']  # Si vous voulez contrôler lequel HTML doit le contenir, vous pouvez le mettre sur le HTML, ce qui ressemble beaucoup à la réponse de @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',])  # sera inclus au début de chaque fichier source lu.
# rst_epilog = '\n'.join([ user_define_role + '\n',])  # c'est bon si vous le mettez à la fin.

user.define.rst

.. role:: strike

user.define.css

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

Avec le rst_prolog, Il peut ajouter automatiquement le rôle à chaque fichier rst, mais si vous modifiez le contenu (ce fichier contient un format que vous avez défini), vous devez reconstruire pour que le rendu soit correct.

3. Créer des rôles

Vous pouvez créer une extension pour y parvenir.

# 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 ...`

L'architecture complète :

  • conf.py
  • _ext/
    • rst_roles.py
  • _static/
    • css/
      • user.define.css

à propos des règles, vous pouvez consulter ce lien rst-roles

Et je vous recommande fortement de consulter le docutils.parsers.rst.roles.py .

0 votes

Je ne sais pas pourquoi ma réponse rend quelqu'un mécontent puis me donne un vote négatif et j'espère que vous pouvez me dire pourquoi, de toute façon, j'ai mis à jour ma solution en espérant que vous allez comprendre.

1 votes

Ceci est la réponse optimale, actuellement. La première solution "Un seul fichier." est vraiment optimale. C'est la seule solution qui fonctionne réellement pour le cas commun d'un fichier reST hébergé sur un site tiers non sous votre contrôle direct (par exemple, un README.rst hébergé sur GitHub ou GitLab). Les haters vont détester, @Carson. Je ne prendrais pas les votes négatifs personnellement. Ils sont juste jaloux.

5voto

Gregory Kuhn Points 52

J'ai trouvé les autres réponses très utiles. Je ne suis pas très familier avec Sphinx mais je l'utilise pour un projet. Je voulais également avoir la capacité de barrer du texte et j'ai réussi à le faire en me basant sur les réponses précédentes. Pour être clair, j'ai ajouté mon rôle de barré comme gozzilli l'a mentionné mais je l'ai enregistré à l'intérieur de mon conf.py en utilisant la variable rst_prolog comme discuté dans le fil de stack overflow ici. Cela signifie que ce rôle est disponible pour tous vos fichiers rest.

Ensuite, j'ai étendu le modèle html de base comme décrit ci-dessus en créant layout.html à l'intérieur de _templates dans mon répertoire source. Le contenu de ce fichier est :

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

Cela inclut essentiellement un fichier css personnalisé à tous vos documents html par défaut générés.

Enfin, dans mon répertoire _static à l'intérieur de mon répertoire source, j'ai inclus le fichier myStyle.css qui contient :

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

Comme les autres réponses l'ont déjà fourni.

Je rédige simplement cette réponse car il n'était pas évident pour moi, avec mon expérience limitée de Sphinx, quels fichiers éditer.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X