Почему Pygment.rb не выделяет теги <code> внутри <pre class = "lang"> должным образом - например, теги Google Prettify friendly?

Я называю это, на мой взгляд, так:

<%= markdown question.body %>

Это то, что мой ApplicationHelper похоже:

module ApplicationHelper
    class HTMLwithPygments < Redcarpet::Render::HTML
      def block_code(code, language)
        Pygments.highlight(code, lexer:language)
      end
    end

    def markdown(text)
        renderer = HTMLwithPygments.new(hard_wrap: true)
        options = {
          autolink: true,
          no_intra_emphasis: true,
          fenced_code_blocks: true,
          lax_html_blocks: true,
          strikethrough: true,
          superscript: true
        }
        Redcarpet::Markdown.new(renderer, options).render(text).html_safe
    end
end

Но, когда он сталкивается с тегами, как это:

<pre class="lang-cpp prettyprint-override">

К этому коду не применяются цветовые выделения. Это почему?

PS Это генерируется, например, переполнением стека, выполняя это: <!-- language: lang-cpp -->

Редактировать 1

Или, более конкретно, кажется, что он не будет форматировать <code> теги, которые находятся внутри <pre> теги. однажды <code> не внутри <pre> кажется, отформатировать это хорошо. Как мне исправить это?

Редактировать 2

Проблема, кажется, в данных, которые Pygment.rb действует на. Это HTML, как можно увидеть в этой сути - https://gist.github.com/marcamillion/14fa121cf3557d38c1a8. Поэтому я хочу, чтобы Pygment правильно форматировал код, возвращаемый в body атрибут этого объекта в моей сути.

Как я могу это сделать?

Редактировать 3

Это HTML -код, который я хотел бы Pygment.rb а также Redcarpet выполнить подсветку синтаксиса для:

<p>Here is a piece of C++ code that shows some very peculiar performance. For some strange reason, sorting the data miraculously speeds up the code by almost 6x:</p>

<pre class="lang-cpp prettyprint-override"><code>#include &lt;algorithm&gt;
#include &lt;ctime&gt;
#include &lt;iostream&gt;

int main()
{
    // Generate data
    const unsigned arraySize = 32768;
    int data[arraySize];

    for (unsigned c = 0; c &lt; arraySize; ++c)
        data[c] = std::rand() % 256;

    // !!! With this, the next loop runs faster
    std::sort(data, data + arraySize);

    // Test
    clock_t start = clock();
    long long sum = 0;

    for (unsigned i = 0; i &lt; 100000; ++i)
    {
        // Primary loop
        for (unsigned c = 0; c &lt; arraySize; ++c)
        {
            if (data[c] &gt;= 128)
                sum += data[c];
        }
    }

    double elapsedTime = static_cast&lt;double&gt;(clock() - start) / CLOCKS_PER_SEC;

    std::cout &lt;&lt; elapsedTime &lt;&lt; std::endl;
    std::cout &lt;&lt; "sum = " &lt;&lt; sum &lt;&lt; std::endl;
}
</code></pre>

<ul>
<li>Without <code>std::sort(data, data + arraySize);</code>, the code runs in <strong>11.54</strong> seconds.</li>
<li>With the sorted data, the code runs in <strong>1.93</strong> seconds.</li>
</ul>

<hr>

<p>Initially I thought this might be just a language or compiler anomaly. So I tried it in Java:</p>

<pre class="lang-java prettyprint-override"><code>import java.util.Arrays;
import java.util.Random;

public class Main
{
    public static void main(String[] args)
    {
        // Generate data
        int arraySize = 32768;
        int data[] = new int[arraySize];

        Random rnd = new Random(0);
        for (int c = 0; c &lt; arraySize; ++c)
            data[c] = rnd.nextInt() % 256;

        // !!! With this, the next loop runs faster
        Arrays.sort(data);

        // Test
        long start = System.nanoTime();
        long sum = 0;

        for (int i = 0; i &lt; 100000; ++i)
        {
            // Primary loop
            for (int c = 0; c &lt; arraySize; ++c)
            {
                if (data[c] &gt;= 128)
                    sum += data[c];
            }
        }

        System.out.println((System.nanoTime() - start) / 1000000000.0);
        System.out.println("sum = " + sum);
    }
}
</code></pre>

<p>with a similar but less extreme result.</p>

<hr>

<p>My first thought was that sorting brings the data into cache, but my next thought was how silly that is because the array was just generated.</p>

<p>What is going on? Why is a sorted array faster than an unsorted array? The code is summing up some independent terms, the order should not matter.</p>

Вы можете видеть текущий способ, которым этот конкретный вопрос представляется на: http://boso.herokuapp.com/

Это самый популярный вопрос на этом сайте, первый, который вы видите. Вы заметите, что код просто имеет серый фон и имеет отступ. Там нет красивой подсветки, как Pygment.rb обещает и выполняет другие фрагменты кода (аналогично тому, как @rorra проиллюстрировал другие примеры в своем ответе).

Я не могу удалить HTML - потому что хочу правильно его проанализировать (т.е. убедиться, что интервал и т. Д. Включен правильно). Единственное отличие, которое я хочу, это получить подсветку синтаксиса для кода, представленного в тексте вопроса.

