Я хочу расширить возможности highlight.js
для языка R
, чтобы (1) все имена функций, за которыми следуют открывающие скобки (
и (2) все имена пакетов, за которыми следуют операторы ::
и :::
, будут выделены (как в RStudio, см. рис. 1). Круглые скобки (
, )
и операторы ::
, :::
не должны выделяться.
Рис.1. Желаемое выделение R
частей кода (имена функций и пакетов).
Мой пример состоит из двух файлов: index.html
и r.min.js
.
HTML-файл:
<html lang="en-us">
<head> <meta charset="utf-8">
<link href='https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/agate.min.css' rel='stylesheet' type='text/css' />
</head>
<body>
<pre class="r"><code>doc_name <-
officer::read_docx() %>%
flextable:::body_add_flextable(table_to_save) %>%
print(target = "word.docx")
.libPaths()
c("a", "b")
package::function()$field
* +1032 * hljs.initHighlightingOnLoad ();
r.min.js
файл:
hljs.registerLanguage("r",function(e){var r="([a-zA-Z]|\\.[a-zA-Z.])[a-zA-Z0-9._]*";return{c:[e.HCM,{b:r,l:r,k:{keyword:"function if in break next repeat else for return switch while try tryCatch stop warning require library attach detach source setMethod setGeneric setGroupGeneric setClass ...",literal:"NULL NA TRUE FALSE T F Inf NaN NA_integer_|10 NA_real_|10 NA_character_|10 NA_complex_|10"},r:0},{cN:"number",b:"0[xX][0-9a-fA-F]+[Li]?\\b",r:0},{cN:"number",b:"\\d+(?:[eE][+\\-]?\\d*)?L\\b",r:0},{cN:"number",b:"\\d+\\.(?!\\d)(?:i\\b)?",r:0},{cN:"number",b:"\\d+(?:\\.\\d*)?(?:[eE][+\\-]?\\d*)?i?\\b",r:0},{cN:"number",b:"\\.\\d+(?:[eE][+\\-]?\\d*)?i?\\b",r:0},{b:"`",e:"`",r:0},{cN:"string",c:[e.BE],v:[{b:'"',e:'"'},{b:"'",e:"'"}]},
/* My attempt... */
/* ... to highlight function names between double
and triple colons and opening parenthesis (in red as symbol): */
{cN:"symbol",b:":::|::",e:"\\(",eB:!0,eE:!0},
/* ... to highlight other function names (in red as symbol): */
{cN:"symbol", b:"([a-zA-Z]|\.[a-zA-Z.])[a-zA-Z0-9._]*",e:"\\(",eE:!0},
/* ... to highlight package names (in cyan as variable): */
{cN:"variable",b:"(?<!\w)",e:":::|::",eE:!0},
]}});
r.min.js
основан на ( этот файл ) и содержит highlight.js
правил для идентификации r
элементов кода.
Строки, которые я добавил, находятся ниже комментария «Моя попытка». Значения сокращений: cN
- имя класса css, b
- "beggins", e
- "заканчивается", eB
- "исключить начало", eE
- "исключить конец", другие значения объяснил здесь .
Результат, который я получаю (рис.2.), Не является удовлетворительным. Похоже, что используемые мной регулярные выражения не находят правильных начала и конца нужных частей кода R
.
r.min.js">
Рис.2. Результат с использованием модифицированного r.min.js
Каким должен быть правильный код highlight.js
в r.min.js
, чтобы подсвечивать части кода R
, как в RStudio?