| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101 |
- """This preprocessor detect cells using a different language through
- magic extensions such as `%%R` or `%%octave`. Cell's metadata is marked
- so that the appropriate highlighter can be used in the `highlight`
- filter.
- """
- # Copyright (c) Jupyter Development Team.
- # Distributed under the terms of the Modified BSD License.
- import re
- from traitlets import Dict
- from .base import Preprocessor
- class HighlightMagicsPreprocessor(Preprocessor):
- """
- Detects and tags code cells that use a different languages than Python.
- """
- # list of magic language extensions and their associated pygment lexers
- default_languages = Dict(
- {
- "%%R": "r",
- "%%bash": "bash",
- "%%cython": "cython",
- "%%javascript": "javascript",
- "%%julia": "julia",
- "%%latex": "latex",
- "%%octave": "octave",
- "%%perl": "perl",
- "%%ruby": "ruby",
- "%%sh": "sh",
- "%%sql": "sql",
- }
- )
- # user defined language extensions
- languages = Dict(
- help=(
- "Syntax highlighting for magic's extension languages. "
- "Each item associates a language magic extension such as %%R, "
- "with a pygments lexer such as r."
- )
- ).tag(config=True)
- def __init__(self, config=None, **kw):
- """Public constructor"""
- super().__init__(config=config, **kw)
- # Update the default languages dict with the user configured ones
- self.default_languages.update(self.languages)
- # build a regular expression to catch language extensions and choose
- # an adequate pygments lexer
- any_language = "|".join(self.default_languages.keys())
- self.re_magic_language = re.compile(rf"^\s*({any_language})\s+")
- def which_magic_language(self, source):
- """
- When a cell uses another language through a magic extension,
- the other language is returned.
- If no language magic is detected, this function returns None.
- Parameters
- ----------
- source: str
- Source code of the cell to highlight
- """
- m = self.re_magic_language.match(source)
- if m:
- # By construction of the re, the matched language must be in the
- # languages dictionary
- return self.default_languages[m.group(1)]
- return None
- def preprocess_cell(self, cell, resources, cell_index):
- """
- Tags cells using a magic extension language
- Parameters
- ----------
- cell : NotebookNode cell
- Notebook cell being processed
- resources : dictionary
- Additional resources used in the conversion process. Allows
- preprocessors to pass variables into the Jinja engine.
- cell_index : int
- Index of the cell being processed (see base.py)
- """
- # Only tag code cells
- if cell.cell_type == "code":
- magic_language = self.which_magic_language(cell.source)
- if magic_language:
- cell["metadata"]["magics_language"] = magic_language
- return cell, resources
|