2017-01-06 4 views
0

В принципе, у меня есть веб-сервер, где я заявил в своем nginx conf, чтобы показать каждый .cpp как обычный текст, но я хочу сделать подсветку синтаксиса для большей удобочитаемости.Синтаксическая подсветка на nginx для каждого cpp без взаимодействия с человеком

Любая идея, как я мог продолжить?

Я хочу использовать подсветку Google, поэтому любая идея о том, как вставить перед html-файлом до и после каждого .cpp, будет достаточной.

Я думал и пробовал в далеком прошлом, используя теги заголовка и нижнего колонтитула в nginx conf, без везения. Спасибо заранее!

ура!

+0

Хотя, вероятно, это может быть сделано с помощью веб-сервера, обычно это не так. Вместо этого обычно это зависит от структуры или системы доставки контента. –

+0

На сервере нет рамки доставки контента. Для просмотра файлов работает только fancyindex. – Hoszy

+0

Nginx сам не может делать синтаксис hilighting, вы должны либо использовать язык на стороне сервера, как PHP, чтобы служить html-файлу с синтаксическим hilight или использовать js-плагин для hilight на стороне клиента. –

ответ

0

Как уже указывалось, Nginx не подходит для создания HTML-документов сам по себе. Обычно это работа для серверного языка обработки, такого как PHP или Perl. Однако есть несколько способов решения проблемы исключительно с помощью Nginx.

Первым очевидным выбором было бы использовать серверный язык обработки из Nginx. Существует, по меньшей мере, три дополнительных модуля для трех разных языков (Perl, Lua и диалект Javascript), которые могут быть использованы для этого.

Проблема с этим подходом заключается в том, что эти модули редко доступны по умолчанию, и во многих случаях вам придется создавать Nginx вручную, чтобы включить любой из них. Иногда это может быть болезненно, потому что, как только вы получите свою собственную сборку Nginx, вам придется самостоятельно ее поддерживать и обновлять.

Существует, однако, еще один вариант, который включает в себя SSI. Это может быть не самое приятное решение, но оно будет работать. И в отличие от вышеупомянутых модулей, поддержка SSI поставляется практически с каждым дистрибутивом Nginx. Моя ставка заключается в том, что ваш Nginx может сделать SSI из коробки без необходимости компилировать что-либо.

Таким образом, конфигурация выглядит следующим образом:

# Define a special virtual location for your cpp files 
location ~* \.(cpp|h)$ { 
    # Unless a GET parameter 'raw' is set with 'yes' 
    if ($arg_raw = 'yes') { 
     break; 
    } 

    # Redirect all the requests for *.cpp and *.h files to another location @js 
    try_files @js @js; 
} 

location @js { 
    ssi on;     # Enable SSI in this location 
    default_type text/html; # Tell the browser that what is returned is HTML 

    # Generate a suitable HTML document with an SSI insertion 
    return 200 '<!DOCTYPE html> 
       <link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.9.0/styles/default.min.css"> 
       <script src="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.9.0/highlight.min.js"></script> 
       <script>hljs.initHighlightingOnLoad();</script> 
       <pre><code class="cpp"><!--# include virtual="$uri?raw=yes" --></code></pre>'; 
} 

Теперь вот что происходит, если вы запрашиваете некоторые * .cpp файл в браузере:

  1. Запрос идет на первом месте, потому что URI заканчивается cpp.
  2. Затем он перенаправляется во второе место @js, потому что в вашем запросе нет параметра GET raw.
  3. Во втором месте шаблон SSI генерируется return, а затем немедленно обрабатывается двигателем SSI из-за ssi on.
  4. include virtual="$uri?raw=yes" указывает механизму SSI сделать другой запрос (подзапрос) из Nginx в первоначально запрошенный файл (внутренняя переменная $uri хранит исходный URI, то есть веб-путь к вашему файлу cpp). Разница между запросом вашего браузера и подзапросом, сделанным Nginx, - ?raw=yes.
  5. Подзапрос снова обрабатывается первым местоположением, но он никогда не переходит ко второму из-за параметра GET raw. В этом случае исходное содержимое файла cpp возвращается как ответ на подзапрос.
  6. Механизм SSI объединяет этот ответ с остальной частью шаблона и возвращает результат браузеру.Кроме того, default_type сообщает браузеру, что он отображает результат как документ HTML.

Вы можете увидеть пример вывода here. Я использовал this подсветку библиотеки для этого примера. Вы можете изменить его с помощью того, что вы предпочитаете, просто изменяя шаблон SSI.

+0

Это прекрасно. Точно соответствует моим потребностям! Танки Иван! :) – Hoszy

Смежные вопросы