Prismjs: выделять отдельные слова

Я использую https://prismjs.com, чтобы выделить свой код, и он работает очень хорошо.

Вот пример

<pre>
  <code class = "language-php">
   $user->hasOne('App\Phone','user_id','id');
  </code>
</pre>

что приводит к

Prismjs: выделять отдельные слова

Я хотел бы изменить цвет шрифта и цвет фона для 'user_id' только в этом случае (не в целом, я не хочу менять цвета 'id' или 'App\Phone'). Я просто хочу выделить это, потому что само слово важно для данного контекста. Это возможно?

Я обнаружил в исходном коде, что js-скрипт изменяет приведенный выше код на

<pre class = "language-php">
 <code class = "language-php">
  <span class = "token variable">$user</span>
  <span class = "token operator">-</span>
  <span class = "token operator">&gt;</span>
  <span class = "token function">hasOne</span>
  <span class = "token punctuation">(</span>
  <span class = "token string">'App\Phone'</span>
  <span class = "token punctuation">,</span>
  <span class = "token string">'user_id'</span>
  <span class = "token punctuation">,</span>
  <span class = "token string">'id'</span>
  <span class = "token punctuation">)</span>
  <span class = "token punctuation">;</span>
 </code>
</pre>

Если я скопирую и вставлю этот код в свой исходный файл html, он будет отображаться, как и раньше. Если я добавлю что-то вроде style = "background-color: red !important;" в элемент span, он будет проигнорирован и заменен файлом js.

Есть ли быстрое грязное исправление, как я могу изменить только цвет / цвет фона определенного слова?

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
4
0
795
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

В этом особом случае это возможно с помощью селектора nth-child(). Просто посчитайте теги <span> и используйте такой селектор:

.language-css > span:nth-child(3)

Вот пример с CSS (PHP почему-то не работает здесь, в фрагменте стека). Вы должны дать этому экземпляру специальный класс (здесь в качестве примера .special), чтобы применить изменения только к этому единственному экземпляру:

.special.language-css>span:nth-child(3) {
  font-weight: bold;
  font-style: italic;
}
<link href = "https://cdnjs.cloudflare.com/ajax/libs/prism/1.15.0/themes/prism.css" rel = "stylesheet" />
<script src = "https://cdnjs.cloudflare.com/ajax/libs/prism/1.15.0/prism.js"></script>

<pre>
  <code class = "special language-css">
   p:nth-child(2) {
     background: red;
   }
  </code>
</pre>

Идеально! Спасибо!

Adam 10.09.2018 22:09

Я ошибаюсь или это не просто жесткое кодирование 3-го диапазона? Для этого потребуется, чтобы фрагмент кода никогда не менялся.

Josh M. 22.10.2020 22:26

@JoshM Да, вы правы - ответ как раз для этого конкретного случая.

andreas 27.10.2020 08:41

Чтобы достичь желаемого без жесткого кодирования элемента HTML, созданного PrismJS, я хочу предложить подход на основе Javascript / JQuery. Этот подход исходит из идеи синтаксиса уценки, хотя он не зависит от синтаксиса и может быть изменен на что угодно. Процесс следующий:

  1. Создайте идентификатор для текста, который хотите изменить. Это поможет в дальнейшем включить его в наш определенный тег HTML. Например, заключите текст в двойные звездочки перед строкой и после нее. Опубликованный вами фрагмент HTML будет выглядеть следующим образом:
<pre>
    <code class = "language-php">
        $user->hasOne('App\Phone','**user_id**','id');
    </code>
</pre>
  1. Затем создайте сценарий, который изменит эти двойные запуски на то, что вы хотите. Вы хотели изменить цвет шрифта и цвет фона, поэтому вы должны написать что-то вроде следующего и запустить его после загрузки PrismJS:
$(document).ready(function() {
    $(".code-toolbar").children().each(function() {
        $(this).html($(this).html().replace(/\*\*(.*?)\*\*/gm, "<span style='color: white; background-color: red !important'>$1</span>"));
    });
});

Некоторые примечания к номеру (2) выше:

  • Обратите внимание, что я вставил стиль CSS как атрибут <span></span>, который заменяет двойные звезды. Вы можете изменить CSS на все, что захотите. НО, что означает, что все строки внутри двух двойных звездочек будут изменены на этот конкретный стиль.
  • Вы можете назначить определенные шаблоны (например, двойные звезды) определенным стилям. Более того, вы можете добавить класс CSS к определенному шаблону. Например, двойные звезды можно заменить на <span></span>, имеющий класс с именем «font-color-and-background» или что-нибудь еще, и применить этот стиль к классу. Это было бы:
$(document).ready(function() {
    $(".code-toolbar").children().each(function() {
        $(this).html($(this).html().replace(/\*\*(.*?)\*\*/gm, "<span class='font-color-and-background'>$1</span>"));
    });
});

Чтобы изменить регулярное выражение на другой шаблон, замените \*\* нужным шаблоном (тем более, что двойные звездочки являются синтаксическим шаблоном уценки и могут вызвать конфликт). Наконец, у меня нет опыта работы с PrismJS, поэтому я не уверен, все ли сгенерированные PrismJS фрагменты относятся к классу code-toolbar.

Другие вопросы по теме