1 ответ

Что-то еще можно добавить, чтобы воспроизвести проблему? Понравилось содержание question.body?

Если я делаю что-то подобное на контроллере:

class HomeController < ApplicationController
  def index
    @data = <<EOF
~~~ cpp
#include <fstream.h>

int main (int argc, char *argv[]) {
return(0);
}
~~~
EOF
  end
end

и на вид:

<pre class="lang-cpp prettyprint-override">
  <%= markdown @data %>
</pre>

это работает совершенно нормально, я могу увидеть разобранный код без каких-либо проблем. Что такое содержание question.body? И можете ли вы сохранить содержимое веб-страницы (из вашего браузера) и сохранить его в суть, чтобы мы могли отладить?

Спасибо


Что касается вашего последнего комментария, это простая проблема CSS, в вашей таблице стилей вы можете добавить:

.code {
  color: #DD1144 !important;
}

и это будет работать, проблема в том, что у вас есть правило CSS, написанное так:

pre .code {
  color: inherited;
}

и это использует цвет #333333 унаследованный от класса тела


Вот экран того, как это выглядит с обновленным css:

введите описание изображения здесь


Пример приложения с вашим кодом работает совершенно нормально, мне понадобится пример приложения с кодом приложения или пример кода, в котором мы можем воспроизвести возникшую проблему (не имея правильных таблиц CSS / стилей для отформатированного кода).

Это пример того, как выглядит пример приложения:

введите описание изображения здесь


введите описание изображения здесь


Окончательное редактирование, проблема не в библиотеке, и не в том, как вы рендерите вопрос, а в том, какой контент вы рендерите, проверьте текст ваших вопросов, это один из вопросов, которые я получил с телом, которое фактически отображается как библиотека должна отображать, но не отображать так, как вы ожидаете:)

@data = <<EOF
    <p>I've been messing around with <a href="http://en.wikipedia.org/wiki/JSON">JSON</a> for some time, just pushing it out as text and it hasn't hurt anybody (that I know of), but I'd like to start doing things properly.</p>

    <p>I have seen <em>so</em> many purported "standards" for the JSON content type:</p>

    <pre><code>application/json
    application/x-javascript
    text/javascript
    text/x-javascript
    text/x-json
    </code></pre>

    <p>But which is correct, or best? I gather that there are security and browser support issues varying between them.</p>

    <p>I know there's a similar question, <em><a href="http://stackru.com/questions/404470/what-mime-type-if-json-is-being-returned-by-a-rest-api">What MIME type if JSON is being returned by a REST API?</a></em>, but I'd like a slightly more targeted answer.</p>
EOF

И это еще один, который я только что скопировал / вставил из stackru, который рендерится со всем выделенным синтаксисом. Вы заметили разницу? Поэтому обновите свой сканер, чтобы получить вопросы в нужном формате, и он будет работать

@data = <<EOF
Here is a piece of C++ code that shows some very peculiar performance. For some strange reason, sorting the data miraculously speeds up the code by almost 6x:

<!-- language: lang-cpp -->

    #include <algorithm>
    #include <ctime>
    #include <iostream>

    int main()
    {
        // Generate data
        const unsigned arraySize = 32768;
        int data[arraySize];

        for (unsigned c = 0; c < arraySize; ++c)
            data[c] = std::rand() % 256;

        // !!! With this, the next loop runs faster
        std::sort(data, data + arraySize);

        // Test
        clock_t start = clock();
        long long sum = 0;

        for (unsigned i = 0; i < 100000; ++i)
        {
            // Primary loop
            for (unsigned c = 0; c < arraySize; ++c)
            {
                if (data[c] >= 128)
                    sum += data[c];
            }
        }

        double elapsedTime = static_cast<double>(clock() - start) / CLOCKS_PER_SEC;

        std::cout << elapsedTime << std::endl;
        std::cout << "sum = " << sum << std::endl;
    }

 - Without `std::sort(data, data + arraySize);`, the code runs in **11.54** seconds.
 - With the sorted data, the code runs in **1.93** seconds.

----------

Initially I thought this might be just a language or compiler anomaly. So I tried it in Java:

<!-- language: lang-java -->

    import java.util.Arrays;
    import java.util.Random;

    public class Main
    {
        public static void main(String[] args)
        {
            // Generate data
            int arraySize = 32768;
            int data[] = new int[arraySize];

            Random rnd = new Random(0);
            for (int c = 0; c < arraySize; ++c)
                data[c] = rnd.nextInt() % 256;

            // !!! With this, the next loop runs faster
            Arrays.sort(data);

            // Test
            long start = System.nanoTime();
            long sum = 0;

            for (int i = 0; i < 100000; ++i)
            {
                // Primary loop
                for (int c = 0; c < arraySize; ++c)
                {
                    if (data[c] >= 128)
                        sum += data[c];
                }
            }

            System.out.println((System.nanoTime() - start) / 1000000000.0);
            System.out.println("sum = " + sum);
        }
    }

with a similar but less extreme result.

----------

My first thought was that sorting brings the data into cache, but my next thought was how silly that is because the array was just generated.

What is going on? Why is a sorted array faster than an unsorted array? The code is summing up some independent terms, the order should not matter.

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