Подсветка синтаксиса на nginx для каждого cpp без участия человека

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

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

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

В далеком прошлом я думал и пытался использовать теги header и footer в nginx conf, но безуспешно. Заранее спасибо!

ура!

1 ответ

Решение

Как уже указывалось, 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 генерируется с возвратом и затем немедленно обрабатывается механизмом SSI из-за ssi on,
  4. include virtual="$uri?raw=yes" говорит движку SSI сделать еще один запрос (подзапрос) из Nginx к первоначально запрошенному файлу (внутренняя переменная $uri хранит исходный URI, то есть веб-путь к вашему файлу cpp). Разница между запросом вашего браузера и вложенным запросом, сделанным Nginx, заключается в ?raw=yes,
  5. Подзапрос снова обрабатывается первым местоположением, но он никогда не переходит во второе из-за raw ПОЛУЧИТЬ параметр. В этом случае необработанное содержимое файла cpp возвращается как ответ на подзапрос.
  6. Механизм SSI объединяет этот ответ с остальной частью шаблона и возвращает результат в браузер. Кроме того, default_type указывает браузеру отображать результат в виде HTML-документа.

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

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