Skip to content

Instantly share code, notes, and snippets.

@abravalheri
Last active September 11, 2021 14:56

Revisions

  1. abravalheri revised this gist Sep 11, 2021. 1 changed file with 1 addition and 1 deletion.
    2 changes: 1 addition & 1 deletion !Dummy rst2myst example for issue.md
    Original file line number Diff line number Diff line change
    @@ -1,6 +1,6 @@
    # dummy-rst2myst-example-for-issue

    This repository demonstrates an issue with the [`rst2myst`](https://rst-to-myst.readthedocs.io/)
    This repository demonstrates an [issue](https://github.com/executablebooks/rst-to-myst/issues/33) with the [`rst2myst`](https://rst-to-myst.readthedocs.io/)
    conversion tool.

    ## Issue
  2. abravalheri renamed this gist Sep 11, 2021. 1 changed file with 0 additions and 0 deletions.
    File renamed without changes.
  3. abravalheri revised this gist Sep 11, 2021. 1 changed file with 60 additions and 1 deletion.
    61 changes: 60 additions & 1 deletion README.md
    Original file line number Diff line number Diff line change
    @@ -3,6 +3,54 @@
    This repository demonstrates an issue with the [`rst2myst`](https://rst-to-myst.readthedocs.io/)
    conversion tool.

    ## Issue

    The way `rst2myst` translates [rst substitutions](https://docutils.sourceforge.io/docs/ref/rst/restructuredtext.html#substitution-definitions) to Markdown does not seem to work properly.
    So far 2 inconsistencies have been identified:

    1. `rst2myst` relies on [MyST ability to use Jinja2 for substitutions](https://myst-parser.readthedocs.io/en/latest/syntax/optional.html#substitutions-with-jinja2).
    Jinja2 requires a valid identifier (i.e., [valid Python variable names](https://docs.python.org/3/reference/lexical_analysis.html#identifiers)), which is a much more restrictive condition, and therefore not compatible with `rst` (e.g. `rst` accepts strings with spaces)

    2. `rst2myst` fails on translating [links with
    substitutions](https://docutils.sourceforge.io/docs/ref/rst/restructuredtext.html#substitution-references) (e.g. `|ref|_`), which are a very common use case when writing `rst` (e.g. for creating links with bold, italic or monospaced text elements)


    This issue was first identified in
    [pyscaffold/pyscaffoldext-markdown#25](https://github.com/pyscaffold/pyscaffoldext-markdown/pull/25).
    An equivalent but minimal/simplified example can be found in [`original.rst`](./original.rst).

    The following command was used to convert the file to
    MyST-flavoured markdown, producing [`converted.md`](./converted.md).

    ```bash
    $ rst2myst stream original.rst > converted.md
    ```

    As we can see, `converted.md` contains invalid Jinja2 syntax, e.g. `{{ the
    repository service }}`, and the original *link with substitution* was converted
    to a simple link, without a substitution.


    ## Expected output

    Two different behaviours could be expected from `rst2myst`:

    1. The *"rst substitution key"* could be pre-processed to produce a valid
    Python identifier and in turn, that identifier could be used in Jinja2.
    This include replacing or removing invalid characters, e.g. `|the repository service|`
    could be translated to `{{ the_repository_service }}`.
    This approach in shown in [`expected_option1.md`](./expected_option1.md)
    2. The *"rst substitution key"* could be nested inside a dict value with an
    arbitrary name (e.g. `__`), e.g. `|the repository service|`
    could be translated to `{{ __["the repository service"] }}`.
    This approach in shown in [`expected_option2.md`](./expected_option2.md)

    Regarding *links with substitutions*, CommonMark's
    [full reference links](https://spec.commonmark.org/0.30/#full-reference-link)
    in combination with Jinja2 seem to be a good alternative, e.g.
    `|ref|_` could be translated to `[{{ ref }}][ref]`. This approach is shown in
    both `expected_option1.md` and `expected_option2.md`.

    ## Running the example

    To run this example, you will need a [Python virtual environment](https://virtualenv.pypa.io/en/latest/)
    @@ -11,5 +59,16 @@ configured with the right dependencies. The following commands can be used to cr
    ```bash
    $ virtualenv -p py38 .venv
    $ source .venv/bin/activate
    $ pip install sphinx myst-parser rst-to-myst
    $ pip install sphinx myst-parser 'rst-to-myst[sphinx]'
    ```

    (A POSIX operating system an shell is also assumed)

    The following commands can be used to compile the examples and serve
    HTML locally:

    ```bash
    $ rst2myst stream original.rst > converted.md
    $ make html
    $ python3 -m http.server --directory _build/html
    ```
  4. abravalheri revised this gist Sep 11, 2021. 1 changed file with 7 additions and 1 deletion.
    8 changes: 7 additions & 1 deletion index.rst
    Original file line number Diff line number Diff line change
    @@ -6,11 +6,17 @@
    Welcome to Dummy rst2myst example for issue's documentation!
    ============================================================

    The purpose of this file is to setup the project in a way Sphinx process all
    example ``.rst`` and ``.md`` files.

    .. toctree::
    :maxdepth: 2
    :caption: Contents:


    Original reST file <original>
    Automatic Conversion (current state) <converted>
    Expected Conversion (option 1) <expected_option1>
    Expected Conversion (option 2) <expected_option2>

    Indices and tables
    ==================
  5. abravalheri revised this gist Sep 11, 2021. 4 changed files with 79 additions and 0 deletions.
    21 changes: 21 additions & 0 deletions converted.md
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,21 @@
    ---
    substitutions:
    contribute button: '"Create pull request"'
    the repository service: GitHub
    virtual environments: '`virtualenv`'
    ---

    # Automatic Conversion (current state)

    1. To avoid any problems with your installed Python packages, consider using [virtual environments]

    2. If everything works fine, push your local branch to {{ the repository service }} with:

    ```
    git push -u origin my-feature
    ```

    3. Go to the web page of your fork and click {{ contribute button }} to send your changes for review.

    [virtual environments]: https://virtualenv.pypa.io/en/stable/

    21 changes: 21 additions & 0 deletions expected_option1.md
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,21 @@
    ---
    substitutions:
    contribute_button: '"Create pull request"'
    the_repository_service: GitHub
    virtual_environments: '`virtualenv`'
    ---

    # Expected Conversion (option 1)

    1. To avoid any problems with your installed Python packages, consider using [{{ virtual_environments }}][virtual environments]

    2. If everything works fine, push your local branch to {{ the_repository_service }} with:

    ```
    git push -u origin my-feature
    ```

    3. Go to the web page of your fork and click {{ contribute_button }} to send your changes for review.

    [virtual environments]: https://virtualenv.pypa.io/en/stable/

    22 changes: 22 additions & 0 deletions expected_option2.md
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,22 @@
    ---
    substitutions:
    "__":
    contribute button: '"Create pull request"'
    the repository service: GitHub
    virtual environments: '`virtualenv`'
    ---

    # Expected Conversion (option 2)

    1. To avoid any problems with your installed Python packages, consider using [{{ __["virtual environments"] }}][virtual environments]

    2. If everything works fine, push your local branch to {{ __["the repository service"] }} with:

    ```
    git push -u origin my-feature
    ```

    3. Go to the web page of your fork and click {{ __["contribute button"] }} to send your changes for review.

    [virtual environments]: https://virtualenv.pypa.io/en/stable/

    15 changes: 15 additions & 0 deletions original.rst
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,15 @@
    Original File
    =============

    #. To avoid any problems with your installed Python packages, consider using |virtual environments|_

    #. If everything works fine, push your local branch to |the repository service| with::

    git push -u origin my-feature

    #. Go to the web page of your fork and click |contribute button| to send your changes for review.

    .. |virtual environments| replace:: ``virtualenv``
    .. |the repository service| replace:: GitHub
    .. |contribute button| replace:: "Create pull request"
    .. _virtual environments: https://virtualenv.pypa.io/en/stable/
  6. abravalheri revised this gist Sep 11, 2021. 1 changed file with 14 additions and 1 deletion.
    15 changes: 14 additions & 1 deletion conf.py
    Original file line number Diff line number Diff line change
    @@ -28,6 +28,19 @@
    # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
    # ones.
    extensions = [
    "myst_parser"
    ]

    # Configure MyST-Parser
    myst_enable_extensions = [
    "amsmath",
    "colon_fence",
    "deflist",
    "dollarmath",
    "html_image",
    "replacements",
    "smartquotes",
    "substitution",
    ]

    # Add any paths that contain templates here, relative to this directory.
    @@ -36,7 +49,7 @@
    # List of patterns, relative to source directory, that match files and
    # directories to ignore when looking for source files.
    # This pattern also affects html_static_path and html_extra_path.
    exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store']
    exclude_patterns = ['.venv', '_build', 'README.md', '!README.md', 'Thumbs.db', '.DS_Store']


    # -- Options for HTML output -------------------------------------------------
  7. abravalheri created this gist Sep 11, 2021.
    15 changes: 15 additions & 0 deletions .gitignore
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,15 @@
    *~
    *.py[cod]
    *.orig
    *.log
    *.pot
    __pycache__/*
    .cache/*
    .*.swp
    tags
    .tox
    api/*
    _rst/*
    _build/*
    .venv*/
    .conda*/
    20 changes: 20 additions & 0 deletions Makefile
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,20 @@
    # Minimal makefile for Sphinx documentation
    #

    # You can set these variables from the command line, and also
    # from the environment for the first two.
    SPHINXOPTS ?=
    SPHINXBUILD ?= sphinx-build
    SOURCEDIR = .
    BUILDDIR = _build

    # Put it first so that "make" without argument is like "make help".
    help:
    @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)

    .PHONY: help Makefile

    # Catch-all target: route all unknown targets to Sphinx using the new
    # "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS).
    %: Makefile
    @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
    15 changes: 15 additions & 0 deletions README.md
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,15 @@
    # dummy-rst2myst-example-for-issue

    This repository demonstrates an issue with the [`rst2myst`](https://rst-to-myst.readthedocs.io/)
    conversion tool.

    ## Running the example

    To run this example, you will need a [Python virtual environment](https://virtualenv.pypa.io/en/latest/)
    configured with the right dependencies. The following commands can be used to create one:

    ```bash
    $ virtualenv -p py38 .venv
    $ source .venv/bin/activate
    $ pip install sphinx myst-parser rst-to-myst
    ```
    52 changes: 52 additions & 0 deletions conf.py
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,52 @@
    # Configuration file for the Sphinx documentation builder.
    #
    # This file only contains a selection of the most common options. For a full
    # list see the documentation:
    # http://www.sphinx-doc.org/en/master/config

    # -- Path setup --------------------------------------------------------------

    # If extensions (or modules to document with autodoc) are in another directory,
    # add these directories to sys.path here. If the directory is relative to the
    # documentation root, use os.path.abspath to make it absolute, like shown here.
    #
    # import os
    # import sys
    # sys.path.insert(0, os.path.abspath('.'))


    # -- Project information -----------------------------------------------------

    project = 'Dummy rst2myst example for issue'
    copyright = '2021, Anderson Bravalheri'
    author = 'Anderson Bravalheri'


    # -- General configuration ---------------------------------------------------

    # Add any Sphinx extension module names here, as strings. They can be
    # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
    # ones.
    extensions = [
    ]

    # Add any paths that contain templates here, relative to this directory.
    templates_path = ['_templates']

    # List of patterns, relative to source directory, that match files and
    # directories to ignore when looking for source files.
    # This pattern also affects html_static_path and html_extra_path.
    exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store']


    # -- Options for HTML output -------------------------------------------------

    # The theme to use for HTML and HTML Help pages. See the documentation for
    # a list of builtin themes.
    #
    html_theme = 'alabaster'

    # Add any paths that contain custom static files (such as style sheets) here,
    # relative to this directory. They are copied after the builtin static files,
    # so a file named "default.css" will overwrite the builtin "default.css".
    html_static_path = ['_static']
    20 changes: 20 additions & 0 deletions index.rst
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,20 @@
    .. Dummy rst2myst example for issue documentation master file, created by
    sphinx-quickstart on Sat Sep 11 12:45:56 2021.
    You can adapt this file completely to your liking, but it should at least
    contain the root `toctree` directive.
    Welcome to Dummy rst2myst example for issue's documentation!
    ============================================================

    .. toctree::
    :maxdepth: 2
    :caption: Contents:



    Indices and tables
    ==================

    * :ref:`genindex`
    * :ref:`modindex`
    * :ref:`search`
    35 changes: 35 additions & 0 deletions make.bat
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,35 @@
    @ECHO OFF

    pushd %~dp0

    REM Command file for Sphinx documentation

    if "%SPHINXBUILD%" == "" (
    set SPHINXBUILD=sphinx-build
    )
    set SOURCEDIR=.
    set BUILDDIR=_build

    if "%1" == "" goto help

    %SPHINXBUILD% >NUL 2>NUL
    if errorlevel 9009 (
    echo.
    echo.The 'sphinx-build' command was not found. Make sure you have Sphinx
    echo.installed, then set the SPHINXBUILD environment variable to point
    echo.to the full path of the 'sphinx-build' executable. Alternatively you
    echo.may add the Sphinx directory to PATH.
    echo.
    echo.If you don't have Sphinx installed, grab it from
    echo.http://sphinx-doc.org/
    exit /b 1
    )

    %SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O%
    goto end

    :help
    %SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O%

    :end
    popd