【问题标题】:prismjs: highlight single wordsprismjs:突出显示单个单词
【发布时间】:2018-09-10 18:58:01
【问题描述】:

我正在使用https://prismjs.com 突出显示我的代码,它运行良好。

这是一个例子

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

导致

我只想在这种情况下更改'user_id' 的字体颜色和背景颜色(一般情况下,我不想更改'id''App\Phone' 的颜色)。我只想强调它,因为这个词本身对于给定的上下文很重要。这可能吗?

我在源码中发现js-script把上面的代码改成了

<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 文件中,它将像以前一样呈现。如果我在 span 元素中添加 style="background-color: red !important;" 之类的内容,它将被 js 文件忽略并覆盖。

是否有一个快速的肮脏修复方法,我可以只更改特定单词的颜色/背景颜色?

【问题讨论】:

    标签: javascript css prismjs


    【解决方案1】:

    要让 prismjs 仅突出显示一行的 部分,请使用 keep-markup 插件。

    在以下示例中,我将目标括在&lt;mark&gt;...&lt;/mark&gt; 中。我创建了一个 CSS 规则来设置它的样式。

    注意:它不一定是mark 元素;我选择它是因为它在语义上最合适。

    pre code mark { 
        background-color: yellow;
        border: 1px solid red;
        padding: 2px;
        font-style: italic;
    }
    <h2>Demo of prismjs keep-markup plugin</h2>
    
    <pre><code class="language-php">
        $user->hasOne('App\Phone', <mark>'user_id'</mark>, 'id');
    </code></pre>
    
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/prism/1.25.0/themes/prism.min.css"/>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.25.0/prism.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.25.0/components/prism-php.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.25.0/components/prism-markup-templating.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.25.0/plugins/keep-markup/prism-keep-markup.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.25.0/plugins/normalize-whitespace/prism-normalize-whitespace.min.js"></script>

    【讨论】:

      【解决方案2】:

      对于这种特殊情况,可以使用nth-child() 选择器。只需计算&lt;span&gt; 标签并使用这样的选择器:

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

      这是一个 CSS 示例(PHP 在 Stack Snippet 中无法正常工作)。你应该给这个实例一个特殊的类(这里作为一个例子.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>

      【讨论】:

      • 完美!谢谢!
      • 我错了还是这不仅仅是对第三个跨度进行硬编码?这将要求代码 sn-p 永远不会改变。
      • @JoshM 是的,你是对的 - 答案只针对这种特定情况。
      【解决方案3】:

      为了在不硬编码 PrismJS 生成的 HTML 元素的情况下实现您想要的,我想建议使用基于 Javascript/JQuery 的方法。这种方法来自 Markdown 语法思想,尽管它与语法无关,并且可以更改为您喜欢的任何内容。流程如下:

      1. 在要更改的文本上创建一个标识符。这将有助于稍后用我们定义的 HTML 标记将其括起来。例如,在字符串之前和之后用双星将文本括起来。您发布的 HTML sn-p 将如下所示:
      <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 样式作为 &lt;span&gt;&lt;/span&gt; 的一个属性,用于替换双星。您可以将 CSS 更改为您想要的任何内容,这意味着两个双星内的所有字符串都将更改为该特定样式。
      • 您可以将特定图案(例如双星)分配给特定样式。更好的是,您可以将 CSS 类添加到特定模式。例如,双星可以替换为具有名为“font-color-and-background”的类的&lt;span&gt;&lt;/span&gt; 或其他任何东西,并让该类应用该样式。这将是:
      $(document).ready(function() {
          $(".code-toolbar").children().each(function() {
              $(this).html($(this).html().replace(/\*\*(.*?)\*\*/gm, "<span class='font-color-and-background'>$1</span>"));
          });
      });
      

      要将正则表达式更改为另一种模式,请将\*\* 替换为您想要的模式(特别是因为双星是一种降价语法模式并且可能会产生冲突)。最后,我对 PrismJS 完全没有经验,所以我不确定 PrismJS 生成的所有 sn-ps 是否都属于 code-toolbar 类。

      【讨论】:

        猜你喜欢
        • 2014-08-07
        • 2017-08-30
        • 1970-01-01
        • 1970-01-01
        • 2011-02-25
        • 1970-01-01
        • 1970-01-01
        • 2014-03-16
        • 1970-01-01
        相关资源
        最近更新 更多