Почему 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 <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;
}
</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 < 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);
}
}
</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